AI CMO Agent Your AI Chief Marketing Officer. Enter a website URL and get a full marketing team deployed across every growth channel. This skill uses 6 specialized agents that work in parallel across SEO, GEO (AI search visibility), content writing, Reddit, Hacker News, and X/Twitter — then synthesizes everything into a prioritized action plan with ready-to-publish content. What It Produces | Output | Description | |--------|-------------| | CMO Dashboard | Terminal-formatted overview with scores, opportunities, and action items | | SEO Audit | Page-by-page technical audit with exact HTML fix…

, urlparse(p.get(\"full_url\", \"\")).path.lower())\n for p in ok_pages\n )\n score += 2 if clean else 0\n\n return min(score, 100), 100, issues\n\n\ndef compute_accessibility_score(pages: list) -> int:\n ok = [p for p in pages if p.get(\"_parser\")]\n if not ok:\n return 0\n score = 0\n total_img = sum(p.get(\"images_total\", 0) for p in ok)\n alt_img = sum(p.get(\"images_with_alt\", 0) for p in ok)\n score += int(20 * (alt_img / max(total_img, 1))) # Image alt (20)\n\n # Form labels (15)\n total_inputs = sum(p[\"_parser\"].form_inputs for p in ok if p.get(\"_parser\"))\n total_labels = sum(p[\"_parser\"].form_labels for p in ok if p.get(\"_parser\"))\n if total_inputs > 0:\n score += int(15 * min(total_labels / total_inputs, 1))\n else:\n score += 15\n\n # Heading structure (10)\n good = sum(1 for p in ok if p.get(\"h1\"))\n score += int(10 * good / len(ok))\n\n # Lang attr (10)\n with_lang = sum(1 for p in ok if p.get(\"_parser\") and p[\"_parser\"].html_lang)\n score += int(10 * with_lang / len(ok))\n\n # Link text quality (10) - approximate: non-empty anchors\n score += 10 # simplified\n\n # ARIA landmarks (10)\n with_aria = sum(1 for p in ok if p.get(\"_parser\") and p[\"_parser\"].has_aria_landmarks)\n score += int(10 * with_aria / len(ok))\n\n # Table headers (5)\n tables = sum(p[\"_parser\"].table_count for p in ok if p.get(\"_parser\"))\n th = sum(p[\"_parser\"].table_with_headers for p in ok if p.get(\"_parser\"))\n if tables > 0:\n score += int(5 * min(th / tables, 1))\n else:\n score += 5\n\n # Skip nav (5)\n has_skip = any(p[\"_parser\"].has_skip_nav for p in ok if p.get(\"_parser\"))\n score += 5 if has_skip else 0\n\n # Document title (5)\n with_title = sum(1 for p in ok if p.get(\"title\"))\n score += int(5 * with_title / len(ok))\n\n # Focus visible (5) + Color-independent (5) -- static can't really check\n score += 5 # assume neutral\n\n return min(score, 100)\n\n\ndef compute_performance_score(pages: list) -> int:\n ok = [p for p in pages if p.get(\"_parser\")]\n if not ok:\n return 0\n score = 0\n\n # TTFB (25) - based on response_time_ms of homepage (first page)\n ttfb = ok[0].get(\"response_time_ms\", 9999)\n if ttfb \u003c 200:\n score += 25\n elif ttfb \u003c 500:\n score += 20\n elif ttfb \u003c 1000:\n score += 15\n elif ttfb \u003c 2000:\n score += 8\n else:\n score += 2\n\n # Page weight (25)\n avg_size = sum(p.get(\"page_size_bytes\", 0) for p in ok) / len(ok)\n if avg_size \u003c 100_000:\n score += 25\n elif avg_size \u003c 500_000:\n score += 20\n elif avg_size \u003c 1_000_000:\n score += 15\n elif avg_size \u003c 3_000_000:\n score += 8\n else:\n score += 2\n\n # Resource count (15) - inline scripts + styles as proxy\n avg_resources = sum(\n (p[\"_parser\"].inline_script_count + p[\"_parser\"].inline_style_count)\n for p in ok if p.get(\"_parser\")\n ) / len(ok)\n if avg_resources \u003c 5:\n score += 15\n elif avg_resources \u003c 15:\n score += 10\n elif avg_resources \u003c 30:\n score += 5\n else:\n score += 2\n\n # Image dimensions (15) - can't really check from static, give neutral\n score += 8\n\n # Compression (10) - check content-encoding header\n compressed = sum(\n 1 for p in ok\n if \"gzip\" in p.get(\"_hdrs\", {}).get(\"content-encoding\", \"\")\n or \"br\" in p.get(\"_hdrs\", {}).get(\"content-encoding\", \"\")\n )\n score += int(10 * compressed / len(ok))\n\n # Caching (10)\n cached = sum(\n 1 for p in ok if p.get(\"_hdrs\", {}).get(\"cache-control\")\n )\n score += int(10 * cached / len(ok))\n\n return min(score, 100)\n\n\ndef compute_best_practices_score(pages: list, start_url_https: bool) -> int:\n ok = [p for p in pages if p.get(\"_parser\")]\n if not ok:\n return 0\n score = 0\n\n # HTTPS (20)\n score += 20 if start_url_https else 0\n\n # Security headers (15) -- average across pages\n sec_pts = []\n for p in ok:\n sh = p.get(\"security_headers\", {})\n pts = sum([sh.get(\"hsts\", False), sh.get(\"x_content_type\", False),\n sh.get(\"x_frame\", False), sh.get(\"csp\", False)])\n sec_pts.append(pts)\n avg_sec = sum(sec_pts) / len(sec_pts) if sec_pts else 0\n score += int(15 * avg_sec / 4)\n\n # No mixed content (10)\n mixed = any(p[\"_parser\"].mixed_content_urls for p in ok if p.get(\"_parser\"))\n score += 0 if mixed else 10\n\n # Doctype (5)\n with_dt = sum(1 for p in ok if p.get(\"_parser\") and p[\"_parser\"].has_doctype)\n score += int(5 * with_dt / len(ok))\n\n # Charset (5)\n with_cs = sum(1 for p in ok if p.get(\"_parser\") and p[\"_parser\"].has_charset())\n score += int(5 * with_cs / len(ok))\n\n # No deprecated HTML (10)\n dep = sum(p[\"_parser\"].deprecated_tags for p in ok if p.get(\"_parser\"))\n score += 10 if dep == 0 else max(0, 10 - dep)\n\n # Image dimensions (10) -- static can't fully check, neutral\n score += 5\n\n # Valid links (10)\n # already have broken links info -- give points if none\n score += 10 # adjusted at caller level if broken links exist\n\n # Favicon (5)\n has_fav = any(p[\"_parser\"].favicon() for p in ok if p.get(\"_parser\"))\n score += 5 if has_fav else 0\n\n # Robots meta (5) -- no blanket noindex\n noindex = any(\n \"noindex\" in (p[\"_parser\"].robots_meta() if p.get(\"_parser\") else \"\")\n for p in ok\n )\n score += 5 if not noindex else 0\n\n # No document.write (5)\n dw = any(p[\"_parser\"].has_document_write for p in ok if p.get(\"_parser\"))\n score += 0 if dw else 5\n\n return min(score, 100)\n\n\ndef score_label(s: int) -> str:\n if s >= 90:\n return \"Excellent\"\n if s >= 70:\n return \"Good\"\n if s >= 50:\n return \"Needs Improvement\"\n return \"Poor\"\n\n\n# ---------------------------------------------------------------------------\n# Tier 2 -- PageSpeed Insights\n# ---------------------------------------------------------------------------\n\ndef fetch_psi_data(url: str, api_key: str, timeout: int = 60):\n \"\"\"Call Google PageSpeed Insights API and return parsed results.\"\"\"\n endpoint = (\n f\"https://www.googleapis.com/pagespeedonline/v5/runPagespeed\"\n f\"?url={url}&key={api_key}&strategy=mobile\"\n f\"&category=performance&category=accessibility\"\n f\"&category=best-practices&category=seo\"\n )\n status, _, body, _, _, err = fetch_url(endpoint, timeout=timeout)\n if err or status != 200:\n return None\n\n try:\n data = json.loads(body)\n except json.JSONDecodeError:\n return None\n\n lr = data.get(\"lighthouseResult\", {})\n cats = lr.get(\"categories\", {})\n result = {\n \"scores\": {},\n \"core_web_vitals\": {},\n }\n for key in (\"performance\", \"accessibility\", \"best-practices\", \"seo\"):\n cat = cats.get(key, {})\n s = cat.get(\"score\")\n result[\"scores\"][key] = int(s * 100) if s is not None else None\n\n # CrUX data\n lexp = data.get(\"loadingExperience\", {}).get(\"metrics\", {})\n cwv = {}\n lcp = lexp.get(\"LARGEST_CONTENTFUL_PAINT_MS\", {}).get(\"percentile\")\n cwv[\"lcp_seconds\"] = round(lcp / 1000, 2) if lcp else None\n tbt = lexp.get(\"EXPERIMENTAL_INTERACTION_TO_NEXT_PAINT\", {}).get(\"percentile\")\n cwv[\"tbt_ms\"] = tbt\n cls_val = lexp.get(\"CUMULATIVE_LAYOUT_SHIFT_SCORE\", {}).get(\"percentile\")\n cwv[\"cls_score\"] = round(cls_val / 100, 2) if cls_val else None\n result[\"core_web_vitals\"] = cwv\n\n return result\n\n\n# ---------------------------------------------------------------------------\n# Tier 3 -- Local Lighthouse\n# ---------------------------------------------------------------------------\n\ndef lighthouse_available() -> bool:\n return shutil.which(\"lighthouse\") is not None or shutil.which(\"npx\") is not None\n\n\ndef run_lighthouse(url: str, timeout: int = 120):\n \"\"\"Run lighthouse CLI and parse JSON output.\"\"\"\n cmd_base = [\"lighthouse\"] if shutil.which(\"lighthouse\") else [\"npx\", \"lighthouse\"]\n cmd = cmd_base + [\n url,\n \"--output=json\",\n \"--chrome-flags=--headless --no-sandbox\",\n \"--quiet\",\n ]\n try:\n proc = subprocess.run(cmd, capture_output=True, text=True, timeout=timeout)\n if proc.returncode != 0:\n return None\n data = json.loads(proc.stdout)\n cats = data.get(\"categories\", {})\n scores = {}\n for key in (\"performance\", \"accessibility\", \"best-practices\", \"seo\"):\n cat = cats.get(key, {})\n s = cat.get(\"score\")\n scores[key] = int(s * 100) if s is not None else None\n audits = data.get(\"audits\", {})\n cwv = {}\n lcp = audits.get(\"largest-contentful-paint\", {}).get(\"numericValue\")\n cwv[\"lcp_seconds\"] = round(lcp / 1000, 2) if lcp else None\n tbt = audits.get(\"total-blocking-time\", {}).get(\"numericValue\")\n cwv[\"tbt_ms\"] = int(tbt) if tbt else None\n cls_val = audits.get(\"cumulative-layout-shift\", {}).get(\"numericValue\")\n cwv[\"cls_score\"] = round(cls_val, 3) if cls_val is not None else None\n return {\"scores\": scores, \"core_web_vitals\": cwv}\n except (subprocess.TimeoutExpired, FileNotFoundError, json.JSONDecodeError):\n return None\n\n\n# ---------------------------------------------------------------------------\n# Report generation\n# ---------------------------------------------------------------------------\n\ndef build_report(start_url: str, pages: list, broken_links: list,\n robots_present: bool, robots_text: str,\n sitemap_urls: list, crawl_duration: float,\n psi_data, lh_data, psi_used: bool, lh_available: bool) -> dict:\n parsed = urlparse(start_url)\n start_https = parsed.scheme == \"https\"\n ok_pages = [p for p in pages if p.get(\"_parser\")]\n\n seo_score, seo_max, seo_issues = compute_seo_score(\n pages, robots_present, robots_text, sitemap_urls, start_https, broken_links)\n a11y_score = compute_accessibility_score(pages)\n perf_score = compute_performance_score(pages)\n bp_score = compute_best_practices_score(pages, start_https)\n\n # Override with PSI / Lighthouse if available\n cwv = {\"available\": False, \"lcp_seconds\": None, \"tbt_ms\": None,\n \"cls_score\": None, \"source\": None}\n method_seo = \"static_analysis\"\n method_a11y = \"static_analysis_partial\"\n method_perf = \"estimated\"\n method_bp = \"static_analysis\"\n\n enhanced = psi_data or lh_data\n if enhanced:\n esc = enhanced.get(\"scores\", {})\n if esc.get(\"seo\") is not None:\n seo_score = esc[\"seo\"]\n method_seo = \"pagespeed_insights\" if psi_data else \"lighthouse\"\n if esc.get(\"accessibility\") is not None:\n a11y_score = esc[\"accessibility\"]\n method_a11y = \"pagespeed_insights\" if psi_data else \"lighthouse\"\n if esc.get(\"performance\") is not None:\n perf_score = esc[\"performance\"]\n method_perf = \"pagespeed_insights\" if psi_data else \"lighthouse\"\n bp_key = \"best-practices\"\n if esc.get(bp_key) is not None:\n bp_score = esc[bp_key]\n method_bp = \"pagespeed_insights\" if psi_data else \"lighthouse\"\n ecwv = enhanced.get(\"core_web_vitals\", {})\n if any(ecwv.get(k) for k in (\"lcp_seconds\", \"tbt_ms\", \"cls_score\")):\n cwv = {\n \"available\": True,\n \"lcp_seconds\": ecwv.get(\"lcp_seconds\"),\n \"tbt_ms\": ecwv.get(\"tbt_ms\"),\n \"cls_score\": ecwv.get(\"cls_score\"),\n \"source\": \"pagespeed_insights\" if psi_data else \"lighthouse\",\n }\n\n # Aggregate SEO health\n total_img = sum(p.get(\"images_total\", 0) for p in ok_pages)\n alt_img = sum(p.get(\"images_with_alt\", 0) for p in ok_pages)\n\n missing_desc = []\n for p in ok_pages:\n if not p.get(\"meta_description\"):\n missing_desc.append({\"page\": p[\"url\"], \"issue\": \"missing\"})\n\n heading_issues = []\n for p in ok_pages:\n parser = p.get(\"_parser\")\n if parser:\n levels = [lv for lv, _ in parser.headings]\n if levels and levels[0] != 1:\n heading_issues.append({\"page\": p[\"url\"], \"issue\": \"first heading not h1\"})\n\n schema_types = []\n for p in ok_pages:\n if p.get(\"_parser\"):\n schema_types.extend(p[\"_parser\"].parsed_schema_types())\n schema_types = sorted(set(schema_types))\n\n first_parser = ok_pages[0][\"_parser\"] if ok_pages and ok_pages[0].get(\"_parser\") else None\n first_hdrs = ok_pages[0].get(\"_hdrs\", {}) if ok_pages else {}\n\n report = {\n \"audit_metadata\": {\n \"url\": start_url,\n \"audit_date\": datetime.now(timezone.utc).strftime(\"%Y-%m-%dT%H:%M:%SZ\"),\n \"pages_crawled\": len([p for p in pages if p.get(\"status_code\") == 200]),\n \"pages_failed\": len([p for p in pages if p.get(\"status_code\", 0) != 200]),\n \"crawl_duration_seconds\": round(crawl_duration, 1),\n \"tool_version\": TOOL_VERSION,\n \"lighthouse_available\": lh_available,\n \"psi_api_used\": psi_used,\n },\n \"scores\": {\n \"seo\": {\"score\": seo_score, \"max\": seo_max, \"label\": score_label(seo_score),\n \"method\": method_seo},\n \"accessibility\": {\n \"score\": a11y_score, \"max\": 100, \"label\": score_label(a11y_score),\n \"method\": method_a11y,\n \"caveat\": \"HTML-level checks only. Run Lighthouse for full assessment.\"\n if \"static\" in method_a11y else None,\n },\n \"performance\": {\n \"score\": perf_score, \"max\": 100, \"label\": score_label(perf_score),\n \"method\": method_perf,\n \"caveat\": \"Based on server metrics only. Use --psi-key for accurate scores.\"\n if method_perf == \"estimated\" else None,\n },\n \"best_practices\": {\n \"score\": bp_score, \"max\": 100, \"label\": score_label(bp_score),\n \"method\": method_bp,\n },\n },\n \"core_web_vitals\": cwv,\n \"seo_health\": {\n \"meta_title\": {\n \"pages_present\": len([p for p in ok_pages if p.get(\"title\")]),\n \"pages_total\": len(ok_pages),\n \"issues\": [{\"page\": p[\"url\"], \"issue\": \"missing\"} for p in ok_pages if not p.get(\"title\")],\n },\n \"meta_description\": {\n \"pages_present\": len([p for p in ok_pages if p.get(\"meta_description\")]),\n \"pages_total\": len(ok_pages),\n \"issues\": missing_desc,\n },\n \"mobile_friendly\": {\n \"viewport_meta\": any(p.get(\"has_viewport\") for p in ok_pages),\n \"status\": \"likely_mobile_friendly\" if any(p.get(\"has_viewport\") for p in ok_pages) else \"unknown\",\n },\n \"image_alt_tags\": {\n \"with_alt\": alt_img,\n \"without_alt\": total_img - alt_img,\n \"total\": total_img,\n \"coverage_percent\": round(alt_img / total_img * 100, 1) if total_img else 100.0,\n },\n \"heading_hierarchy\": {\n \"pages_with_issues\": len(heading_issues),\n \"issues\": heading_issues,\n },\n \"https\": {\n \"uses_https\": start_https,\n \"redirects\": start_https,\n \"hsts\": first_hdrs.get(\"strict-transport-security\") is not None if first_hdrs else False,\n },\n \"robots_txt\": {\n \"present\": robots_present,\n \"issues\": [] if robots_present else [\"not_found\"],\n },\n \"sitemap_xml\": {\n \"present\": bool(sitemap_urls),\n \"urls_count\": len(sitemap_urls),\n },\n \"structured_data\": {\n \"present\": bool(schema_types),\n \"types\": schema_types,\n },\n \"canonical_urls\": {\n \"pages_with_canonical\": len([p for p in ok_pages if p.get(\"has_canonical\")]),\n \"pages_total\": len(ok_pages),\n },\n \"open_graph\": {\n \"pages_with_og\": len([p for p in ok_pages if p.get(\"has_og_tags\")]),\n \"pages_total\": len(ok_pages),\n },\n },\n \"page_details\": [],\n \"broken_links\": broken_links,\n \"issues_summary\": seo_issues,\n \"recommendations\": [],\n }\n\n # Build page_details (strip internal objects)\n for p in pages:\n detail = {k: v for k, v in p.items() if not k.startswith(\"_\") and k != \"full_url\" and k != \"error\"}\n if p.get(\"error\"):\n detail[\"issues\"] = detail.get(\"issues\", []) + [p[\"error\"]]\n report[\"page_details\"].append(detail)\n\n # Generate recommendations\n recs = report[\"recommendations\"]\n if not robots_present:\n recs.append(\"Add a robots.txt file to guide search engine crawlers.\")\n if not sitemap_urls:\n recs.append(\"Create and submit an XML sitemap to improve crawl coverage.\")\n if missing_desc:\n recs.append(f\"Add meta descriptions to {len(missing_desc)} page(s) missing them.\")\n if total_img - alt_img > 0:\n recs.append(f\"Add alt text to {total_img - alt_img} image(s) for accessibility and SEO.\")\n if not start_https:\n recs.append(\"Migrate to HTTPS for security and SEO benefits.\")\n if not schema_types:\n recs.append(\"Add structured data (JSON-LD) to help search engines understand your content.\")\n if broken_links:\n recs.append(f\"Fix {len(broken_links)} broken link(s) found during the audit.\")\n any_spa = any(p.get(\"js_rendering_required\") for p in pages)\n if any_spa:\n recs.append(\"JavaScript rendering detected. Consider server-side rendering for better SEO.\")\n report[\"issues_summary\"][\"warnings\"].append(\"SPA/JS-rendered content detected on some pages.\")\n if not any(p.get(\"has_og_tags\") for p in ok_pages):\n recs.append(\"Add Open Graph meta tags to improve social media sharing previews.\")\n\n return report\n\n\n# ---------------------------------------------------------------------------\n# Markdown output\n# ---------------------------------------------------------------------------\n\ndef report_to_markdown(report: dict) -> str:\n lines = []\n meta = report[\"audit_metadata\"]\n scores = report[\"scores\"]\n\n lines.append(f\"# Site Audit Report: {meta['url']}\")\n lines.append(f\"*Generated: {meta['audit_date']} | Pages crawled: {meta['pages_crawled']}*\\n\")\n\n lines.append(\"## Scores\\n\")\n lines.append(\"| Category | Score | Label | Method |\")\n lines.append(\"|----------|-------|-------|--------|\")\n for cat, data in scores.items():\n lines.append(f\"| {cat.replace('_', ' ').title()} | {data['score']}/{data['max']} | {data['label']} | {data['method']} |\")\n\n cwv = report.get(\"core_web_vitals\", {})\n if cwv.get(\"available\"):\n lines.append(\"\\n## Core Web Vitals\\n\")\n lines.append(f\"- **LCP:** {cwv.get('lcp_seconds', 'N/A')}s\")\n lines.append(f\"- **TBT:** {cwv.get('tbt_ms', 'N/A')}ms\")\n lines.append(f\"- **CLS:** {cwv.get('cls_score', 'N/A')}\")\n\n health = report.get(\"seo_health\", {})\n lines.append(\"\\n## SEO Health\\n\")\n lines.append(f\"- **Titles:** {health['meta_title']['pages_present']}/{health['meta_title']['pages_total']} pages\")\n lines.append(f\"- **Descriptions:** {health['meta_description']['pages_present']}/{health['meta_description']['pages_total']} pages\")\n lines.append(f\"- **Image alt:** {health['image_alt_tags']['coverage_percent']}% coverage\")\n lines.append(f\"- **HTTPS:** {'Yes' if health['https']['uses_https'] else 'No'}\")\n lines.append(f\"- **Sitemap:** {'Found ({} URLs)'.format(health['sitemap_xml']['urls_count']) if health['sitemap_xml']['present'] else 'Not found'}\")\n lines.append(f\"- **Structured data:** {', '.join(health['structured_data']['types']) if health['structured_data']['types'] else 'None'}\")\n\n broken = report.get(\"broken_links\", [])\n if broken:\n lines.append(f\"\\n## Broken Links ({len(broken)})\\n\")\n for bl in broken[:20]:\n lines.append(f\"- `{bl['url']}` (from {bl['source']}) - HTTP {bl['status']}\")\n\n recs = report.get(\"recommendations\", [])\n if recs:\n lines.append(\"\\n## Recommendations\\n\")\n for i, r in enumerate(recs, 1):\n lines.append(f\"{i}. {r}\")\n\n issues = report.get(\"issues_summary\", {})\n crit = issues.get(\"critical\", [])\n if crit:\n lines.append(\"\\n## Critical Issues\\n\")\n for c in crit:\n lines.append(f\"- {c}\")\n\n lines.append(\"\")\n return \"\\n\".join(lines)\n\n\n# ---------------------------------------------------------------------------\n# Main\n# ---------------------------------------------------------------------------\n\ndef main():\n parser = argparse.ArgumentParser(\n description=\"Technical SEO & web quality audit tool\",\n formatter_class=argparse.RawDescriptionHelpFormatter,\n epilog=\"\"\"\nExamples:\n # Basic audit\n python3 site_audit.py --url \"https://example.com\"\n\n # Deeper crawl with more pages\n python3 site_audit.py -u example.com -p 25 -d 3 -o deep_audit.json\n\n # With PageSpeed Insights API\n python3 site_audit.py -u https://example.com --psi-key YOUR_API_KEY\n\n # With local Lighthouse\n python3 site_audit.py -u https://example.com --lighthouse\n\n # Markdown + JSON output\n python3 site_audit.py -u https://example.com -f both -o report.json -v\n \"\"\",\n )\n parser.add_argument(\"-u\", \"--url\", required=True,\n help=\"Target URL (required). Auto-prepends https:// if missing.\")\n parser.add_argument(\"-o\", \"--output\", default=\"site_audit.json\",\n help=\"Output file path (default: site_audit.json)\")\n parser.add_argument(\"-f\", \"--format\", default=\"json\", choices=[\"json\", \"markdown\", \"both\"],\n help=\"Output format: json (default), markdown, both\")\n parser.add_argument(\"-p\", \"--max-pages\", type=int, default=10,\n help=\"Max pages to crawl (default: 10, max: 50)\")\n parser.add_argument(\"-d\", \"--depth\", type=int, default=2,\n help=\"Max crawl depth from start URL (default: 2)\")\n parser.add_argument(\"--lighthouse\", action=\"store_true\",\n help=\"Enable Lighthouse if CLI available\")\n parser.add_argument(\"--psi-key\", default=None,\n help=\"Google PageSpeed Insights API key\")\n parser.add_argument(\"--timeout\", type=int, default=30,\n help=\"Request timeout in seconds (default: 30)\")\n parser.add_argument(\"-v\", \"--verbose\", action=\"store_true\",\n help=\"Print progress to stderr\")\n\n args = parser.parse_args()\n\n global _verbose\n _verbose = args.verbose\n\n # Normalize inputs\n url = args.url.strip()\n if not url.startswith((\"http://\", \"https://\")):\n url = \"https://\" + url\n max_pages = max(1, min(args.max_pages, 50))\n max_depth = max(0, min(args.depth, 10))\n timeout = max(5, args.timeout)\n psi_key = args.psi_key or os.environ.get(\"GOOGLE_PSI_API_KEY\")\n\n log(f\"Starting audit of {url}\")\n t_start = time.monotonic()\n\n # Step 1: robots.txt\n log(\"Fetching robots.txt ...\")\n robots, crawl_delay, robots_text = fetch_robots(url, timeout=timeout)\n robots_present = robots is not None\n rate = max(crawl_delay or 1.0, 1.0)\n\n # Step 2: sitemap\n log(\"Fetching sitemap.xml ...\")\n sitemap_urls = fetch_sitemap(url, timeout=timeout)\n log(f\" Found {len(sitemap_urls)} URLs in sitemap\")\n\n # Step 3: Crawl\n log(f\"Crawling (max {max_pages} pages, depth {max_depth}) ...\")\n pages, broken_links = crawl_site(\n url, max_pages, max_depth, timeout, robots, rate, sitemap_urls)\n\n # Step 3b: check a sample of external links\n log(\"Checking external links ...\")\n ext_broken = check_external_links(pages, timeout=min(timeout, 10))\n broken_links.extend(ext_broken)\n\n crawl_duration = time.monotonic() - t_start\n\n # Step 4: Tier 2 - PSI\n psi_data = None\n psi_used = False\n if psi_key:\n log(\"Fetching PageSpeed Insights data ...\")\n psi_data = fetch_psi_data(url, psi_key, timeout=60)\n psi_used = psi_data is not None\n if not psi_used:\n print(\"Warning: PageSpeed Insights API call failed\", file=sys.stderr)\n\n # Step 5: Tier 3 - Lighthouse\n lh_data = None\n lh_avail = lighthouse_available()\n if args.lighthouse and lh_avail:\n log(\"Running Lighthouse (this may take a minute) ...\")\n lh_data = run_lighthouse(url, timeout=120)\n if not lh_data:\n print(\"Warning: Lighthouse run failed\", file=sys.stderr)\n elif args.lighthouse and not lh_avail:\n print(\"Warning: --lighthouse requested but neither lighthouse nor npx found in PATH\",\n file=sys.stderr)\n\n # Build report\n report = build_report(\n url, pages, broken_links, robots_present, robots_text,\n sitemap_urls, crawl_duration, psi_data, lh_data, psi_used, lh_avail)\n\n # Write output\n output_path = Path(args.output)\n if args.format in (\"json\", \"both\"):\n with open(output_path, \"w\") as f:\n json.dump(report, f, indent=2)\n print(f\"Audit saved to: {output_path}\", file=sys.stderr)\n\n if args.format in (\"markdown\", \"both\"):\n md_path = output_path.with_suffix(\".md\") if args.format == \"both\" else output_path\n md_content = report_to_markdown(report)\n with open(md_path, \"w\") as f:\n f.write(md_content)\n print(f\"Markdown report saved to: {md_path}\", file=sys.stderr)\n\n # Summary to stderr\n s = report[\"scores\"]\n print(f\"\\nAudit complete for {url}\", file=sys.stderr)\n print(f\" SEO: {s['seo']['score']}/100 ({s['seo']['label']})\", file=sys.stderr)\n print(f\" Accessibility: {s['accessibility']['score']}/100 ({s['accessibility']['label']})\", file=sys.stderr)\n print(f\" Performance: {s['performance']['score']}/100 ({s['performance']['label']})\", file=sys.stderr)\n print(f\" Best Practices: {s['best_practices']['score']}/100 ({s['best_practices']['label']})\", file=sys.stderr)\n print(f\" Pages crawled: {report['audit_metadata']['pages_crawled']}\", file=sys.stderr)\n print(f\" Duration: {report['audit_metadata']['crawl_duration_seconds']}s\", file=sys.stderr)\n\n\nif __name__ == \"__main__\":\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":53048,"content_sha256":"f8a10f6e4a9d29cf7358baa383b9984842d9e6a7da6468cb7db6ab1d03913915"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"AI CMO Agent","type":"text"}]},{"type":"paragraph","content":[{"text":"Your AI Chief Marketing Officer. Enter a website URL and get a full marketing team deployed across every growth channel.","type":"text"}]},{"type":"paragraph","content":[{"text":"This skill uses 6 specialized agents","type":"text","marks":[{"type":"strong"}]},{"text":" that work in parallel across SEO, GEO (AI search visibility), content writing, Reddit, Hacker News, and X/Twitter — then synthesizes everything into a prioritized action plan with ready-to-publish content.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"What It Produces","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Output","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Description","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"CMO Dashboard","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Terminal-formatted overview with scores, opportunities, and action items","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"SEO Audit","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Page-by-page technical audit with exact HTML fix snippets","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"GEO Analysis","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"AI search visibility assessment with schema markup code","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Full Articles","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Complete SEO-optimized articles ready to publish (1500-3000 words)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Reddit Comments","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Copy-paste-ready comments for specific active threads","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"HN Submission","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Show HN post + founder comment + objection responses","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Tweet Threads","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Complete threads + standalone tweets + 7-day calendar","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Competitor Intel","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Auto-identified competitors with threat levels","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Prioritized Actions","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Top 3-5 highest-impact actions ranked by effort-to-impact ratio","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Content Cascades","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Cross-channel repurposing plan (article → thread → comments → HN post)","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"What This Replaces","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Human Role","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Typical Cost","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"What CMO Agent Covers","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Marketing Hire","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"$5,000/mo","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Strategy, coordination, cross-channel planning","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"SEO Agency","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"$4,000/mo","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Technical audit, on-page fixes, content gaps","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Content Writer","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"$1,500/mo","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Full articles, blog posts, landing page copy","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Social Media Manager","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"$1,500/mo","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Tweet threads, content calendar, engagement","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Community Manager","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"$1,000/mo","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Reddit, Hacker News, community engagement","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Total","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"$13,000/mo","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"All of the above, in one conversation","type":"text","marks":[{"type":"strong"}]}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Prerequisites","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Web access for research (WebSearch, WebFetch)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"GOOGLE_API_KEY","type":"text","marks":[{"type":"code_inline"}]},{"text":" or ","type":"text"},{"text":"GOOGLE_PSI_API_KEY","type":"text","marks":[{"type":"code_inline"}]},{"text":" — Optional, for PageSpeed Insights scores and Core Web Vitals (free from Google Cloud Console)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Lighthouse CLI — Optional, for full browser-based performance audit (","type":"text"},{"text":"npm install -g lighthouse","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Workflow","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 1: Onboarding (REQUIRED — Maximum 2 Questions)","type":"text"}]},{"type":"paragraph","content":[{"text":"⚠️ ","type":"text"},{"text":"DO NOT ask more than 2 questions. The CMO's intelligence replaces configuration.","type":"text","marks":[{"type":"strong"}]}]},{"type":"paragraph","content":[{"text":"⚠️ ","type":"text"},{"text":"Use the ","type":"text","marks":[{"type":"strong"}]},{"text":"AskUserQuestion","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" tool for each question below.","type":"text","marks":[{"type":"strong"}]}]},{"type":"paragraph","content":[{"text":"CMO Introduction + Q1: Website URL","type":"text","marks":[{"type":"strong"}]}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"\"Hi, I'm your AI CMO. Give me your website URL and I'll get to work.","type":"text"}]},{"type":"paragraph","content":[{"text":"I'll crawl your site, audit your SEO, find distribution opportunities on Reddit, Hacker News, and X, identify content gaps, and come back with a prioritized action plan and ready-to-publish content.","type":"text"}]},{"type":"paragraph","content":[{"text":"What's your website URL?","type":"text","marks":[{"type":"strong"}]},{"text":"\"","type":"text"}]}]},{"type":"paragraph","content":[{"text":"Wait for response.","type":"text","marks":[{"type":"em"}]}]},{"type":"paragraph","content":[{"text":"Q2: Additional Context (Optional)","type":"text","marks":[{"type":"strong"}]}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"\"Got it. Anything else I should know?","type":"text"}]},{"type":"paragraph","content":[{"text":"You can drop any of the following — or just say ","type":"text"},{"text":"go","type":"text","marks":[{"type":"strong"}]},{"text":" and I'll figure it out:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Competitor names or URLs","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Brand voice / tone guidelines","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Product description or docs","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Specific marketing goals","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Existing social handles (@twitter, etc.)\"","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"Wait for response. If user says \"go\" or provides nothing, proceed immediately.","type":"text","marks":[{"type":"em"}]}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"Quick Reference","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Question","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Determines","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"URL","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Everything — site crawl, SEO audit, content analysis","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Context (optional)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Brand voice, competitors, goals, social handles","type":"text"}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 2: Site Analysis & Context Gathering","type":"text"}]},{"type":"paragraph","content":[{"text":"This step runs BEFORE dispatching agents. The CMO gathers all context that agents will need.","type":"text"}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"2a: Run Site Audit","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python3 ${SKILL_PATH}/skills/cmo-agent/scripts/site_audit.py \\\n --url \"USER_URL\" \\\n --output site_audit.json \\\n --format both \\\n --max-pages 15 \\\n --depth 2 \\\n --verbose","type":"text"}]},{"type":"paragraph","content":[{"text":"If user provided a ","type":"text"},{"text":"GOOGLE_PSI_API_KEY","type":"text","marks":[{"type":"code_inline"}]},{"text":" or it's in the environment, add ","type":"text"},{"text":"--psi-key KEY","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"2b: Crawl Website Content","type":"text"}]},{"type":"paragraph","content":[{"text":"Use ","type":"text"},{"text":"WebFetch","type":"text","marks":[{"type":"strong"}]},{"text":" to pull the homepage HTML and key pages (about, pricing, features, blog). Extract:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Product name and description","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Brand voice indicators (tone, formality, messaging style)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Existing content inventory (blog posts, guides)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Pricing/offering structure","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Target audience signals","type":"text"}]}]}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"2c: Auto-Identify Competitors","type":"text"}]},{"type":"paragraph","content":[{"text":"Use ","type":"text"},{"text":"WebSearch","type":"text","marks":[{"type":"strong"}]},{"text":" to find competitors:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Search: ","type":"text"},{"text":"\"[product category] alternatives\"","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Search: ","type":"text"},{"text":"\"[product name] vs\"","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Search: ","type":"text"},{"text":"\"best [product category] tools 2026\"","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"paragraph","content":[{"text":"Extract top 3-5 competitors with URLs and positioning.","type":"text"}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"2d: Check for Existing Documents","type":"text"}]},{"type":"paragraph","content":[{"text":"Look in the working directory for:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"brand_profile.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" (from brand-research-agent)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"competitor_analysis.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" (from competitive-intel-agent)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"product_info.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" or similar product docs","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"If found, incorporate into agent context. If not, use what was gathered in 2b.","type":"text"}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"2e: Prepare Agent Context Bundle","type":"text"}]},{"type":"paragraph","content":[{"text":"Compile a context bundle that ALL agents receive:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"CONTEXT BUNDLE:\n- Website URL: [url]\n- Product: [name and description from site crawl]\n- Brand Voice: [tone indicators or user-provided guidelines]\n- Target Audience: [inferred from site or user-provided]\n- Competitors: [auto-identified or user-provided list]\n- Site Audit Summary: [key scores and issues from site_audit.py]\n- User Goals: [from Q2 or inferred — default: \"maximize growth across all channels\"]\n- Social Handles: [if provided]","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 3: Deploy 6 Specialized Agents in Parallel","type":"text"}]},{"type":"paragraph","content":[{"text":"Launch all 6 agents simultaneously, each receiving the full context bundle:","type":"text"}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"Agent 1: SEO Analyst","type":"text"}]},{"type":"paragraph","content":[{"text":"Focus: Technical SEO audit with exact fix snippets","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"Analyze the site_audit.py output plus the raw HTML.\nFor every issue found, provide the exact HTML/code fix.\nScore: SEO, Accessibility, Performance, Best Practices.","type":"text"}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"Agent 2: GEO Analyst","type":"text"}]},{"type":"paragraph","content":[{"text":"Focus: AI search visibility optimization","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"Assess how the site appears in ChatGPT, Perplexity, Google AI Overview.\nProvide exact JSON-LD schema code to add.\nIdentify content structure changes for better AI extraction.","type":"text"}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"Agent 3: Content Writer","type":"text"}]},{"type":"paragraph","content":[{"text":"Focus: Full articles and content calendar","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"Write at least one complete 1500-3000 word article.\nBuild a 4-week content calendar.\nIdentify keyword gaps and quick wins.\nInclude meta tags, heading structure, internal links.","type":"text"}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"Agent 4: Reddit Scout","type":"text"}]},{"type":"paragraph","content":[{"text":"Focus: Active threads and copy-paste comments","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"Find SPECIFIC active Reddit threads (with URLs).\nWrite complete comments for each (2-3 variations).\nIdentify subreddits to monitor with rules and risk levels.","type":"text"}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"Agent 5: Hacker News Scout","type":"text"}]},{"type":"paragraph","content":[{"text":"Focus: Show HN submission package","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"Draft a complete Show HN post with founder comment.\nPre-write 5+ objection responses.\nFind relevant active threads for comments.\nAssess content readiness for HN.","type":"text"}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"Agent 6: X Scout","type":"text"}]},{"type":"paragraph","content":[{"text":"Focus: Tweet threads, calendar, and engagement","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"Write complete tweet threads (5-12 tweets each).\nCreate 7-day content calendar.\nFind reply opportunities with influencers.\nMap relevant influencers and hashtags.","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 4: Cross-Channel Synthesis","type":"text"}]},{"type":"paragraph","content":[{"text":"After all agents complete, the CMO synthesizes outputs into a coordinated strategy.","type":"text"}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"4a: Identify Narrative Spines","type":"text"}]},{"type":"paragraph","content":[{"text":"Extract 3-5 core product stories/angles from the combined agent outputs that can be atomized across channels:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"Narrative Spine 1: \"[Core value proposition angle]\"\n → Article: \"[Full article from content-writer]\"\n → Thread: \"[Tweet thread derived from article]\"\n → Reddit: \"[Comments referencing the article/product]\"\n → HN: \"[Show HN post if technically relevant]\"\n\nNarrative Spine 2: \"[Technical differentiation angle]\"\n → Article: \"[Technical deep-dive]\"\n → Thread: \"[Thread about the technical approach]\"\n → HN: \"[Primary Show HN angle]\"","type":"text"}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"4b: Create Content Cascades","type":"text"}]},{"type":"paragraph","content":[{"text":"For each narrative spine, define the publishing sequence:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"Day 1: Publish the SEO article on the blog\nDay 1: Submit to Hacker News (if Tuesday-Thursday, 8-10am ET)\nDay 1-2: Post the Twitter thread with link to article\nDay 2-3: Drop Reddit comments in relevant active threads\nDay 3-7: Drip standalone tweets from the thread","type":"text"}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"4c: Prioritize Actions","type":"text"}]},{"type":"paragraph","content":[{"text":"Rank ALL outputs by impact-to-effort ratio. The top 3-5 become the \"Do This Now\" list:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"Priority scoring:\n- Effort: How long to execute (copy-paste = 1 min, publish article = 30 min, implement SEO fix = variable)\n- Impact: Estimated traffic/visibility gain\n- Urgency: Time-sensitive opportunities (active Reddit thread, trending topic)\n- Risk: Likelihood of negative outcome (getting banned, negative reception)","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 5: Generate CMO Dashboard","type":"text"}]},{"type":"paragraph","content":[{"text":"Present the synthesized results as a formatted dashboard. Use box-drawing characters for visual structure.","type":"text"}]},{"type":"paragraph","content":[{"text":"Dashboard output format:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"╔══════════════════════════════════════════════════════════════════════════════╗\n║ AI CMO TERMINAL ║\n╠══════════════════════════════════════════════════════════════════════════════╣\n║ [SEO] Critical: Missing meta description on /pricing, /contact ║\n║ [Reddit] r/SaaS: \"Best tools for startup marketing?\" (23 upvotes) ║\n║ [HN] Show HN draft ready: \"Show HN: [Product] – [description]\" ║\n║ [X] 3 tweet threads generated, 2 reply opportunities found ║\n║ [GEO] 5 AI search visibility gaps identified ║\n║ [Content] 1 SEO article drafted, 4-week calendar built ║\n║ +N more items ║\n╚══════════════════════════════════════════════════════════════════════════════╝\n\n┌─── ANALYTICS OVERVIEW ─────────────────────────────────────────────────────┐\n│ │\n│ Page Speed Accessibility Best Practices SEO │\n│ ┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐ │\n│ │ 58 │ │ 85 │ │ 73 │ │ 92 │ │\n│ └───────┘ └───────┘ └───────┘ └───────┘ │\n│ NEEDS WORK GOOD GOOD EXCELLENT │\n│ │\n│ Health: 18/24 Links: 42/42 AI/GEO: 3/8 Passed: 63/74 │\n│ │\n│ ── SEO Health Checklist ────────────────────────────────────── │\n│ [PASS] Meta Titles .................... 8/10 present │\n│ [FAIL] Meta Descriptions .............. 7/10 present (3 missing) │\n│ [PASS] Mobile Friendly ................ Yes │\n│ [WARN] Image Alt Tags ................. 42/50 (8 missing) │\n│ [FAIL] Core Web Vitals: │\n│ LCP: 3.2s (target: \u003c2.5s) │\n│ Total Blocking Time: 450ms (target: \u003c200ms) │\n│ Cumulative Layout Shift: 0.12 (target: \u003c0.1) │\n└────────────────────────────────────────────────────────────────────────────┘\n\n┌─── DO THIS NOW (Top 3 Actions) ───────────────────────────────────────────┐\n│ │\n│ 1. [FIX] Add meta descriptions to 3 pages ⏱ 15 min │\n│ Impact: HIGH | Copy-paste HTML provided below │\n│ │\n│ 2. [REPLY] Reply to Reddit thread in r/SaaS ⏱ 2 min │\n│ \"Best tools for startup marketing?\" (23 upvotes, 6h old) │\n│ Copy-paste comment ready below │\n│ │\n│ 3. [PUBLISH] Submit Show HN post ⏱ 5 min │\n│ Title + founder comment + objection responses ready │\n│ │\n└────────────────────────────────────────────────────────────────────────────┘\n\n┌─── AI CMO FEED ───────────────────────────────────────────────────────────┐\n│ │\n│ [!] Reddit Opportunities ─────────────────────────── N found │\n│ > \"Thread title\" (r/subreddit, X upvotes) [REPLY] │\n│ > \"Thread title\" (r/subreddit, X upvotes) [REPLY] │\n│ + N more threads ready for review │\n│ │\n│ [!] SEO & GEO Issues ────────────────────────────── N found │\n│ > Missing meta descriptions on N pages [FIX] │\n│ > No FAQ schema markup on N pages [FIX] │\n│ + N more recommendations │\n│ │\n│ [*] X/Twitter Ideas ─────────────────────────────── N generated │\n│ > Thread: \"Hook tweet preview...\" [REVIEW] │\n│ > Reply to @influencer about [topic] [REVIEW] │\n│ + N more ideas │\n│ │\n│ [*] Articles ────────────────────────────────────── N ready │\n│ > \"[Article Title]\" (target: keyword, ~2000 words) [DRAFT] │\n│ + N more article topics in calendar │\n│ │\n│ [-] Hacker News ─────────────────────────────────── 1 draft │\n│ > \"Show HN: [Product] – [description]\" [PUBLISH] │\n│ │\n└────────────────────────────────────────────────────────────────────────────┘\n\n┌─── COMPETITORS ───────────────────────────────────────────────────────────┐\n│ │\n│ Monitored (N): │\n│ HIGH competitor1.com .... Positioning: \"[their tagline]\" │\n│ MED competitor2.com .... Positioning: \"[their tagline]\" │\n│ LOW competitor3.com .... Positioning: \"[their tagline]\" │\n│ │\n│ Say \"add competitor [url]\" or \"remove competitor [url]\" to manage. │\n└────────────────────────────────────────────────────────────────────────────┘\n\n┌─── KNOWLEDGE BASE ────────────────────────────────────────────────────────┐\n│ │\n│ [LOADED] Site Audit ..................... site_audit.json │\n│ [LOADED] Product Info .................. (extracted from site) │\n│ [STATUS] Brand Profile ................. Not loaded (run /brand-research)│\n│ [STATUS] Competitor Analysis ........... Auto-identified (3 found) │\n│ │\n│ Load documents: provide file paths or describe your product. │\n└────────────────────────────────────────────────────────────────────────────┘\n\n─────────────────────────────────────────────────────────────────────────────\nAll analysis runs locally in your session. Your data is not stored or\nshared externally.\n─────────────────────────────────────────────────────────────────────────────","type":"text"}]},{"type":"paragraph","content":[{"text":"Populate each section with REAL data from agent outputs:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Terminal log: One line per agent with the most important finding","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Analytics: Actual scores from site_audit.py (or agent estimates)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Do This Now: Top 3 actions ranked by impact-to-effort","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Feed: Aggregated opportunities from all agents with preview text","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Competitors: Auto-identified list with threat levels","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Knowledge Base: Status of loaded documents/context","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":3},"content":[{"text":"Step 6: Deliver & Enter Chat Mode","type":"text"}]},{"type":"paragraph","content":[{"text":"After displaying the dashboard, enter conversational mode:","type":"text"}]},{"type":"paragraph","content":[{"text":"Delivery message:","type":"text","marks":[{"type":"strong"}]}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"\"Your AI CMO dashboard is ready.","type":"text"}]},{"type":"paragraph","content":[{"text":"Top priority:","type":"text","marks":[{"type":"strong"}]},{"text":" [#1 action from Do This Now list]","type":"text"}]},{"type":"paragraph","content":[{"text":"I can expand any section — just ask:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"'Show Reddit comments'","type":"text","marks":[{"type":"strong"}]},{"text":" — Full comments for all threads","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"'Show SEO fixes'","type":"text","marks":[{"type":"strong"}]},{"text":" — Every fix with copy-paste HTML","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"'Show the article'","type":"text","marks":[{"type":"strong"}]},{"text":" — Complete drafted article","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"'Show HN post'","type":"text","marks":[{"type":"strong"}]},{"text":" — Full submission + founder comment","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"'Show tweet threads'","type":"text","marks":[{"type":"strong"}]},{"text":" — All threads + calendar","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"'Show GEO fixes'","type":"text","marks":[{"type":"strong"}]},{"text":" — AI search visibility recommendations","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"'Write another article on [topic]'","type":"text","marks":[{"type":"strong"}]},{"text":" — Generate more content","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"'Deep dive on [competitor]'","type":"text","marks":[{"type":"strong"}]},{"text":" — Detailed competitive analysis","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"'Refresh'","type":"text","marks":[{"type":"strong"}]},{"text":" — Re-run the full analysis","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"What would you like to tackle first?\"","type":"text"}]}]},{"type":"paragraph","content":[{"text":"Chat interaction patterns:","type":"text","marks":[{"type":"strong"}]}]},{"type":"paragraph","content":[{"text":"When user asks to expand a section, output the FULL agent data for that section:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Reddit: Every thread URL + all comment variations","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"SEO: Every issue with exact HTML fix snippet","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Article: Full markdown article text","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"HN: Title + founder comment + all objection responses","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Tweets: Every thread + standalone tweets + calendar","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"GEO: Every recommendation with schema code","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"When user asks to write more content:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Use the same context bundle to generate additional content","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Maintain brand voice consistency","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Cross-reference existing outputs","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"State Persistence","type":"text"}]},{"type":"paragraph","content":[{"text":"After the initial run, save state for future re-runs:","type":"text"}]},{"type":"paragraph","content":[{"text":"Save ","type":"text","marks":[{"type":"strong"}]},{"text":"cmo_state.json","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" in the working directory:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"json"},"content":[{"text":"{\n \"last_run\": \"2026-03-16T14:30:00Z\",\n \"website_url\": \"https://example.com\",\n \"product_name\": \"Product Name\",\n \"product_description\": \"Brief description\",\n \"brand_voice\": {\"tone\": [\"Confident\", \"Approachable\"], \"formality\": \"professional casual\"},\n \"competitors\": [\"competitor1.com\", \"competitor2.com\"],\n \"social_handles\": {\"twitter\": \"@handle\"},\n \"content_generated\": [\"article-topic-1\"],\n \"reddit_threads_targeted\": [\"url1\", \"url2\"],\n \"hn_submitted\": false,\n \"seo_scores\": {\"seo\": 82, \"accessibility\": 65, \"performance\": 48, \"best_practices\": 73}\n}","type":"text"}]},{"type":"paragraph","content":[{"text":"On re-run, operate in delta mode:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Skip re-crawling if site hasn't changed (check Last-Modified header)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Find NEW Reddit threads only (filter out already-targeted)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Generate NEXT article in the content calendar","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Report SEO score CHANGES since last run","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Update competitor tracking with recent moves","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Integration with Other Skills","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Skill","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Use Case","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"brand-research-agent","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Deep brand analysis → feeds brand voice to all agents","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"competitive-intel-agent","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Detailed 4-agent competitive deep-dive","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"copywriter-agent","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Additional marketing copy (ads, landing pages, emails)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"chart-generation","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"SEO score gauges, opportunity breakdown charts","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"image-generation","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Social media graphics, blog post images","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"social-producer-agent","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Full social media asset creation (images + videos)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"media-utils","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"PDF report generation from CMO dashboard","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"Generate PDF Report:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python3 ${CLAUDE_PLUGIN_ROOT}/skills/media-utils/scripts/report_to_pdf.py \\\n --input cmo_report.md \\\n --output cmo_report.pdf \\\n --title \"AI CMO Report\" \\\n --style business","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Future Expansion","type":"text"}]},{"type":"paragraph","content":[{"text":"These channels are planned for future agent additions:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"LinkedIn Agent","type":"text","marks":[{"type":"strong"}]},{"text":" — Thought leadership posts, company page content","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Email Agent","type":"text","marks":[{"type":"strong"}]},{"text":" — Welcome sequences, newsletter templates, re-engagement","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Product Hunt Agent","type":"text","marks":[{"type":"strong"}]},{"text":" — Launch strategy, asset preparation, timing","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"YouTube Agent","type":"text","marks":[{"type":"strong"}]},{"text":" — Video topic ideas, SEO optimization, thumbnail concepts","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Link Building Agent","type":"text","marks":[{"type":"strong"}]},{"text":" — Backlink opportunities, outreach templates","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Influencer Agent","type":"text","marks":[{"type":"strong"}]},{"text":" — Influencer identification, outreach, collaboration ideas","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Agents","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Agent","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"File","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Focus","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"SEO Analyst","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"seo-analyst.md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Technical audit with exact fix snippets","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"GEO Analyst","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"geo-analyst.md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"AI search visibility optimization","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Content Writer","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"content-writer.md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Full articles + content calendar","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Reddit Scout","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"reddit-scout.md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Thread discovery + copy-paste comments","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"HN Scout","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"hackernews-scout.md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Show HN submission package","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"X Scout","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"x-scout.md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Tweet threads + 7-day calendar","type":"text"}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Example Prompts","type":"text"}]},{"type":"paragraph","content":[{"text":"Full CMO analysis:","type":"text","marks":[{"type":"strong"}]}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"\"Be my AI CMO for https://myproduct.com\"","type":"text"}]}]},{"type":"paragraph","content":[{"text":"Specific channel focus:","type":"text","marks":[{"type":"strong"}]}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"\"Find Reddit opportunities for my SaaS product at https://myapp.io\"","type":"text"}]}]},{"type":"paragraph","content":[{"text":"Content generation:","type":"text","marks":[{"type":"strong"}]}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"\"Write SEO articles for https://mysite.com — I want to rank for AI marketing tools\"","type":"text"}]}]},{"type":"paragraph","content":[{"text":"SEO audit only:","type":"text","marks":[{"type":"strong"}]}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"\"Run a full SEO audit on https://mysite.com and give me exact fixes\"","type":"text"}]}]},{"type":"paragraph","content":[{"text":"Competitive analysis:","type":"text","marks":[{"type":"strong"}]}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"\"Analyze my marketing position vs Competitor1 and Competitor2 for https://myproduct.com\"","type":"text"}]}]},{"type":"paragraph","content":[{"text":"Re-run / refresh:","type":"text","marks":[{"type":"strong"}]}]},{"type":"blockquote","content":[{"type":"paragraph","content":[{"text":"\"Refresh my CMO dashboard — find new opportunities since last run\"","type":"text"}]}]},{"type":"hr","attrs":{"markup":"---"}}]},"metadata":{"date":"2026-06-05","name":"cmo-agent","author":"@skillopedia","source":{"stars":13,"repo_name":"skills","origin_url":"https://github.com/michaelboeding/skills/blob/HEAD/skills/cmo-agent/SKILL.md","repo_owner":"michaelboeding","body_sha256":"ac13396bcc5de2003712f9f79e7e2cdba89b0de968a30117c3e219211201eed3","cluster_key":"3236cf35289cd72c350d5f119b9d7dd76640ea20c34c10b7321cb1983dbb95e7","clean_bundle":{"format":"clean-skill-bundle-v1","source":"michaelboeding/skills/skills/cmo-agent/SKILL.md","attachments":[{"id":"767b8c37-40b4-5601-96db-71933fad84dc","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/767b8c37-40b4-5601-96db-71933fad84dc/attachment.md","path":"agents/content-writer.md","size":3955,"sha256":"afc3d96942cdec92ccbc91b038e7d90fe058be86cd9f741615dd0b04c26b38c0","contentType":"text/markdown; charset=utf-8"},{"id":"04e3f03c-5342-541a-9ec0-54b0a23747fd","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/04e3f03c-5342-541a-9ec0-54b0a23747fd/attachment.md","path":"agents/geo-analyst.md","size":4140,"sha256":"c5706b3af5c8896f3af4c2757902327cafaed47abfb63946c19c647d2b6c1e5f","contentType":"text/markdown; charset=utf-8"},{"id":"3a21bf39-d4d0-55d5-b974-c4675a512105","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/3a21bf39-d4d0-55d5-b974-c4675a512105/attachment.md","path":"agents/hackernews-scout.md","size":4906,"sha256":"82e3132468cebc99287bd17d6f0871e29ae7091fd2422715e7ccfc2e4f9f158d","contentType":"text/markdown; charset=utf-8"},{"id":"72d5dc61-62d1-5717-9749-cd50d49c3a99","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/72d5dc61-62d1-5717-9749-cd50d49c3a99/attachment.md","path":"agents/reddit-scout.md","size":4329,"sha256":"6d641ead27d1cca738cf8555b5f999ca38da55fb761a73880bb59f6d78e48a60","contentType":"text/markdown; charset=utf-8"},{"id":"d14f5b07-c7f3-54f3-93d9-e4776a6ffccc","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/d14f5b07-c7f3-54f3-93d9-e4776a6ffccc/attachment.md","path":"agents/seo-analyst.md","size":3817,"sha256":"e53738f5bf00c693804f5ce7222e06f9a9866d56280019efc4177f0f1b676d0d","contentType":"text/markdown; charset=utf-8"},{"id":"2936fbd4-51f0-50a3-aa5d-82a1b6bc792c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/2936fbd4-51f0-50a3-aa5d-82a1b6bc792c/attachment.md","path":"agents/x-scout.md","size":5234,"sha256":"4f8e3d2f1916276d9a9f4008db2b9f969cdbe2daf296046981fabb12f44ac4ca","contentType":"text/markdown; charset=utf-8"},{"id":"832de1b3-b0e3-536c-9bd0-e3d074eb747e","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/832de1b3-b0e3-536c-9bd0-e3d074eb747e/attachment.py","path":"scripts/site_audit.py","size":53048,"sha256":"f8a10f6e4a9d29cf7358baa383b9984842d9e6a7da6468cb7db6ab1d03913915","contentType":"text/x-python; charset=utf-8"}],"bundle_sha256":"72ab31eba1fe43588a2c641fc1fbf4fb1458ea0cf1e50575adf22e537a3e0ecf","attachment_count":7,"text_attachments":7,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":0,"excluded_attachments":[]},"cluster_size":1,"skill_md_path":"skills/cmo-agent/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"security","category_label":"Security"},"exact_dupes_collapsed_into_this":0},"version":"v1","category":"security","import_tag":"clean-skills-v1","description":"AI Chief Marketing Officer that analyzes your website and deploys autonomous marketing agents across SEO, content, Reddit, Hacker News, X/Twitter, and AI search visibility. Enter a URL and get a full marketing dashboard with ready-to-publish content, opportunities, and actionable fixes. Triggers: \"ai cmo\", \"cmo agent\", \"marketing agent\", \"growth agent\", \"marketing automation\", \"drive traffic\", \"marketing strategy\", \"seo audit\", \"content marketing\", \"growth hacking\", \"marketing dashboard\", \"find marketing opportunities\", \"grow my product\", \"get more traffic\", \"marketing plan\", \"distribution strategy\" Outputs: SEO audit with fix snippets, GEO recommendations, ready-to-publish articles, Reddit comments, HN posts, tweet threads, 7-day content calendar, competitor tracking, prioritized action plan.\n"}},"renderedAt":1782986695622}

AI CMO Agent Your AI Chief Marketing Officer. Enter a website URL and get a full marketing team deployed across every growth channel. This skill uses 6 specialized agents that work in parallel across SEO, GEO (AI search visibility), content writing, Reddit, Hacker News, and X/Twitter — then synthesizes everything into a prioritized action plan with ready-to-publish content. What It Produces | Output | Description | |--------|-------------| | CMO Dashboard | Terminal-formatted overview with scores, opportunities, and action items | | SEO Audit | Page-by-page technical audit with exact HTML fix…