dsh-desktop-kit 0.0.0-stage → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +152 -2
- package/client.js +4101 -0
- package/cordis.patch.yml +5 -0
- package/docs/ARCHITECTURE.md +114 -0
- package/docs/COMPATIBILITY.md +61 -0
- package/docs/INSTALL.md +84 -0
- package/docs/PRIVACY.md +50 -0
- package/docs/ROADMAP.md +57 -0
- package/docs/TOKENS.md +118 -0
- package/docs/TROUBLESHOOTING.md +68 -0
- package/docs/images/hero.png +0 -0
- package/index.js +84 -0
- package/package.json +70 -4
- package/plugins/dsh-gkb-ru-ui/cordis.patch.yml +6 -0
- package/plugins/dsh-gkb-ru-ui/lib/client.js +1331 -0
- package/plugins/dsh-gkb-ru-ui/lib/index.js +186 -0
- package/plugins/dsh-gkb-ru-ui/lib/skills.js +570 -0
- package/plugins/dsh-gkb-ru-ui/package.json +28 -0
- package/plugins/dsh-gkb-ru-ui/screenshots/01-home-tiles-1440-light.png +0 -0
- package/plugins/dsh-gkb-ru-ui/screenshots/02-skills-1440-light.png +0 -0
- package/plugins/dsh-gkb-ru-ui/screenshots/03-skills-editor-1440-light.png +0 -0
- package/plugins/dsh-gkb-ru-ui/screenshots/04-skills-1440-dark.png +0 -0
- package/plugins/dsh-gkb-ru-ui/screenshots/05-skills-390-light.png +0 -0
- package/plugins/dsh-gkb-ru-ui/screenshots/06-home-tiles-1440-dark.png +0 -0
- package/plugins/dsh-peak-guard/README.md +70 -0
- package/plugins/dsh-peak-guard/client.js +741 -0
- package/plugins/dsh-peak-guard/cordis.patch.yml +5 -0
- package/plugins/dsh-peak-guard/icon.svg +12 -0
- package/plugins/dsh-peak-guard/index.js +2 -0
- package/plugins/dsh-peak-guard/locale/en.json +6 -0
- package/plugins/dsh-peak-guard/locale/ru.json +6 -0
- package/plugins/dsh-peak-guard/locale/zh.json +6 -0
- package/plugins/dsh-peak-guard/package.json +33 -0
- package/plugins/dsh-peak-guard/screenshots/01-real-time-peak-start.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/02-real-time-peak-end.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/03-peak-card-1440-light.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/04-peak-card-1440-dark.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/05-peak-card-390-light.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/05-peak-card-768-light.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/06-peak-card-390-light.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/07-live-preview-check.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/07-pre-peak-1440-light.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/08-peak-start-1440-light.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/09-peak-end-1440-light.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/10-pre-peak-card-1440-light.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/11-pre-peak-card-1440-dark.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/12-pre-peak-card-390-light.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/qa-report.json +74 -0
- package/plugins/dsh-profile-transfer/README.md +62 -0
- package/plugins/dsh-profile-transfer/bootstrap/01-INSTALL.cmd +7 -0
- package/plugins/dsh-profile-transfer/bootstrap/README-ARCHIVE.md +54 -0
- package/plugins/dsh-profile-transfer/bootstrap/README-/320/243/320/241/320/242/320/220/320/235/320/236/320/222/320/232/320/220.md +42 -0
- package/plugins/dsh-profile-transfer/bootstrap/install-on-clean-machine.ps1 +119 -0
- package/plugins/dsh-profile-transfer/bootstrap//320/243/320/241/320/242/320/220/320/235/320/236/320/222/320/230/320/242/320/254.cmd +5 -0
- package/plugins/dsh-profile-transfer/client.js +806 -0
- package/plugins/dsh-profile-transfer/cordis.patch.yml +3 -0
- package/plugins/dsh-profile-transfer/icon.svg +13 -0
- package/plugins/dsh-profile-transfer/index.js +375 -0
- package/plugins/dsh-profile-transfer/locale/en.json +6 -0
- package/plugins/dsh-profile-transfer/locale/ru.json +6 -0
- package/plugins/dsh-profile-transfer/locale/zh.json +6 -0
- package/plugins/dsh-profile-transfer/package.json +36 -0
- package/plugins/dsh-profile-transfer/screenshots/01-settings-transfer-1440-light.png +0 -0
- package/plugins/dsh-profile-transfer/screenshots/02-settings-transfer-preview-1440-light.png +0 -0
- package/plugins/dsh-profile-transfer/screenshots/03-settings-transfer-1440-dark.png +0 -0
- package/plugins/dsh-profile-transfer/screenshots/04-settings-transfer-390-light.png +0 -0
- package/plugins/dsh-profile-transfer/screenshots/05-settings-transfer-768-light.png +0 -0
- package/plugins/dsh-profile-transfer/screenshots/06-settings-transfer-390-dark.png +0 -0
- package/plugins/dsh-profile-transfer/screenshots/07-settings-transfer-export-result.png +0 -0
- package/plugins/dsh-profile-transfer/screenshots/08-settings-transfer-workspaces-1440-light.png +0 -0
- package/plugins/dsh-profile-transfer/screenshots/09-settings-transfer-workspaces-1440-dark.png +0 -0
- package/plugins/dsh-profile-transfer/screenshots/10-settings-transfer-workspaces-390-light.png +0 -0
- package/plugins/dsh-profile-transfer/transfer.js +1004 -0
- package/plugins/dsh-project-memory/README.md +71 -0
- package/plugins/dsh-project-memory/cordis.patch.yml +4 -0
- package/plugins/dsh-project-memory/icon.svg +12 -0
- package/plugins/dsh-project-memory/index.js +1240 -0
- package/plugins/dsh-project-memory/locale/en.json +6 -0
- package/plugins/dsh-project-memory/locale/ru.json +6 -0
- package/plugins/dsh-project-memory/locale/zh.json +6 -0
- package/plugins/dsh-project-memory/package.json +26 -0
- package/plugins/dsh-session-move/README.md +67 -0
- package/plugins/dsh-session-move/client.js +719 -0
- package/plugins/dsh-session-move/cordis.patch.yml +5 -0
- package/plugins/dsh-session-move/icon.svg +14 -0
- package/plugins/dsh-session-move/index.js +497 -0
- package/plugins/dsh-session-move/locale/en.json +6 -0
- package/plugins/dsh-session-move/locale/ru.json +6 -0
- package/plugins/dsh-session-move/locale/zh.json +6 -0
- package/plugins/dsh-session-move/package.json +31 -0
- package/plugins/dsh-session-move/screenshots/01-row-menu-1440-light.png +0 -0
- package/plugins/dsh-session-move/screenshots/02-dialog-1440-light.png +0 -0
- package/plugins/dsh-session-move/screenshots/03-dialog-390-light.png +0 -0
- package/plugins/dsh-session-move/screenshots/04-dialog-1440-dark.png +0 -0
- package/plugins/dsh-session-move/screenshots/05-drag-highlight-1440-light.png +0 -0
- package/plugins/dsh-session-move/screenshots/06-drop-ungrouped-highlight.png +0 -0
- package/plugins/dsh-session-move/screenshots/07-after-drop-ungrouped.png +0 -0
- package/plugins/dsh-session-move/screenshots/08-move-dialog.png +0 -0
- package/plugins/dsh-session-move/screenshots/09-moved-to-second-workspace.png +0 -0
- package/plugins/dsh-session-move/screenshots/qa-report.json +62 -0
- package/plugins/dsh-skill-autopilot/cordis.patch.yml +3 -0
- package/plugins/dsh-skill-autopilot/index.js +444 -0
- package/plugins/dsh-skill-autopilot/package.json +19 -0
- package/plugins/dsh-token-lab/cordis.patch.yml +3 -0
- package/plugins/dsh-token-lab/lib/client.js +504 -0
- package/plugins/dsh-token-lab/lib/index.js +275 -0
- package/plugins/dsh-token-lab/package.json +26 -0
- package/plugins/dsh-token-lab/screenshots/01-token-lab-1440-light.png +0 -0
- package/plugins/dsh-token-lab/screenshots/02-token-lab-1440-dark.png +0 -0
- package/skills/code-review-checklist/SKILL.md +55 -0
- package/skills/content-writing/README.md +87 -0
- package/skills/content-writing/SKILL.md +85 -0
- package/skills/content-writing/assets/checklists/fact-check.md +53 -0
- package/skills/content-writing/assets/checklists/publish.md +65 -0
- package/skills/content-writing/assets/checklists/social.md +40 -0
- package/skills/content-writing/assets/templates/article.md +47 -0
- package/skills/content-writing/assets/templates/brief.md +44 -0
- package/skills/content-writing/assets/templates/doctor-card.md +41 -0
- package/skills/content-writing/assets/templates/image-prompts.md +128 -0
- package/skills/content-writing/assets/templates/post-telegram.md +36 -0
- package/skills/content-writing/assets/templates/post-vk.md +42 -0
- package/skills/content-writing/assets/templates/press-release.md +56 -0
- package/skills/content-writing/assets/templates/science-pop-note.md +55 -0
- package/skills/content-writing/assets/templates/service-card.md +46 -0
- package/skills/content-writing/references/anti-ai-style.md +248 -0
- package/skills/content-writing/references/editing.md +185 -0
- package/skills/content-writing/references/fact-checking.md +205 -0
- package/skills/content-writing/references/government-medical.md +246 -0
- package/skills/content-writing/references/images.md +212 -0
- package/skills/content-writing/references/journalism.md +252 -0
- package/skills/content-writing/references/process.md +123 -0
- package/skills/content-writing/references/quick-recipes.md +99 -0
- package/skills/content-writing/references/rules.md +85 -0
- package/skills/content-writing/references/science-popular.md +218 -0
- package/skills/content-writing/references/seo-content.md +172 -0
- package/skills/content-writing/references/social-media.md +253 -0
- package/skills/content-writing/references/sources.md +49 -0
- package/skills/content-writing/references/templates.md +291 -0
- package/skills/context-economy/SKILL.md +60 -0
- package/skills/context-economy/references/long-session.md +35 -0
- package/skills/context-economy/references/token-math.md +42 -0
- package/skills/context-economy/references/tool-recipes.md +34 -0
- package/skills/database-safety/SKILL.md +47 -0
- package/skills/debugging-playbook/SKILL.md +42 -0
- package/skills/design-critique/SKILL.md +65 -0
- package/skills/design-critique/references/a11y.md +25 -0
- package/skills/design-critique/references/diagnoses.md +33 -0
- package/skills/design-critique/references/quick-tests.md +30 -0
- package/skills/design-critique/references/report-template.md +63 -0
- package/skills/design-critique/references/rubric-fast.md +73 -0
- package/skills/dev-workflow/SKILL.md +48 -0
- package/skills/dev-workflow/references/definition-of-done.md +44 -0
- package/skills/dev-workflow/references/memory-and-boundaries.md +31 -0
- package/skills/dev-workflow/references/stages.md +67 -0
- package/skills/git-and-ci/SKILL.md +60 -0
- package/skills/pg-upgrade-verify/SKILL.md +67 -0
- package/skills/project-deep-dive/SKILL.md +45 -0
- package/skills/project-deep-dive/references/recon-commands.md +90 -0
- package/skills/project-deep-dive/references/section-templates.md +104 -0
- package/skills/project-deep-dive/references/tool-and-process.md +86 -0
- package/skills/project-memory-maintenance/SKILL.md +55 -0
- package/skills/project-memory-maintenance/references/api-and-checklist.md +99 -0
- package/skills/project-memory-maintenance/references/journal-template.md +50 -0
- package/skills/project-memory-maintenance/references/section-rules.md +59 -0
- package/skills/release-and-deploy/SKILL.md +53 -0
- package/skills/requirements-and-planning/SKILL.md +49 -0
- package/skills/requirements-and-planning/references/antipatterns-and-checklist.md +20 -0
- package/skills/requirements-and-planning/references/process-steps.md +52 -0
- package/skills/requirements-and-planning/references/templates-and-estimates.md +29 -0
- package/skills/security-review/SKILL.md +40 -0
- package/skills/seo/README.md +60 -0
- package/skills/seo/SKILL.md +77 -0
- package/skills/seo/assets/README.md +66 -0
- package/skills/seo/assets/scripts/LICENSE-playwright-core.txt +202 -0
- package/skills/seo/assets/scripts/README.md +179 -0
- package/skills/seo/assets/scripts/lib/args.mjs +105 -0
- package/skills/seo/assets/scripts/lib/browser.mjs +620 -0
- package/skills/seo/assets/scripts/lib/zip.mjs +191 -0
- package/skills/seo/assets/scripts/seo-audit.mjs +1675 -0
- package/skills/seo/assets/snippets/jsonld-breadcrumb.json +30 -0
- package/skills/seo/assets/snippets/jsonld-faq.json +39 -0
- package/skills/seo/assets/snippets/jsonld-medical-clinic.json +49 -0
- package/skills/seo/assets/snippets/jsonld-medical-webpage.json +33 -0
- package/skills/seo/assets/snippets/jsonld-organization.json +74 -0
- package/skills/seo/assets/snippets/jsonld-physician.json +46 -0
- package/skills/seo/assets/snippets/meta.blade.php +61 -0
- package/skills/seo/assets/snippets/robots.txt +61 -0
- package/skills/seo/assets/snippets/sitemap-urlset-example.xml +72 -0
- package/skills/seo/assets/snippets/sitemap.xml +36 -0
- package/skills/seo/references/antipatterns.md +66 -0
- package/skills/seo/references/audit-checklist.md +319 -0
- package/skills/seo/references/content-seo.md +204 -0
- package/skills/seo/references/eeat-medical.md +219 -0
- package/skills/seo/references/measurement.md +250 -0
- package/skills/seo/references/on-page.md +214 -0
- package/skills/seo/references/page-templates.md +56 -0
- package/skills/seo/references/stack-recipes.md +695 -0
- package/skills/seo/references/structured-data.md +487 -0
- package/skills/seo/references/technical-seo.md +296 -0
- package/skills/service-desk-conventions/SKILL.md +52 -0
- package/skills/service-desk-db-safety/SKILL.md +63 -0
- package/skills/service-desk-release/SKILL.md +61 -0
- package/skills/service-desk-testing/SKILL.md +61 -0
- package/skills/service-desk-ui/SKILL.md +52 -0
- package/skills/skills-router/SKILL.md +53 -0
- package/skills/skills-router/references/applying-skills.md +25 -0
- package/skills/skills-router/references/routing-matrix.md +52 -0
- package/skills/testing-strategy/SKILL.md +52 -0
- package/skills/ui-design-system/SKILL.md +50 -0
- package/skills/ui-design-system/references/accessibility-and-responsive.md +50 -0
- package/skills/ui-design-system/references/tokens-and-components.md +67 -0
- package/skills/ui-design-system/references/visual-qa.md +44 -0
- package/skills/web-research/SKILL.md +47 -0
- package/skills/web-research/references/answer-and-citations.md +60 -0
- package/skills/web-research/references/query-recipes.md +44 -0
- package/skills/wow-design/SKILL.md +89 -0
- package/skills/wow-design/assets/kit/README.md +195 -0
- package/skills/wow-design/assets/kit/assets/css/base.css +158 -0
- package/skills/wow-design/assets/kit/assets/css/components.css +1001 -0
- package/skills/wow-design/assets/kit/assets/css/fonts.css +73 -0
- package/skills/wow-design/assets/kit/assets/css/pages.css +737 -0
- package/skills/wow-design/assets/kit/assets/css/tokens.css +218 -0
- package/skills/wow-design/assets/kit/assets/fonts/LICENSE-golos-text.txt +93 -0
- package/skills/wow-design/assets/kit/assets/fonts/LICENSE-lora.txt +93 -0
- package/skills/wow-design/assets/kit/assets/fonts/LICENSE-unbounded.txt +93 -0
- package/skills/wow-design/assets/kit/assets/fonts/golos-text-cyrillic-400-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/golos-text-cyrillic-500-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/golos-text-cyrillic-600-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/golos-text-cyrillic-700-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/golos-text-latin-400-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/golos-text-latin-500-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/golos-text-latin-600-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/golos-text-latin-700-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/lora-cyrillic-400-italic.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/lora-cyrillic-400-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/lora-cyrillic-500-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/lora-cyrillic-600-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/lora-latin-400-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/lora-latin-500-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/lora-latin-600-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/unbounded-cyrillic-400-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/unbounded-cyrillic-500-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/unbounded-cyrillic-600-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/unbounded-latin-400-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/unbounded-latin-500-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/unbounded-latin-600-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/js/kit.js +550 -0
- package/skills/wow-design/assets/kit/pages/dashboard.html +539 -0
- package/skills/wow-design/assets/kit/pages/hospital.html +430 -0
- package/skills/wow-design/assets/kit/showcase.html +1164 -0
- package/skills/wow-design/assets/scripts/LICENSE-axe-core.txt +362 -0
- package/skills/wow-design/assets/scripts/LICENSE-playwright-core.txt +202 -0
- package/skills/wow-design/assets/scripts/README.md +312 -0
- package/skills/wow-design/assets/scripts/audit.mjs +1200 -0
- package/skills/wow-design/assets/scripts/capture.mjs +337 -0
- package/skills/wow-design/assets/scripts/package.json +30 -0
- package/skills/wow-design/references/anti-patterns.md +252 -0
- package/skills/wow-design/references/critique-rubric.md +262 -0
- package/skills/wow-design/references/design-brief-template.md +48 -0
- package/skills/wow-design/references/inspiration.md +203 -0
- package/skills/wow-design/references/presets.md +99 -0
- package/skills/wow-design/references/principles.md +371 -0
- package/skills/wow-design/references/quick-presets.md +50 -0
- package/skills/wow-design/references/report-template.md +21 -0
- package/skills/wow-design/references/stack-recipes.md +96 -0
- package/skills/wow-design/references/visual-qa.md +82 -0
- package/skills/wow-design/references/wow-levers.md +43 -0
- package/tools/skill-cost.mjs +76 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# SEO-скилл (`seo`) — установка и карта
|
|
2
|
+
|
|
3
|
+
Полноценный скилл «SEO-эксперт» для агента: техническое SEO, on-page, структурированные данные, E-E-A-T/YMYL
|
|
4
|
+
(медицина), контент, стек-рецепты (Laravel/Blade, Bitrix/Aspro, React/Vite, статика), аудит и измерение.
|
|
5
|
+
Правило скилла: **любой веб-артефакт (страница, шаблон, мета, URL, контент) пишется с SEO по умолчанию**.
|
|
6
|
+
|
|
7
|
+
Актуальность: **04.11.2026** (Google Search Central + Яндекс Вебмастер + schema.org + web.dev).
|
|
8
|
+
Спорные/меняющиеся места в текстах помечены «проверить на актуальной версии».
|
|
9
|
+
|
|
10
|
+
## Установка
|
|
11
|
+
|
|
12
|
+
1. Скопировать каталог в скиллы DSH:
|
|
13
|
+
`projects/seo-skill/` → `%USERPROFILE%\.dsh\skills\seo\`
|
|
14
|
+
(SKILL.md в корне, `references/`, `assets/` — рядом).
|
|
15
|
+
2. Проверить каталог скиллов: скилл должен появиться как `seo` (frontmatter: `name: seo`,
|
|
16
|
+
`whenToUse`, `user-invocable: true`).
|
|
17
|
+
3. Агент загружает его через tool `skill` перед любой веб-задачей; глобальный контракт в `~/.dsh/AGENTS.md`
|
|
18
|
+
§1b требует загружать `seo` для любого веб-артефакта.
|
|
19
|
+
4. Инструмент `assets/scripts/seo-audit.mjs` добавляет qa-toolsmith (task-5) — контракт интерфейса уже
|
|
20
|
+
зафиксирован в `assets/scripts/README.md`.
|
|
21
|
+
|
|
22
|
+
## Что внутри
|
|
23
|
+
|
|
24
|
+
| Файл | Назначение |
|
|
25
|
+
|---|---|
|
|
26
|
+
| `SKILL.md` | контракт «SEO по умолчанию», процесс 8 шагов, матрица по типам страниц, SEO-GATE, антипаттерны, шаблоны title/description, Google vs Яндекс, lite-режим |
|
|
27
|
+
| `references/technical-seo.md` | краулинг/индексация, статусы, robots.txt, sitemap, canonical, дубли, пагинация, фасеты, hreflang, CWV, JS/SPA, лог-анализ, миграции URL, топ-20 ошибок |
|
|
28
|
+
| `references/on-page.md` | title/description/H1–H6, URL, структура страницы услуги, изображения, анкоры, OG/Twitter, крошки, сниппет, примеры «плохо→хорошо» |
|
|
29
|
+
| `references/structured-data.md` | JSON-LD: граф сайта, BreadcrumbList, MedicalWebPage, Physician, MedicalClinic, Service/MedicalProcedure, FAQPage, Article, Event, Product + что устарело в 2026 + валидация |
|
|
30
|
+
| `references/eeat-medical.md` | YMYL: авторство врачей, рецензент, даты, источники, дисклеймеры, лицензия, локальная клиника (NAP, Яндекс Бизнес, 2ГИС, GBP), 152-ФЗ/38-ФЗ, чек-лист YMYL-гейта |
|
|
31
|
+
| `references/stack-recipes.md` | Laravel/Blade (SeoData, meta-компонент, sitemap/robots-роуты, 301, кэш), Bitrix/Aspro (SEO-шаблоны инфоблоков, canonical, 404, редиректы, robots/sitemap, кэш), React/Vite (Astro/Next/SPA), статика, nginx/.htaccess, проверки |
|
|
32
|
+
| `references/content-seo.md` | SEO-бриф, интенты, семантика/кластеры (Вордстат, Москва), структура лендинга и статьи, перелинковка, CTA, freshness, локализация, ИИ-ответы, редакционный процесс |
|
|
33
|
+
| `references/audit-checklist.md` | 107 проверок P0/P1/P2 по 12 областям + **автоматизируемые проверки (seo-audit.mjs)** + шаблоны отчёта + приоритизация |
|
|
34
|
+
| `references/measurement.md` | GSC, Яндекс Вебмастер, GA4/Метрика, KPI, «до/после», UTM, мониторинг/алерты, шаблоны отчётов |
|
|
35
|
+
| `assets/snippets/` | `meta.blade.php`, JSON-LD (организация, клиника, врач, MedicalWebPage, FAQ, крошки), `robots.txt`, `sitemap.xml` + urlset |
|
|
36
|
+
| `assets/README.md` | как пользоваться сниппетами, статусы разметки в 2026, особенности Битрикса |
|
|
37
|
+
| `assets/scripts/README.md` | контракт `seo-audit.mjs`: интерфейс, выходные файлы, схема JSON, список проверок |
|
|
38
|
+
|
|
39
|
+
## Ключевые правила (краткая версия)
|
|
40
|
+
|
|
41
|
+
1. Каждая страница: `title`, `description`, `canonical`, `robots`, OG, **один H1**, семантика, JSON-LD, `alt`,
|
|
42
|
+
внутренние ссылки, читаемый URL — иначе страница не готова.
|
|
43
|
+
2. Интент важнее ключевых слов; один интент = один URL, без каннибализации.
|
|
44
|
+
3. Медицина = YMYL: автор-врач, рецензент, даты, источники, дисклеймер, без обещаний излечения.
|
|
45
|
+
4. SEO-данные — в **исходном HTML** (SSR/SSG), а не после JS.
|
|
46
|
+
5. Любая смена URL — только с 301 + обновлением sitemap и внутренних ссылок.
|
|
47
|
+
6. **Google + Яндекс сразу**: ИКС, регион, Clean-param, Яндекс Бизнес; не оптимизируй под одного.
|
|
48
|
+
7. Проверяемо: Rich Results Test / Schema validator / GSC / Вебмастер / PSI — а не «я добавил meta».
|
|
49
|
+
8. 2026: FAQ rich results отключены (07.05.2026), HowTo удалён, llms.txt Google не использует,
|
|
50
|
+
AI Overviews/AI Mode учитываются в общем трафике GSC.
|
|
51
|
+
|
|
52
|
+
## Проверка комплектности
|
|
53
|
+
|
|
54
|
+
- [x] SKILL.md с frontmatter (`name`, `description`, `whenToUse`, `user-invocable`), 8 шагов, гейт, антипаттерны.
|
|
55
|
+
- [x] 8 файлов в `references/` (technical, on-page, structured-data, eeat-medical, stack-recipes, content-seo,
|
|
56
|
+
audit-checklist, measurement).
|
|
57
|
+
- [x] 107 проверок с P0/P1/P2 + порог сдачи + шаблон отчёта.
|
|
58
|
+
- [x] Готовые сниппеты и README для assets.
|
|
59
|
+
- [x] Русский рынок (Google + Яндекс) и медицинский YMYL учтены в каждом релевантном файле.
|
|
60
|
+
- [x] Ссылки на первоисточники; спорные данные помечены «проверить».
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: seo
|
|
3
|
+
description: "SEO веб-артефакта по умолчанию: страница, шаблон, URL, мета, JSON-LD, контент, аудит — любой веб"
|
|
4
|
+
whenToUse: "Вёрстка, мета-теги, URL и редиректы, миграции, sitemap/robots, JSON-LD, статьи, аудит — грузить до кода, если задача про веб."
|
|
5
|
+
user-invocable: true
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# SEO — ядро
|
|
9
|
+
|
|
10
|
+
> ≈2 000 токенов. Детали — по ссылкам, когда нужны.
|
|
11
|
+
|
|
12
|
+
## 0. Когда применять
|
|
13
|
+
|
|
14
|
+
- Страница, шаблон, `<head>`, sitemap, robots, статья, услуга.
|
|
15
|
+
|
|
16
|
+
## 1. Главное
|
|
17
|
+
|
|
18
|
+
### 1.1 Контракт
|
|
19
|
+
|
|
20
|
+
1. **SEO по умолчанию**: мета, `canonical`, `robots`, OG, один `H1`, семантика, `alt`, ссылки, JSON-LD, читаемый URL — иначе страница не готова.
|
|
21
|
+
2. **Интент важнее ключей**: сначала что человек хочет, потом страница.
|
|
22
|
+
3. **Не выдумывать цифры**: пороги — из первоисточников; спорное — «проверить на актуальной версии» + дата.
|
|
23
|
+
4. **YMYL**: медицина — автор-врач, даты, источники, дисклеймер, без обещаний излечения.
|
|
24
|
+
5. **Не ломать существующее**: фиксируй «до»; смена URL = 301 + sitemap + ссылки.
|
|
25
|
+
6. **Доказывать**: `curl`/`view-source`, Rich Results Test, PSI/CWV, фрагмент HTML.
|
|
26
|
+
7. **Мета и контент — в исходном HTML** (SSR/SSG/prerender), не после JS.
|
|
27
|
+
8. **Google + Яндекс**: так, чтобы работало в обоих (`measurement.md` §10).
|
|
28
|
+
9. **Отчёт**: сделано, проверено (чем), что из P0/P1 осталось и почему.
|
|
29
|
+
|
|
30
|
+
### 1.2 Процесс — 8 шагов (1–3 до кода, 4–7 в коде, 8 после)
|
|
31
|
+
|
|
32
|
+
1. **Бриф и интент**: кто, что хочет, CTA, тип страницы → `content-seo.md`.
|
|
33
|
+
2. **Семантика**: Вордстат по региону, GSC; 1 кластер = 1 страница; частотность с датой.
|
|
34
|
+
3. **Архитектура**: URL ≤3–4 уровня, ≤3 клика, анкоры 2–6/1000 слов, без сирот → `on-page.md`.
|
|
35
|
+
4. **On-page**: `title` 50–60, `description` 140–160, один `H1`, `alt`, OG → `page-templates.md`.
|
|
36
|
+
5. **Техника**: 200 + indexable, canonical, 301 без цепочек, CWV, миграции → `technical-seo.md`.
|
|
37
|
+
6. **JSON-LD**: типы, FAQ-сниппета нет с 07.05.2026, поля = контент → `structured-data.md`.
|
|
38
|
+
7. **E-E-A-T**: автор-врач, даты, лицензия, источники, дисклеймер, NAP → `eeat-medical.md`.
|
|
39
|
+
8. **Измерение**: GSC + Вебмастер (регион, ИКС), GA4/Метрика, baseline, 2–4/8–12 недель → `measurement.md`.
|
|
40
|
+
|
|
41
|
+
**Lite-режим** (шаги сжимаются, но не пропускаются): `title` + `description` + `H1` · `canonical` + `index,follow` + OG · `header/main/article/footer`, `lang="ru"` · `alt`, размеры, lazy ниже фолда · 2–4 ссылки + крошки · JSON-LD минимального типа · гейт §3; аудит — `audit-checklist.md` §15.
|
|
42
|
+
|
|
43
|
+
### 1.3 YMYL-медицина
|
|
44
|
+
|
|
45
|
+
Автор-врач, рецензент, даты публикации и проверки, источники, дисклеймер, противопоказания, «когда срочно к врачу»; без обещаний излечения, запугивания, назначений «по интернету», выдуманных отзывов, цены ≠ прайс. Блокеры — `eeat-medical.md` §12.
|
|
46
|
+
|
|
47
|
+
### 1.4 Антипаттерны
|
|
48
|
+
|
|
49
|
+
keyword stuffing, скрытый текст, doorway, каннибализация, обещания излечения, `noindex` на деньгах, canonical на чужой URL, «мягкие 404», sitemap с 404, одинаковый `title`, lazy на LCP, выдуманные отзывы, миф про `llms.txt`. Разбор — `antipatterns.md`.
|
|
50
|
+
|
|
51
|
+
## 2. Куда грузить дальше
|
|
52
|
+
|
|
53
|
+
| Нужно | Файл | ≈токенов | Когда читать |
|
|
54
|
+
|---|---|---|---|
|
|
55
|
+
| Интент, кластеры | `references/content-seo.md` | 5 850 | новая страница |
|
|
56
|
+
| Мета, матрица страниц | `references/page-templates.md` | 2 250 | title/description |
|
|
57
|
+
| Статусы, robots, sitemap, canonical | `references/technical-seo.md` | 8 050 | техправка |
|
|
58
|
+
| Title/H1–H6, URL, анкоры, OG | `references/on-page.md` | 6 400 | вёрстка |
|
|
59
|
+
| JSON-LD: шаблоны, валидация | `references/structured-data.md` | 8 700 | разметка |
|
|
60
|
+
| Авторство, даты, NAP | `references/eeat-medical.md` | 7 100 | медицина |
|
|
61
|
+
| 107 проверок и отчёты | `references/audit-checklist.md` | 7 900 | аудит |
|
|
62
|
+
| GSC, Вебмастер, KPI, UTM | `references/measurement.md` | 7 250 | замеры |
|
|
63
|
+
| Laravel, Bitrix, React, статика | `references/stack-recipes.md` | 10 100 | код стека |
|
|
64
|
+
| Антипаттерны | `references/antipatterns.md` | 2 050 | сомнение |
|
|
65
|
+
|
|
66
|
+
Готовое — `assets/snippets/`, `assets/scripts/seo-audit.mjs`.
|
|
67
|
+
|
|
68
|
+
## 3. Гейт перед сдачей
|
|
69
|
+
|
|
70
|
+
Порог: P0 закрыты; P1 — в отчёт с причиной; 0 ошибок валидаторов.
|
|
71
|
+
|
|
72
|
+
- [ ] **P0** `title` 50–60 и уникальный; `description` 140–160; один `H1`, H2–H6 по порядку.
|
|
73
|
+
- [ ] **P0** 200, нет `noindex`/robots-запрета, `canonical` абсолютный, URL в `sitemap.xml`.
|
|
74
|
+
- [ ] **P0** JSON-LD валиден и = контент; не сирота, 2–6 контекстных ссылок.
|
|
75
|
+
- [ ] **P0** медицина: автор-врач, даты, источники, дисклеймер, лицензия.
|
|
76
|
+
- [ ] **P1** URL читаемый (смена — 301), OG/`og:image` 1200×630, крошки + `BreadcrumbList`, `alt`/размеры/lazy (LCP — без lazy)/WebP, CWV ≤2,5 с/≤200 мс/≤0,1 или план с датой.
|
|
77
|
+
- [ ] **P2** `lang`/charset/viewport/favicon; нет битых ссылок и цепочек.
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# assets — что здесь лежит и как пользоваться
|
|
2
|
+
|
|
3
|
+
## Структура
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
assets/
|
|
7
|
+
snippets/
|
|
8
|
+
meta.blade.php — Blade-компонент <x-seo.meta> целиком (title/desc/canonical/robots/OG/Twitter/JSON-LD)
|
|
9
|
+
jsonld-organization.json — Organization + MedicalClinic (граф сайта, @id организации)
|
|
10
|
+
jsonld-medical-clinic.json — филиал/главный корпус (локальное SEO: адрес, geo, часы)
|
|
11
|
+
jsonld-medical-webpage.json — MedicalWebPage (услуга/статья: аудитория, специальность, рецензент, даты)
|
|
12
|
+
jsonld-physician.json — Physician + Person (профиль врача)
|
|
13
|
+
jsonld-faq.json — FAQPage (валидно, но rich results в Google отключены с 07.05.2026)
|
|
14
|
+
jsonld-breadcrumb.json — BreadcrumbList (совпадает с видимыми крошками)
|
|
15
|
+
robots.txt — эталон robots.txt для Битрикс-сайта + частые ошибки
|
|
16
|
+
sitemap.xml — sitemap-индекс (по разделам)
|
|
17
|
+
sitemap-urlset-example.xml — пример одного urlset с правилами
|
|
18
|
+
scripts/
|
|
19
|
+
README.md — контракт интерфейса для seo-audit.mjs (делает qa-toolsmith, task-5)
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Правила использования
|
|
23
|
+
|
|
24
|
+
1. **Всё в snippets — эталоны, не «заливать как есть».** Везде плейсхолдеры: телефон `+7-495-000-00-00`,
|
|
25
|
+
адрес «ул. Новая, д. 12», лицензия `ЛО-77-01-000000`, geo, sameAs. Замените на реальные данные из
|
|
26
|
+
карточки организации/Яндекс Бизнеса — **один формат NAP по всему сайту**.
|
|
27
|
+
2. **JSON-файлы — чистый JSON** (без комментариев и висящих запятых), чтобы можно было сразу вставить
|
|
28
|
+
в `<script type="application/ld+json">` или прогнать валидатором. Пояснения — в `references/structured-data.md`
|
|
29
|
+
и в этом README.
|
|
30
|
+
3. **Один Organization на сайт.** Узел ставится на главной, на остальных страницах используется ссылка
|
|
31
|
+
`{"@id": "https://example.org/#organization"}`. Не дублируйте организацию с разными телефонами.
|
|
32
|
+
4. **Разметка = видимый контент.** Даты, цены, рейтинги, ФИО — только то, что есть на странице.
|
|
33
|
+
5. **Проверять после вставки:** https://search.google.com/test/rich-results и https://validator.schema.org.
|
|
34
|
+
6. **`medicalSpecialty`** — значения enum `MedicalSpecialty`: `Oncologic` (не `Oncology`), `Neurologic`,
|
|
35
|
+
`Cardiovascular`, `PrimaryCare`, `Radiography`, `Surgical`… Полный список — https://schema.org/MedicalSpecialty.
|
|
36
|
+
7. **Даты** — ISO 8601 (`2026-10-20`), время события — с часовым поясом (`2026-04-12T09:00:00+03:00`).
|
|
37
|
+
8. **URL** — абсолютные, https, тот же хост, что canonical/sitemap.
|
|
38
|
+
|
|
39
|
+
## Статусы разметки в Google на 2026
|
|
40
|
+
|
|
41
|
+
| Тип | Что даёт сейчас |
|
|
42
|
+
|---|---|
|
|
43
|
+
| `BreadcrumbList` | крошки в сниппете на **десктопе** (на мобильных не показываются с 01.2025) |
|
|
44
|
+
| `Organization` / `MedicalOrganization` | данные организации для знания/логотипа, доверие |
|
|
45
|
+
| `MedicalClinic` / `LocalBusiness` | локальные данные; `aggregateRating` собственных отзывов в rich results не показывается |
|
|
46
|
+
| `Physician` | связывание сущности врач↔организация, данные для ИИ-ответов |
|
|
47
|
+
| `MedicalWebPage` | аудитория/специальность/рецензент/даты — сигналы E-E-A-T |
|
|
48
|
+
| `Article` / `NewsArticle` | расширенный сниппет статьи (дата, автор, изображение) |
|
|
49
|
+
| `FAQPage` | **rich results отключены 07.05.2026**; разметка валидна, помогает пониманию |
|
|
50
|
+
| `Event` | rich results для офлайн-событий (онлайн больше не поддерживается) |
|
|
51
|
+
| `HowTo`, `SpecialAnnouncement` | не использовать (удалены) |
|
|
52
|
+
|
|
53
|
+
## Битрикс/Aspro: как вставлять
|
|
54
|
+
|
|
55
|
+
- `meta.blade.php` — пример для Laravel; в Битриксе логика та же, но через
|
|
56
|
+
`$APPLICATION->SetPageProperty('title'|'description'|'canonical')` и `AddHeadString(...)`.
|
|
57
|
+
- JSON-LD вставляйте в `header.php` шаблона `local/templates/aspro-allcorp3medc/` (через `AddHeadString`)
|
|
58
|
+
или в шаблон компонента; данные берите из свойств инфоблока (`SEO_TITLE`, `SEO_DESCRIPTION`, `ADDRESS`,
|
|
59
|
+
`PHONE`, `LICENSE`), а не хардкодьте.
|
|
60
|
+
- `robots.txt` и `sitemap.xml` в Битриксе **генерируются модулем «Поисковая оптимизация»** — файлы здесь
|
|
61
|
+
нужны как эталон для сверки, а не для копирования поверх автогенерации.
|
|
62
|
+
|
|
63
|
+
## Скрипты
|
|
64
|
+
|
|
65
|
+
`scripts/` — место для инструмента `seo-audit.mjs` (делает qa-toolsmith, task-5). Контракт — в
|
|
66
|
+
`scripts/README.md`. Пока файла нет, проверяйте страницу вручную по `references/audit-checklist.md`.
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
Apache License
|
|
2
|
+
Version 2.0, January 2004
|
|
3
|
+
http://www.apache.org/licenses/
|
|
4
|
+
|
|
5
|
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
6
|
+
|
|
7
|
+
1. Definitions.
|
|
8
|
+
|
|
9
|
+
"License" shall mean the terms and conditions for use, reproduction,
|
|
10
|
+
and distribution as defined by Sections 1 through 9 of this document.
|
|
11
|
+
|
|
12
|
+
"Licensor" shall mean the copyright owner or entity authorized by
|
|
13
|
+
the copyright owner that is granting the License.
|
|
14
|
+
|
|
15
|
+
"Legal Entity" shall mean the union of the acting entity and all
|
|
16
|
+
other entities that control, are controlled by, or are under common
|
|
17
|
+
control with that entity. For the purposes of this definition,
|
|
18
|
+
"control" means (i) the power, direct or indirect, to cause the
|
|
19
|
+
direction or management of such entity, whether by contract or
|
|
20
|
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
21
|
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
22
|
+
|
|
23
|
+
"You" (or "Your") shall mean an individual or Legal Entity
|
|
24
|
+
exercising permissions granted by this License.
|
|
25
|
+
|
|
26
|
+
"Source" form shall mean the preferred form for making modifications,
|
|
27
|
+
including but not limited to software source code, documentation
|
|
28
|
+
source, and configuration files.
|
|
29
|
+
|
|
30
|
+
"Object" form shall mean any form resulting from mechanical
|
|
31
|
+
transformation or translation of a Source form, including but
|
|
32
|
+
not limited to compiled object code, generated documentation,
|
|
33
|
+
and conversions to other media types.
|
|
34
|
+
|
|
35
|
+
"Work" shall mean the work of authorship, whether in Source or
|
|
36
|
+
Object form, made available under the License, as indicated by a
|
|
37
|
+
copyright notice that is included in or attached to the work
|
|
38
|
+
(an example is provided in the Appendix below).
|
|
39
|
+
|
|
40
|
+
"Derivative Works" shall mean any work, whether in Source or Object
|
|
41
|
+
form, that is based on (or derived from) the Work and for which the
|
|
42
|
+
editorial revisions, annotations, elaborations, or other modifications
|
|
43
|
+
represent, as a whole, an original work of authorship. For the purposes
|
|
44
|
+
of this License, Derivative Works shall not include works that remain
|
|
45
|
+
separable from, or merely link (or bind by name) to the interfaces of,
|
|
46
|
+
the Work and Derivative Works thereof.
|
|
47
|
+
|
|
48
|
+
"Contribution" shall mean any work of authorship, including
|
|
49
|
+
the original version of the Work and any modifications or additions
|
|
50
|
+
to that Work or Derivative Works thereof, that is intentionally
|
|
51
|
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
52
|
+
or by an individual or Legal Entity authorized to submit on behalf of
|
|
53
|
+
the copyright owner. For the purposes of this definition, "submitted"
|
|
54
|
+
means any form of electronic, verbal, or written communication sent
|
|
55
|
+
to the Licensor or its representatives, including but not limited to
|
|
56
|
+
communication on electronic mailing lists, source code control systems,
|
|
57
|
+
and issue tracking systems that are managed by, or on behalf of, the
|
|
58
|
+
Licensor for the purpose of discussing and improving the Work, but
|
|
59
|
+
excluding communication that is conspicuously marked or otherwise
|
|
60
|
+
designated in writing by the copyright owner as "Not a Contribution."
|
|
61
|
+
|
|
62
|
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
63
|
+
on behalf of whom a Contribution has been received by Licensor and
|
|
64
|
+
subsequently incorporated within the Work.
|
|
65
|
+
|
|
66
|
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
67
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
68
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
69
|
+
copyright license to reproduce, prepare Derivative Works of,
|
|
70
|
+
publicly display, publicly perform, sublicense, and distribute the
|
|
71
|
+
Work and such Derivative Works in Source or Object form.
|
|
72
|
+
|
|
73
|
+
3. Grant of Patent License. Subject to the terms and conditions of
|
|
74
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
75
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
76
|
+
(except as stated in this section) patent license to make, have made,
|
|
77
|
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
78
|
+
where such license applies only to those patent claims licensable
|
|
79
|
+
by such Contributor that are necessarily infringed by their
|
|
80
|
+
Contribution(s) alone or by combination of their Contribution(s)
|
|
81
|
+
with the Work to which such Contribution(s) was submitted. If You
|
|
82
|
+
institute patent litigation against any entity (including a
|
|
83
|
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
84
|
+
or a Contribution incorporated within the Work constitutes direct
|
|
85
|
+
or contributory patent infringement, then any patent licenses
|
|
86
|
+
granted to You under this License for that Work shall terminate
|
|
87
|
+
as of the date such litigation is filed.
|
|
88
|
+
|
|
89
|
+
4. Redistribution. You may reproduce and distribute copies of the
|
|
90
|
+
Work or Derivative Works thereof in any medium, with or without
|
|
91
|
+
modifications, and in Source or Object form, provided that You
|
|
92
|
+
meet the following conditions:
|
|
93
|
+
|
|
94
|
+
(a) You must give any other recipients of the Work or
|
|
95
|
+
Derivative Works a copy of this License; and
|
|
96
|
+
|
|
97
|
+
(b) You must cause any modified files to carry prominent notices
|
|
98
|
+
stating that You changed the files; and
|
|
99
|
+
|
|
100
|
+
(c) You must retain, in the Source form of any Derivative Works
|
|
101
|
+
that You distribute, all copyright, patent, trademark, and
|
|
102
|
+
attribution notices from the Source form of the Work,
|
|
103
|
+
excluding those notices that do not pertain to any part of
|
|
104
|
+
the Derivative Works; and
|
|
105
|
+
|
|
106
|
+
(d) If the Work includes a "NOTICE" text file as part of its
|
|
107
|
+
distribution, then any Derivative Works that You distribute must
|
|
108
|
+
include a readable copy of the attribution notices contained
|
|
109
|
+
within such NOTICE file, excluding those notices that do not
|
|
110
|
+
pertain to any part of the Derivative Works, in at least one
|
|
111
|
+
of the following places: within a NOTICE text file distributed
|
|
112
|
+
as part of the Derivative Works; within the Source form or
|
|
113
|
+
documentation, if provided along with the Derivative Works; or,
|
|
114
|
+
within a display generated by the Derivative Works, if and
|
|
115
|
+
wherever such third-party notices normally appear. The contents
|
|
116
|
+
of the NOTICE file are for informational purposes only and
|
|
117
|
+
do not modify the License. You may add Your own attribution
|
|
118
|
+
notices within Derivative Works that You distribute, alongside
|
|
119
|
+
or as an addendum to the NOTICE text from the Work, provided
|
|
120
|
+
that such additional attribution notices cannot be construed
|
|
121
|
+
as modifying the License.
|
|
122
|
+
|
|
123
|
+
You may add Your own copyright statement to Your modifications and
|
|
124
|
+
may provide additional or different license terms and conditions
|
|
125
|
+
for use, reproduction, or distribution of Your modifications, or
|
|
126
|
+
for any such Derivative Works as a whole, provided Your use,
|
|
127
|
+
reproduction, and distribution of the Work otherwise complies with
|
|
128
|
+
the conditions stated in this License.
|
|
129
|
+
|
|
130
|
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
131
|
+
any Contribution intentionally submitted for inclusion in the Work
|
|
132
|
+
by You to the Licensor shall be under the terms and conditions of
|
|
133
|
+
this License, without any additional terms or conditions.
|
|
134
|
+
Notwithstanding the above, nothing herein shall supersede or modify
|
|
135
|
+
the terms of any separate license agreement you may have executed
|
|
136
|
+
with Licensor regarding such Contributions.
|
|
137
|
+
|
|
138
|
+
6. Trademarks. This License does not grant permission to use the trade
|
|
139
|
+
names, trademarks, service marks, or product names of the Licensor,
|
|
140
|
+
except as required for reasonable and customary use in describing the
|
|
141
|
+
origin of the Work and reproducing the content of the NOTICE file.
|
|
142
|
+
|
|
143
|
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
144
|
+
agreed to in writing, Licensor provides the Work (and each
|
|
145
|
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
146
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
147
|
+
implied, including, without limitation, any warranties or conditions
|
|
148
|
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
149
|
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
150
|
+
appropriateness of using or redistributing the Work and assume any
|
|
151
|
+
risks associated with Your exercise of permissions under this License.
|
|
152
|
+
|
|
153
|
+
8. Limitation of Liability. In no event and under no legal theory,
|
|
154
|
+
whether in tort (including negligence), contract, or otherwise,
|
|
155
|
+
unless required by applicable law (such as deliberate and grossly
|
|
156
|
+
negligent acts) or agreed to in writing, shall any Contributor be
|
|
157
|
+
liable to You for damages, including any direct, indirect, special,
|
|
158
|
+
incidental, or consequential damages of any character arising as a
|
|
159
|
+
result of this License or out of the use or inability to use the
|
|
160
|
+
Work (including but not limited to damages for loss of goodwill,
|
|
161
|
+
work stoppage, computer failure or malfunction, or any and all
|
|
162
|
+
other commercial damages or losses), even if such Contributor
|
|
163
|
+
has been advised of the possibility of such damages.
|
|
164
|
+
|
|
165
|
+
9. Accepting Warranty or Additional Liability. While redistributing
|
|
166
|
+
the Work or Derivative Works thereof, You may choose to offer,
|
|
167
|
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
168
|
+
or other liability obligations and/or rights consistent with this
|
|
169
|
+
License. However, in accepting such obligations, You may act only
|
|
170
|
+
on Your own behalf and on Your sole responsibility, not on behalf
|
|
171
|
+
of any other Contributor, and only if You agree to indemnify,
|
|
172
|
+
defend, and hold each Contributor harmless for any liability
|
|
173
|
+
incurred by, or claims asserted against, such Contributor by reason
|
|
174
|
+
of your accepting any such warranty or additional liability.
|
|
175
|
+
|
|
176
|
+
END OF TERMS AND CONDITIONS
|
|
177
|
+
|
|
178
|
+
APPENDIX: How to apply the Apache License to your work.
|
|
179
|
+
|
|
180
|
+
To apply the Apache License to your work, attach the following
|
|
181
|
+
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
182
|
+
replaced with your own identifying information. (Don't include
|
|
183
|
+
the brackets!) The text should be enclosed in the appropriate
|
|
184
|
+
comment syntax for the file format. We also recommend that a
|
|
185
|
+
file or class name and description of purpose be included on the
|
|
186
|
+
same "printed page" as the copyright notice for easier
|
|
187
|
+
identification within third-party archives.
|
|
188
|
+
|
|
189
|
+
Portions Copyright (c) Microsoft Corporation.
|
|
190
|
+
Portions Copyright 2017 Google Inc.
|
|
191
|
+
|
|
192
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
193
|
+
you may not use this file except in compliance with the License.
|
|
194
|
+
You may obtain a copy of the License at
|
|
195
|
+
|
|
196
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
197
|
+
|
|
198
|
+
Unless required by applicable law or agreed to in writing, software
|
|
199
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
200
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
201
|
+
See the License for the specific language governing permissions and
|
|
202
|
+
limitations under the License.
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
# seo-audit — технический SEO-аудитор страницы
|
|
2
|
+
|
|
3
|
+
CLI-инструмент для проверки технического SEO, структурированных данных и Core Web Vitals одной страницы.
|
|
4
|
+
Работает через уже запущенный headless Chrome по CDP (`http://127.0.0.1:9333`) и общую инфраструктуру
|
|
5
|
+
`tools/design-qa/lib` (fallback-запуск браузера там же).
|
|
6
|
+
|
|
7
|
+
| | |
|
|
8
|
+
|---|---|
|
|
9
|
+
| Вход | локальный HTML-файл (`file://`) или URL (`http://`/`https://`) |
|
|
10
|
+
| Выход | `seo-audit.json` + `seo-audit.md` (или `<name>-seo-audit.*`) в `--out` (по умолчанию `tmp/qa-artifacts/`) |
|
|
11
|
+
| Коды выхода | `0` — нет critical/serious; `2` — есть critical/serious; `1` — сбой инструмента |
|
|
12
|
+
|
|
13
|
+
## Требования
|
|
14
|
+
|
|
15
|
+
- Node.js 24.
|
|
16
|
+
- Chrome с `--remote-debugging-port=9333` (уже запущен в окружении). Если CDP недоступен — auditor
|
|
17
|
+
поднимет `chrome.exe` из `ms-playwright` с временным профилем (см. `tools/design-qa/lib/browser.mjs`).
|
|
18
|
+
- `playwright-core` берётся из `tools/design-qa/node_modules` (общая QA-инфраструктура).
|
|
19
|
+
Ставить ничего не нужно.
|
|
20
|
+
- Переопределения: `--cdp <url>` / env `CDP_URL`, путь к браузеру — env `CHROME_PATH`.
|
|
21
|
+
|
|
22
|
+
## Быстрый старт
|
|
23
|
+
|
|
24
|
+
```powershell
|
|
25
|
+
cd %USERPROFILE%\Documents\deepseek-harness\default-workspace
|
|
26
|
+
|
|
27
|
+
# Локальная страница
|
|
28
|
+
node tools/seo-audit/seo-audit.mjs projects/design-kit/pages/hospital.html --name seo-hospital
|
|
29
|
+
|
|
30
|
+
# Реальный сайт (read-only, 1 страница)
|
|
31
|
+
node tools/seo-audit/seo-audit.mjs https://example.org/ --name seo-service-desk --max-links 80
|
|
32
|
+
|
|
33
|
+
# JSON в stdout (для автоматизации), логи — в stderr
|
|
34
|
+
node tools/seo-audit/seo-audit.mjs https://example.org/ --json > seo.json
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Опции
|
|
38
|
+
|
|
39
|
+
| Опция | Описание |
|
|
40
|
+
|---|---|
|
|
41
|
+
| `--out <dir>` | Каталог отчётов (по умолчанию `tmp/qa-artifacts`) |
|
|
42
|
+
| `--name <name>` | Имена файлов `<name>-seo-audit.json` / `<name>-seo-audit.md`; без `--name` — `seo-audit.json` / `seo-audit.md` |
|
|
43
|
+
| `--viewports <list>` | `desktop` (по умолчанию), `mobile`, или `1440x900,390x844` |
|
|
44
|
+
| `--max-links <n>` | Сколько same-origin ссылок проверить на битость (по умолчанию 80, максимум 400) |
|
|
45
|
+
| `--no-links` | Не проверять битые ссылки (быстрее) |
|
|
46
|
+
| `--no-robots` | Не запрашивать `robots.txt` / `sitemap.xml` |
|
|
47
|
+
| `--serve` | Отдать локальную страницу локальным HTTP-сервером (для `<script type="module">`/fetch) |
|
|
48
|
+
| `--cdp <url>` | CDP-эндпоинт (по умолчанию env `CDP_URL` или `http://127.0.0.1:9333`) |
|
|
49
|
+
| `--timeout <ms>` | Таймаут загрузки страницы (по умолчанию 30000) |
|
|
50
|
+
| `--json` | Полный JSON в stdout (логи — в stderr) |
|
|
51
|
+
| `-h, --help` | Справка |
|
|
52
|
+
|
|
53
|
+
## Что проверяется
|
|
54
|
+
|
|
55
|
+
### Meta и индексируемость
|
|
56
|
+
- `title`: наличие, длина 30–65 символов, отсутствие дублей `<title>` на странице;
|
|
57
|
+
- `meta description`: наличие, длина 70–160 символов, дубли;
|
|
58
|
+
- `html lang`: наличие и формат;
|
|
59
|
+
- `meta charset` / кодировка;
|
|
60
|
+
- `meta viewport`: наличие `width=device-width`, не блокируется ли зум;
|
|
61
|
+
- `robots` meta и `X-Robots-Tag`: `noindex` → **critical**, `nofollow` → moderate;
|
|
62
|
+
- `link rel="canonical"`: наличие, ровно один, абсолютный, self-referencing;
|
|
63
|
+
- `robots.txt`, `sitemap.xml` (только для http/https): доступность, `Disallow: /` для `*`,
|
|
64
|
+
наличие URL страницы в sitemap (поддерживается sitemap-index + первый дочерний sitemap).
|
|
65
|
+
|
|
66
|
+
### Заголовки
|
|
67
|
+
- ровно один непустой `h1` (0 или >1 → serious);
|
|
68
|
+
- порядок `h1 → h2 → h3` без пропуска уровней.
|
|
69
|
+
|
|
70
|
+
### Open Graph / Twitter
|
|
71
|
+
- `og:title`, `og:description`, `og:image`, `og:url` (отсутствие → moderate);
|
|
72
|
+
- `og:image` абсолютный и не SVG (SVG соцсети не отображают);
|
|
73
|
+
- `twitter:card` (minor).
|
|
74
|
+
|
|
75
|
+
### JSON-LD schema.org
|
|
76
|
+
- валидность JSON (**critical** при ошибке парсинга), `@context`, `@type`;
|
|
77
|
+
- обязательные поля для типов: `Organization`, `MedicalClinic`/`MedicalOrganization`/`Hospital`/
|
|
78
|
+
`LocalBusiness` (name + address), `MedicalWebPage`, `WebPage`, `WebSite`, `Physician`, `Article`/
|
|
79
|
+
`NewsArticle`/`BlogPosting` (headline + author + datePublished), `FAQPage` (mainEntity → Question →
|
|
80
|
+
acceptedAnswer.text), `BreadcrumbList` (itemListElement → position + name/item), `Product`;
|
|
81
|
+
- поддержка `@graph` и массивов.
|
|
82
|
+
|
|
83
|
+
### Изображения
|
|
84
|
+
- отсутствие `alt` (важно также для доступности);
|
|
85
|
+
- отсутствие `width`/`height` (риск CLS);
|
|
86
|
+
- `loading="lazy"` ниже первого экрана;
|
|
87
|
+
- доля устаревших форматов (PNG/JPEG/GIF) — рекомендация WebP/AVIF.
|
|
88
|
+
|
|
89
|
+
### Ссылки
|
|
90
|
+
- пустые анкоры без текста/`aria-label` (moderate);
|
|
91
|
+
- `href="#"`, пустой `href=""`, `javascript:` (moderate/minor);
|
|
92
|
+
- `target="_blank"` без `rel="noopener"` (minor);
|
|
93
|
+
- битые **same-origin** ссылки: HEAD-запрос (при 403/405/501 — GET), `4xx/5xx` и сетевые ошибки →
|
|
94
|
+
**serious**; внешние ссылки не хаммерятся (только считаются);
|
|
95
|
+
- якоря `#id` без цели на странице (moderate);
|
|
96
|
+
- ссылки на `http://` (minor), mixed content на https (serious).
|
|
97
|
+
|
|
98
|
+
### hreflang
|
|
99
|
+
- формат (`ru`, `en-US`, `x-default`), абсолютность, дубли, наличие `x-default` (minor).
|
|
100
|
+
|
|
101
|
+
### Производительность / Core Web Vitals
|
|
102
|
+
- **LCP** через PerformanceObserver: >4 c → critical, >2.5 c → serious;
|
|
103
|
+
- **CLS** через PerformanceObserver: >0.25 → serious, >0.1 → moderate;
|
|
104
|
+
- TTFB, число длинных задач, размер HTML (150 КБ / 600 КБ), число запросов (100),
|
|
105
|
+
суммарный вес (3 / 6 МБ), размер DOM (800 / 1500 элементов);
|
|
106
|
+
- render-blocking CSS (>4 в `<head>`) и синхронные скрипты в `<head>`;
|
|
107
|
+
- отсутствие gzip/brotli для HTML (только http/https);
|
|
108
|
+
- **INP** в headless-браузере не измеряется (нет взаимодействий) — отчёт явно это указывает;
|
|
109
|
+
для INP использовать PageSpeed Insights / поле.
|
|
110
|
+
|
|
111
|
+
Severity: `critical` и `serious` влияют на код выхода (2), `moderate`/`minor` — нет.
|
|
112
|
+
|
|
113
|
+
## Как читать отчёт
|
|
114
|
+
|
|
115
|
+
`seo-audit.md` содержит:
|
|
116
|
+
|
|
117
|
+
1. **Вердикт** и метрики (LCP, CLS, TTFB, HTML, запросов, вес, DOM, HTTP-статус, код выхода).
|
|
118
|
+
2. **Что чинить в первую очередь** — топ-10 с готовыми рекомендациями.
|
|
119
|
+
3. **Сводка по категориям** (critical/serious/moderate/minor по meta, indexing, headings, schema, images, links, performance…).
|
|
120
|
+
4. Разделы: Meta и индексируемость, Заголовки, JSON-LD, Open Graph/Twitter, Изображения, Ссылки,
|
|
121
|
+
hreflang, Производительность/CWV, Mixed content, robots.txt/sitemap.xml.
|
|
122
|
+
5. Таблица всех замечаний `severity | id | что не так`.
|
|
123
|
+
|
|
124
|
+
`seo-audit.json` — машиночитаемо: `summary` (counts, verdict, exitCode, metrics),
|
|
125
|
+
`issues[]` (`id`, `severity`, `category`, `help`, `fix`, `nodes`), `pages[]` (сырые данные по каждому
|
|
126
|
+
viewport: meta, headings, images, links, resources, perf), `schema`, `hreflang`, `robots`, `sitemap`,
|
|
127
|
+
`performance`, `meta`, `http`.
|
|
128
|
+
|
|
129
|
+
## Проверка инструмента на фикстуре
|
|
130
|
+
|
|
131
|
+
`fixtures/bad-seo.html` — намеренно проблемная страница: нет canonical/OG/JSON-LD, два H1, пропуск h2,
|
|
132
|
+
битый JSON-LD, noindex, картинки без alt, битые/пустые ссылки, http-ссылки, дубли title/description,
|
|
133
|
+
5 render-blocking CSS, блокирующий скрипт.
|
|
134
|
+
|
|
135
|
+
```powershell
|
|
136
|
+
node tools/seo-audit/seo-audit.mjs tools/seo-audit/fixtures/bad-seo.html --name seo-bad --max-links 20
|
|
137
|
+
# ожидается FAIL (exit 2): ≈2 critical, ≈9–10 serious, ≈10 moderate, ≈5 minor
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Результаты реальных прогонов (2026-11-04)
|
|
141
|
+
|
|
142
|
+
| страница | вердикт | critical | serious | moderate | minor | LCP | CLS |
|
|
143
|
+
|---|---|---:|---:|---:|---:|---|---|
|
|
144
|
+
| `projects/design-kit/pages/hospital.html` | FAIL | 0 | 1 (canonical) | 2 (OG, JSON-LD) | 2 | 924 мс | 0.003 |
|
|
145
|
+
| `projects/design-kit/pages/dashboard.html` | FAIL | 0 | 1 (canonical) | 2 (OG, JSON-LD) | 2 | 136 мс | 0.001 |
|
|
146
|
+
| `projects/design-kit/showcase.html` | FAIL | 0 | 1 (canonical) | 2 (OG, JSON-LD) | 4 | 984 мс | 0.000 |
|
|
147
|
+
| `https://example.org/` | FAIL | 0 | 3 (canonical, H1 нет, alt у 8 img) | 10 | 6 | 540 мс | 0.004 |
|
|
148
|
+
|
|
149
|
+
Демо-страницы дизайн-кита на `file://` не имеют canonical/OG/JSON-LD и не являются индексируемыми
|
|
150
|
+
продакшн-страницами — для них это ожидаемые замечания, инструмент показывает их корректно.
|
|
151
|
+
Для example.org найдено: нет `<h1>` на главной, нет canonical и JSON-LD, 8 изображений без alt,
|
|
152
|
+
25 без width/height, 22 ссылки с пустым href, 8 блокирующих скриптов в `<head>`, тяжёлый DOM (3426),
|
|
153
|
+
description 181 символ, `maximum-scale=1` блокирует зум, `og:image` — SVG, sitemap — индекс из 13 файлов.
|
|
154
|
+
|
|
155
|
+
## Ограничения
|
|
156
|
+
|
|
157
|
+
- Проверяется **одна страница**, это не краулер: не проверяются дубли между страницами, битые ссылки
|
|
158
|
+
на другие страницы (только same-origin HEAD по ссылкам текущей страницы), вложенность.
|
|
159
|
+
- Внешние ссылки не запрашиваются (HEAD только same-origin) — чтобы не создавать нагрузку чужим сайтам.
|
|
160
|
+
- LCP/CLS зависят от окружения (headless + CDP, без троттлинга сети/CPU): сравнивать между итерациями
|
|
161
|
+
в одном окружении, не как абсолютные полевые значения.
|
|
162
|
+
- INP не измеряется (нет пользовательских взаимодействий в headless).
|
|
163
|
+
- `robots.txt`/`sitemap.xml` проверяются только для `http(s)://` (для `file://` — раздел отчёта пуст).
|
|
164
|
+
- Sitemap-index забирает только первый дочерний sitemap (1 доп. запрос), наличие URL в остальных не проверяется.
|
|
165
|
+
- JSON-LD-валидация структурная (поля/типы), без полного schema.org-валидатора и без проверки E-E-A-T/YMYL
|
|
166
|
+
контента; медицинская тематика требует отдельной экспертной проверки (см. скилл `seo`).
|
|
167
|
+
- Инструмент не заменяет PageSpeed Insights / Search Console (полевые данные, реальные пользователи).
|
|
168
|
+
|
|
169
|
+
## Состав каталога
|
|
170
|
+
|
|
171
|
+
```
|
|
172
|
+
tools/seo-audit/
|
|
173
|
+
seo-audit.mjs # аудитор
|
|
174
|
+
fixtures/bad-seo.html # фикстура с нарушениями
|
|
175
|
+
README.md # этот файл
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
Зависимость: `tools/design-qa/lib/{args,browser}.mjs` и `tools/design-qa/node_modules/playwright-core`
|
|
179
|
+
(единая QA-инфраструктура; при переносе инструмента в другой профиль — переносить вместе с `tools/design-qa`).
|