{"id":51137990,"url":"https://github.com/2naive/seo-audit","last_synced_at":"2026-06-25T20:01:04.540Z","repository":{"id":350569861,"uuid":"1207424368","full_name":"2naive/seo-audit","owner":"2naive","description":"Claude Skill","archived":false,"fork":false,"pushed_at":"2026-04-10T23:44:45.000Z","size":645,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-04-11T01:21:43.471Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/2naive.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-10T23:38:50.000Z","updated_at":"2026-04-10T23:44:49.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/2naive/seo-audit","commit_stats":null,"previous_names":["2naive/seo-audit"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/2naive/seo-audit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/2naive%2Fseo-audit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/2naive%2Fseo-audit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/2naive%2Fseo-audit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/2naive%2Fseo-audit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/2naive","download_url":"https://codeload.github.com/2naive/seo-audit/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/2naive%2Fseo-audit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34790215,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-25T02:00:05.521Z","response_time":101,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-25T20:01:03.738Z","updated_at":"2026-06-25T20:01:04.529Z","avatar_url":"https://github.com/2naive.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SEO Audit Skill\n\n**Версия:** см. `generate-report.js` константа `SKILL_VERSION`  \n**Автор:** SEO Audit от Nedzelsky.pro  \n**Расположение:** `.claude/skills/seo-audit/`\n\nСкилл для Claude Code (`/seo-audit [URL]`) — выполняет полный технический SEO-аудит сайта и генерирует отчёт в форматах Markdown, HTML и PDF.\n\n---\n\n## Файлы\n\n| Файл | Назначение |\n|------|-----------|\n| `SKILL.md` | Основная инструкция для агента (все фазы аудита) |\n| `generate-report.js` | Генератор HTML+PDF из `report-data.json` |\n| `CHANGELOG.md` | История изменений с обоснованием |\n| `README.md` | Этот файл — документация и архитектура |\n\nВыходные файлы создаются в `{корень-проекта}/seo-audit-output/` и **не хранятся в репозитории** (`.gitignore`).\n\n---\n\n## Использование\n\n```bash\n/seo-audit https://example.com\n```\n\nАгент создаёт в `seo-audit-output/`:\n- `seo-report-{domain}-{datetime}.md` — Markdown\n- `seo-report-{domain}-{datetime}.html` — HTML (открыть в браузере)\n- `seo-report-{domain}-{datetime}.pdf` — PDF\n- `report-data-{domain}-{datetime}.json` — исходные данные\n- `desktop-{domain}-{datetime}.png` — скриншот десктоп\n- `mobile-{domain}-{datetime}.png` — скриншот мобильный\n\n---\n\n## Архитектура\n\n### Режимы работы\n\n| Режим | Условие | Что пропускается |\n|-------|---------|-----------------|\n| **Полный (Chrome)** | `mcp__claude-in-chrome__navigate` доступен | — |\n| **Базовый** | Chrome недоступен, пользователь подтвердил | Фаза 2 целиком (JS-анализ, скриншоты, Lighthouse) |\n\n### Фазы аудита\n\n```\nФаза 0  →  Проверка Chrome-подключения\nФаза 1  →  Статичные проверки (WebFetch + Bash curl)\nФаза 2  →  Браузерный анализ (Chrome MCP-инструменты)\nФаза 3  →  Сборка report-data.json\nФаза 4  →  generate-report.js → HTML + PDF\n```\n\n**Фаза 0** — пытается открыть URL через `mcp__claude-in-chrome__tabs_create_mcp` + `navigate`. Если инструменты недоступны — запрашивает подтверждение на базовый режим.\n\n**Фаза 1** — только WebFetch и Bash (curl). Не требует Chrome. Проверяет:\n- robots.txt (блокировки, Sitemap:, Host:)\n- sitemap.xml (формат, количество URL, lastmod)\n- www/http редиректы (зеркала)\n- 404-страницу\n- raw HTML главной (мета-теги, OG, Schema.org, E-E-A-T ссылки, H1-H6)\n- HTTP-заголовки (HSTS, X-Frame-Options, gzip, Cache-Control, TTFB)\n- 2–3 страницы из sitemap\n- Дубли title/description между страницами\n- Session ID в URL, пагинация, HTML-карта, «О компании», политика\n\n**Фаза 2** — требует Chrome. Проверяет:\n- JS-рендеренный контент (сравнение с raw HTML → JS-зависимость)\n- Скриншоты desktop (1280×900) и mobile (390×844)\n- JS-ошибки в консоли\n- Качество анкоров внутренних ссылок\n- Скрытый контент (display:none, visibility:hidden, font-size\u003c5px)\n- Schema.org через браузер\n- Lighthouse (Performance, SEO, Accessibility, Best Practices + 6 метрик)\n\n**Фаза 3** — агент собирает все данные в `report-data-{domain}-{datetime}.json`. Схема описана ниже.\n\n**Фаза 4** — запускает `generate-report.js`, который читает JSON и генерирует HTML + PDF через Chrome headless `--print-to-pdf`.\n\n---\n\n## Схема report-data.json\n\n```json\n{\n  \"url\": \"https://example.com\",\n  \"date\": \"YYYY-MM-DD HH:MM\",\n  \"mode\": \"full | basic\",\n  \"skillVersion\": \"1.3.2\",\n  \"summary\": {\n    \"summary\": \"Текст резюме\",\n    \"pagesAnalyzed\": 4,\n    \"critical\": 7,\n    \"warnings\": 11,\n    \"ok\": 19\n  },\n  \"scores\": {\n    \"Мета-теги\": 6,\n    \"Структура контента\": 7,\n    ...\n  },\n  \"scoreDetails\": {\n    \"Мета-теги\": [\"✅ title 52 симв.\", \"🔴 description 285 симв.\"],\n    ...\n  },\n  \"recommendations\": [\n    {\n      \"title\": \"...\",\n      \"description\": \"...\",\n      \"priority\": \"high | medium | low\",\n      \"difficulty\": \"low | medium | high\",\n      \"fix\": \"nginx.conf: gzip on;\"\n    }\n  ],\n  \"pages\": [\n    {\n      \"url\": \"...\",\n      \"issues\": [{ \"severity\": \"critical|warning|info|ok\", \"msg\": \"...\" }]\n    }\n  ],\n  \"scoreDetails\": { ... },\n  \"lighthouse\": {\n    \"available\": true,\n    \"performance\": 84,\n    \"seo\": 100,\n    \"accessibility\": 98,\n    \"bestPractices\": 77,\n    \"metrics\": { \"FCP\": \"1.2 s\", \"LCP\": \"2.4 s\", ... }\n  },\n  \"screenshotPaths\": {\n    \"desktop\": \"/abs/path/desktop-example.com-2026-04-07-1457.png\",\n    \"mobile\": \"/abs/path/mobile-example.com-2026-04-07-1457.png\"\n  },\n  \"technical\": [\n    { \"check\": \"HTTPS\", \"status\": \"ok|warning|critical|info\", \"value\": \"...\" },\n    ...\n  ]\n}\n```\n\n### Правила заполнения\n\n- `scoreDetails` — **обязателен** для каждой категории из `scores`. Каждый элемент — факт с иконкой: `\"✅ title 52 симв.\"`, `\"🔴 description 285 симв. (норма 70-160)\"`. Пустые массивы недопустимы.\n- `screenshotPaths` — абсолютные пути к реально существующим PNG-файлам или `null`.\n- `skillVersion` — текущая версия скилла (из константы `SKILL_VERSION` в `generate-report.js`).\n- `lighthouse.available: false` — если Lighthouse не запустился; остальные поля опциональны.\n\n---\n\n## generate-report.js\n\nNode.js скрипт без внешних зависимостей (только стандартная библиотека).\n\n```\nnode generate-report.js \u003creport.json\u003e [output-dir]\n```\n\n### Что генерирует\n\n1. **HTML** — полностью самодостаточный файл (inline CSS, base64 изображения). Открывается в любом браузере.\n2. **PDF** — через Chrome headless `--print-to-pdf`. Требует Chrome в одном из стандартных путей.\n\n### Секции отчёта (по порядку)\n\n| # | Секция | Источник данных |\n|---|--------|----------------|\n| 1 | Шапка (URL, дата, режим, общая оценка) | `url`, `date`, `mode`, `scores` |\n| 2 | Статистика (4 плитки) | `summary` |\n| 3 | Оценки по категориям + детали | `scores`, `scoreDetails` |\n| 4 | Lighthouse | `lighthouse` |\n| 5 | Рекомендации (сгруппированы по приоритету) | `recommendations` |\n| 6 | Проблемы по страницам | `pages` |\n| 7 | Технические проверки | `technical` |\n| 8 | Скриншоты (embedded base64) | `screenshotPaths` |\n| 9 | Топ-5 действий с максимальным ROI | `recommendations` (фильтрация) |\n| — | Подвал с версией | `SKILL_VERSION`, `url`, `date` |\n\n### Цветовая схема оценок\n\n| Значение | Цвет | Смысл |\n|----------|------|-------|\n| 8–10 | Зелёный `#22c55e` | Хорошо |\n| 5–7 | Жёлтый `#f59e0b` | Требует внимания |\n| 1–4 | Красный `#ef4444` | Критично |\n\n---\n\n## Известные ограничения\n\n| Ограничение | Обходной путь |\n|------------|---------------|\n| Скриншоты показывают не тот сайт | Перед скриншотом проверить активную вкладку через `tabs_context_mcp` |\n| Lighthouse не запускается | `npm install -g lighthouse` вручную |\n| Chrome не найден для PDF | Установить Chrome по стандартному пути |\n| Большие base64 скриншоты не помещаются в Bash echo | Использовать временный файл: `node -e \"fs.writeFileSync(...)\"` |\n\n---\n\n## Требования\n\n| Компонент | Версия | Обязательность |\n|-----------|--------|---------------|\n| Node.js | ≥ 16 | Обязательно (generate-report.js) |\n| Google Chrome | любая | Обязательно (PDF генерация, Chrome-режим) |\n| lighthouse | ≥ 10 | Опционально (устанавливается автоматически) |\n| Claude Code | ≥ 1.0.36 | Обязательно |\n| Claude in Chrome extension | ≥ 1.0.36 | Для полного режима |\n\n---\n\n## Хронология ключевых решений\n\n### Почему Chrome MCP, а не Puppeteer/Playwright?\nClaude Code уже интегрирован с Chrome через расширение. Использование `mcp__claude-in-chrome__*` инструментов не требует дополнительных зависимостей и работает в рамках той же сессии.\n\n### Почему PDF через Chrome --print-to-pdf, а не wkhtmltopdf/puppeteer?\nChrome уже требуется для аудита, добавление второй зависимости избыточно. Chrome headless корректно рендерит CSS (градиенты, print-color-adjust, @page counters).\n\n### Почему inline CSS в HTML, а не внешние файлы?\nСамодостаточный HTML-файл можно открыть без сервера и отправить клиенту одним файлом. PDF генерируется из этого же файла — нет расхождений.\n\n### Почему скриншоты встраиваются как base64, а не ссылки на файлы?\nPDF должен содержать изображения без внешних зависимостей. При пересылке PDF клиенту скриншоты сохраняются.\n\n### Почему report-data.json с timestamp в имени?\nПредыдущая версия перезаписывала единственный файл `report-data.json` при каждом запуске. Теперь каждый аудит хранит свои данные отдельно — можно повторно сгенерировать отчёт из старых данных.\n\n### Почему scoreDetails обязателен?\nБез него оценка \"Мобильность: 7/10\" — субъективное мнение агента без обоснования. Клиент не понимает, что именно проверялось. scoreDetails превращает цифру в верифицируемые факты.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F2naive%2Fseo-audit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F2naive%2Fseo-audit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F2naive%2Fseo-audit/lists"}