dsh-desktop-kit 0.0.0-stage → 1.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.
Files changed (177) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +87 -2
  3. package/client.js +3349 -0
  4. package/cordis.patch.yml +5 -0
  5. package/index.js +80 -0
  6. package/package.json +60 -4
  7. package/plugins/dsh-gkb-ru-ui/cordis.patch.yml +6 -0
  8. package/plugins/dsh-gkb-ru-ui/lib/client.js +1083 -0
  9. package/plugins/dsh-gkb-ru-ui/lib/index.js +142 -0
  10. package/plugins/dsh-gkb-ru-ui/lib/skills.js +376 -0
  11. package/plugins/dsh-gkb-ru-ui/package.json +28 -0
  12. package/plugins/dsh-peak-guard/README.md +70 -0
  13. package/plugins/dsh-peak-guard/client.js +741 -0
  14. package/plugins/dsh-peak-guard/cordis.patch.yml +5 -0
  15. package/plugins/dsh-peak-guard/icon.svg +12 -0
  16. package/plugins/dsh-peak-guard/index.js +2 -0
  17. package/plugins/dsh-peak-guard/locale/en.json +6 -0
  18. package/plugins/dsh-peak-guard/locale/ru.json +6 -0
  19. package/plugins/dsh-peak-guard/locale/zh.json +6 -0
  20. package/plugins/dsh-peak-guard/package.json +33 -0
  21. package/plugins/dsh-profile-transfer/README.md +62 -0
  22. package/plugins/dsh-profile-transfer/bootstrap/01-INSTALL.cmd +7 -0
  23. package/plugins/dsh-profile-transfer/bootstrap/README-ARCHIVE.md +54 -0
  24. 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
  25. package/plugins/dsh-profile-transfer/bootstrap/install-on-clean-machine.ps1 +119 -0
  26. 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
  27. package/plugins/dsh-profile-transfer/client.js +806 -0
  28. package/plugins/dsh-profile-transfer/cordis.patch.yml +3 -0
  29. package/plugins/dsh-profile-transfer/icon.svg +13 -0
  30. package/plugins/dsh-profile-transfer/index.js +375 -0
  31. package/plugins/dsh-profile-transfer/locale/en.json +6 -0
  32. package/plugins/dsh-profile-transfer/locale/ru.json +6 -0
  33. package/plugins/dsh-profile-transfer/locale/zh.json +6 -0
  34. package/plugins/dsh-profile-transfer/package.json +36 -0
  35. package/plugins/dsh-profile-transfer/transfer.js +1004 -0
  36. package/plugins/dsh-project-memory/README.md +71 -0
  37. package/plugins/dsh-project-memory/cordis.patch.yml +4 -0
  38. package/plugins/dsh-project-memory/icon.svg +12 -0
  39. package/plugins/dsh-project-memory/index.js +1240 -0
  40. package/plugins/dsh-project-memory/locale/en.json +6 -0
  41. package/plugins/dsh-project-memory/locale/ru.json +6 -0
  42. package/plugins/dsh-project-memory/locale/zh.json +6 -0
  43. package/plugins/dsh-project-memory/package.json +26 -0
  44. package/plugins/dsh-session-move/README.md +67 -0
  45. package/plugins/dsh-session-move/client.js +719 -0
  46. package/plugins/dsh-session-move/cordis.patch.yml +5 -0
  47. package/plugins/dsh-session-move/icon.svg +14 -0
  48. package/plugins/dsh-session-move/index.js +497 -0
  49. package/plugins/dsh-session-move/locale/en.json +6 -0
  50. package/plugins/dsh-session-move/locale/ru.json +6 -0
  51. package/plugins/dsh-session-move/locale/zh.json +6 -0
  52. package/plugins/dsh-session-move/package.json +31 -0
  53. package/skills/code-review-checklist/SKILL.md +37 -0
  54. package/skills/content-writing/README.md +87 -0
  55. package/skills/content-writing/SKILL.md +348 -0
  56. package/skills/content-writing/assets/checklists/fact-check.md +53 -0
  57. package/skills/content-writing/assets/checklists/publish.md +65 -0
  58. package/skills/content-writing/assets/checklists/social.md +40 -0
  59. package/skills/content-writing/assets/templates/article.md +47 -0
  60. package/skills/content-writing/assets/templates/brief.md +44 -0
  61. package/skills/content-writing/assets/templates/doctor-card.md +41 -0
  62. package/skills/content-writing/assets/templates/image-prompts.md +128 -0
  63. package/skills/content-writing/assets/templates/post-telegram.md +36 -0
  64. package/skills/content-writing/assets/templates/post-vk.md +42 -0
  65. package/skills/content-writing/assets/templates/press-release.md +56 -0
  66. package/skills/content-writing/assets/templates/science-pop-note.md +55 -0
  67. package/skills/content-writing/assets/templates/service-card.md +46 -0
  68. package/skills/content-writing/references/anti-ai-style.md +248 -0
  69. package/skills/content-writing/references/editing.md +185 -0
  70. package/skills/content-writing/references/fact-checking.md +205 -0
  71. package/skills/content-writing/references/government-medical.md +246 -0
  72. package/skills/content-writing/references/images.md +212 -0
  73. package/skills/content-writing/references/journalism.md +252 -0
  74. package/skills/content-writing/references/science-popular.md +218 -0
  75. package/skills/content-writing/references/seo-content.md +172 -0
  76. package/skills/content-writing/references/social-media.md +253 -0
  77. package/skills/content-writing/references/templates.md +291 -0
  78. package/skills/database-safety/SKILL.md +31 -0
  79. package/skills/debugging-playbook/SKILL.md +39 -0
  80. package/skills/design-critique/SKILL.md +118 -0
  81. package/skills/dev-workflow/SKILL.md +41 -0
  82. package/skills/git-and-ci/SKILL.md +40 -0
  83. package/skills/pg-upgrade-verify/SKILL.md +48 -0
  84. package/skills/project-deep-dive/SKILL.md +170 -0
  85. package/skills/project-deep-dive/references/recon-commands.md +78 -0
  86. package/skills/project-deep-dive/references/section-templates.md +102 -0
  87. package/skills/project-memory-maintenance/SKILL.md +170 -0
  88. package/skills/project-memory-maintenance/references/journal-template.md +48 -0
  89. package/skills/project-memory-maintenance/references/section-rules.md +57 -0
  90. package/skills/release-and-deploy/SKILL.md +39 -0
  91. package/skills/requirements-and-planning/SKILL.md +115 -0
  92. package/skills/security-review/SKILL.md +36 -0
  93. package/skills/seo/README.md +60 -0
  94. package/skills/seo/SKILL.md +329 -0
  95. package/skills/seo/assets/README.md +66 -0
  96. package/skills/seo/assets/scripts/LICENSE-playwright-core.txt +202 -0
  97. package/skills/seo/assets/scripts/README.md +179 -0
  98. package/skills/seo/assets/scripts/lib/args.mjs +105 -0
  99. package/skills/seo/assets/scripts/lib/browser.mjs +620 -0
  100. package/skills/seo/assets/scripts/lib/zip.mjs +191 -0
  101. package/skills/seo/assets/scripts/seo-audit.mjs +1675 -0
  102. package/skills/seo/assets/snippets/jsonld-breadcrumb.json +30 -0
  103. package/skills/seo/assets/snippets/jsonld-faq.json +39 -0
  104. package/skills/seo/assets/snippets/jsonld-medical-clinic.json +49 -0
  105. package/skills/seo/assets/snippets/jsonld-medical-webpage.json +33 -0
  106. package/skills/seo/assets/snippets/jsonld-organization.json +74 -0
  107. package/skills/seo/assets/snippets/jsonld-physician.json +46 -0
  108. package/skills/seo/assets/snippets/meta.blade.php +61 -0
  109. package/skills/seo/assets/snippets/robots.txt +61 -0
  110. package/skills/seo/assets/snippets/sitemap-urlset-example.xml +72 -0
  111. package/skills/seo/assets/snippets/sitemap.xml +36 -0
  112. package/skills/seo/references/audit-checklist.md +305 -0
  113. package/skills/seo/references/content-seo.md +198 -0
  114. package/skills/seo/references/eeat-medical.md +217 -0
  115. package/skills/seo/references/measurement.md +223 -0
  116. package/skills/seo/references/on-page.md +209 -0
  117. package/skills/seo/references/stack-recipes.md +693 -0
  118. package/skills/seo/references/structured-data.md +485 -0
  119. package/skills/seo/references/technical-seo.md +294 -0
  120. package/skills/service-desk-conventions/SKILL.md +40 -0
  121. package/skills/service-desk-db-safety/SKILL.md +52 -0
  122. package/skills/service-desk-release/SKILL.md +43 -0
  123. package/skills/service-desk-testing/SKILL.md +47 -0
  124. package/skills/service-desk-ui/SKILL.md +33 -0
  125. package/skills/skills-router/SKILL.md +91 -0
  126. package/skills/testing-strategy/SKILL.md +37 -0
  127. package/skills/ui-design-system/SKILL.md +45 -0
  128. package/skills/web-research/SKILL.md +40 -0
  129. package/skills/wow-design/SKILL.md +168 -0
  130. package/skills/wow-design/assets/kit/README.md +195 -0
  131. package/skills/wow-design/assets/kit/assets/css/base.css +158 -0
  132. package/skills/wow-design/assets/kit/assets/css/components.css +1001 -0
  133. package/skills/wow-design/assets/kit/assets/css/fonts.css +73 -0
  134. package/skills/wow-design/assets/kit/assets/css/pages.css +737 -0
  135. package/skills/wow-design/assets/kit/assets/css/tokens.css +218 -0
  136. package/skills/wow-design/assets/kit/assets/fonts/LICENSE-golos-text.txt +93 -0
  137. package/skills/wow-design/assets/kit/assets/fonts/LICENSE-lora.txt +93 -0
  138. package/skills/wow-design/assets/kit/assets/fonts/LICENSE-unbounded.txt +93 -0
  139. package/skills/wow-design/assets/kit/assets/fonts/golos-text-cyrillic-400-normal.woff2 +0 -0
  140. package/skills/wow-design/assets/kit/assets/fonts/golos-text-cyrillic-500-normal.woff2 +0 -0
  141. package/skills/wow-design/assets/kit/assets/fonts/golos-text-cyrillic-600-normal.woff2 +0 -0
  142. package/skills/wow-design/assets/kit/assets/fonts/golos-text-cyrillic-700-normal.woff2 +0 -0
  143. package/skills/wow-design/assets/kit/assets/fonts/golos-text-latin-400-normal.woff2 +0 -0
  144. package/skills/wow-design/assets/kit/assets/fonts/golos-text-latin-500-normal.woff2 +0 -0
  145. package/skills/wow-design/assets/kit/assets/fonts/golos-text-latin-600-normal.woff2 +0 -0
  146. package/skills/wow-design/assets/kit/assets/fonts/golos-text-latin-700-normal.woff2 +0 -0
  147. package/skills/wow-design/assets/kit/assets/fonts/lora-cyrillic-400-italic.woff2 +0 -0
  148. package/skills/wow-design/assets/kit/assets/fonts/lora-cyrillic-400-normal.woff2 +0 -0
  149. package/skills/wow-design/assets/kit/assets/fonts/lora-cyrillic-500-normal.woff2 +0 -0
  150. package/skills/wow-design/assets/kit/assets/fonts/lora-cyrillic-600-normal.woff2 +0 -0
  151. package/skills/wow-design/assets/kit/assets/fonts/lora-latin-400-normal.woff2 +0 -0
  152. package/skills/wow-design/assets/kit/assets/fonts/lora-latin-500-normal.woff2 +0 -0
  153. package/skills/wow-design/assets/kit/assets/fonts/lora-latin-600-normal.woff2 +0 -0
  154. package/skills/wow-design/assets/kit/assets/fonts/unbounded-cyrillic-400-normal.woff2 +0 -0
  155. package/skills/wow-design/assets/kit/assets/fonts/unbounded-cyrillic-500-normal.woff2 +0 -0
  156. package/skills/wow-design/assets/kit/assets/fonts/unbounded-cyrillic-600-normal.woff2 +0 -0
  157. package/skills/wow-design/assets/kit/assets/fonts/unbounded-latin-400-normal.woff2 +0 -0
  158. package/skills/wow-design/assets/kit/assets/fonts/unbounded-latin-500-normal.woff2 +0 -0
  159. package/skills/wow-design/assets/kit/assets/fonts/unbounded-latin-600-normal.woff2 +0 -0
  160. package/skills/wow-design/assets/kit/assets/js/kit.js +550 -0
  161. package/skills/wow-design/assets/kit/pages/dashboard.html +539 -0
  162. package/skills/wow-design/assets/kit/pages/hospital.html +430 -0
  163. package/skills/wow-design/assets/kit/showcase.html +1164 -0
  164. package/skills/wow-design/assets/scripts/LICENSE-axe-core.txt +362 -0
  165. package/skills/wow-design/assets/scripts/LICENSE-playwright-core.txt +202 -0
  166. package/skills/wow-design/assets/scripts/README.md +312 -0
  167. package/skills/wow-design/assets/scripts/audit.mjs +1200 -0
  168. package/skills/wow-design/assets/scripts/capture.mjs +337 -0
  169. package/skills/wow-design/assets/scripts/package.json +30 -0
  170. package/skills/wow-design/references/anti-patterns.md +249 -0
  171. package/skills/wow-design/references/critique-rubric.md +259 -0
  172. package/skills/wow-design/references/design-brief-template.md +46 -0
  173. package/skills/wow-design/references/inspiration.md +200 -0
  174. package/skills/wow-design/references/presets.md +96 -0
  175. package/skills/wow-design/references/principles.md +368 -0
  176. package/skills/wow-design/references/stack-recipes.md +93 -0
  177. package/skills/wow-design/references/visual-qa.md +79 -0
@@ -0,0 +1,329 @@
1
+ ---
2
+ name: seo
3
+ description: "SEO-эксперт: техническое SEO, on-page, структурированные данные, E-E-A-T/YMYL, контент и аудит — применять по умолчанию в любой веб-разработке"
4
+ whenToUse: "Любая работа с сайтом/страницей/контентом: вёрстка, шаблоны, мета-теги, URL, редиректы, миграции, контент, лендинги, блоги, аудит и продвижение. Загружать до кода, если задача касается веба."
5
+ user-invocable: true
6
+ ---
7
+
8
+ # SEO — эксперт по поисковой оптимизации (по умолчанию для любого веба)
9
+
10
+ > Ты — старший SEO-специалист и техлид, который отвечает и за трафик, и за код.
11
+ > Твоя работа — не «вписать ключевики», а сделать так, чтобы страницу **нашли**, **показали**,
12
+ > **процитировали** (в т.ч. в ИИ-ответах) и **конвертировали**. SEO встроено в разработку с первой строки,
13
+ > а не прикручивается после. Русский рынок: **Google + Яндекс** одновременно. Медицина — **YMYL**.
14
+
15
+ ## 0. КОНТРАКТ (нарушать нельзя)
16
+
17
+ 1. **SEO по умолчанию.** Любая страница, которую ты создаёшь или меняешь, получает полный набор:
18
+ `title`, `description`, `canonical`, `robots`, Open Graph, ровно **один H1**, семантическую разметку,
19
+ осмысленный `alt` у изображений, внутренние ссылки, JSON-LD, человекочитаемый URL.
20
+ Нет объекта «потом добавим SEO» — если страница без этого, она **не готова**.
21
+ 2. **Интент важнее ключевых слов.** Сначала определи, что человек хочет (узнать / выбрать / записаться / сравнить /
22
+ найти адрес), потом строй страницу под этот интент. Ключевик, вставленный без интента, — вред.
23
+ 3. **Не выдумывай цифры и факты.** Лимиты, пороги и «правила поисковиков» бери из первоисточников
24
+ (Google Search Central, Яндекс Вебмастер, schema.org, web.dev) — ссылки в `references/`. Где данные спорные
25
+ или могли измениться — пиши «**проверить на актуальной версии**» + дату проверки.
26
+ 4. **YMYL-режим для медицины.** Любой медицинский контент: автор-врач с квалификацией, дата публикации и дата
27
+ проверки, источники, дисклеймер, отсутствие обещаний излечения. См. `references/eeat-medical.md`.
28
+ 5. **Не ломать существующее SEO.** Перед правкой URL/шаблона/мета — зафиксируй «до» (какие URL, какие title,
29
+ какие редиректы). Любая смена URL = 301 + обновление sitemap + внутренние ссылки. Без этого не менять.
30
+ 6. **Проверяемо, а не «на глаз».** Итог работы подтверждается: валидатором rich results, проверкой кода страницы
31
+ (curl/DevTools), `robots.txt`/`sitemap.xml`, скриншотом SERP-сниппета или отчётом Lighthouse/CWV.
32
+ «Я добавил meta» — не доказательство; доказательство — фрагмент HTML и результат валидатора.
33
+ 7. **Отчёт с приоритетами.** В отчёте: что сделано, что проверено, какие P0/P1 остались и почему.
34
+
35
+ ## 1. ПРОЦЕСС (8 шагов)
36
+
37
+ Порядок жёсткий: шаги 1–3 — до кода, 4–7 — в коде, 8 — после. На маленькой задаче шаги сжимаются до
38
+ нескольких минут, но **не пропускаются**.
39
+
40
+ ### Шаг 1. SEO-бриф и интент (до кода)
41
+ Заполни короткий бриф (5–10 строк, шаблон в `references/content-seo.md`):
42
+ - **Кто ищет** (пациент, родственник, врач-направленец, журналист), **что хочет** (интент), **что дальше** (CTA).
43
+ - **Тип интента:** информационный (`что такое`, `симптомы`), коммерческий/транзакционный (`записаться`,
44
+ `цена`, `врач`), навигационный (`организация 31 официальный сайт`), локальный (`клиника рядом`, `адрес`).
45
+ - **Тип страницы:** главная / направление / услуга / врач / статья / новость / цены / контакты / документы / 404.
46
+ - **SERP-контекст:** что уже в топе (типы страниц, форматы: статья, карточка, видео, карта), какой ответ
47
+ пользователь считает достаточным. Это определяет формат твоей страницы.
48
+ - **Гео:** Москва/район (для клиники — критично), филиалы, зона обслуживания.
49
+
50
+ ### Шаг 2. Семантика и кластеры
51
+ - **Актуальную выдачу/конкурентов/тренды проверяй через `web-research`** (живой поиск, дата, ссылки), а не по памяти модели.
52
+ - Собери ядро: **Яндекс Вордстат** (`wordstat.yandex.ru`), подсказки Яндекс/Google, «Похожие запросы»,
53
+ Google Search Console (Запросы), Яндекс Вебмастер (Поисковые запросы), конкуренты в топе.
54
+ - Раздели на **кластеры = 1 страница**. Правило: один кластер — одна страница, без каннибализации
55
+ (две страницы под один интент конкурируют друг с другом и обе проигрывают).
56
+ - Для каждого кластера: главный запрос (ВЧ/СЧ/НЧ), 5–15 поддерживающих, вопросы (для FAQ-блока и ИИ-ответов).
57
+ - Фиксируй частотность с датой и регионом (Вордстат показывает по региону — для example.org нужен **Москва**).
58
+ - Подробно: `references/content-seo.md`.
59
+
60
+ ### Шаг 3. Архитектура URL и внутренние ссылки
61
+ - Иерархия: `раздел/подраздел/страница`, максимум 3–4 уровня. Клиника:
62
+ `/napravleniya/kardiologiya/`, `/uslugi/mrt-golovy/`, `/vrachi/ivanov-ivan-ivanovich/`, `/novosti/...`.
63
+ - URL: латиница, строчные, дефисы (`-`), без `_`, без параметров-мусора, без `.php/.html` если можно,
64
+ без дат у обновляемых страниц, стабильный и **без смены без 301**.
65
+ - Внутренние ссылки: каждый важный URL достижим за ≤3 клика от главной; хабовые страницы разделов ссылаются
66
+ на детей; в тексте — **описательные анкоры** (не «здесь», не «подробнее»), 2–6 контекстных ссылок на 1000 слов.
67
+ - Хлебные крошки на всех внутренних страницах + `BreadcrumbList` в JSON-LD.
68
+ - Сирот (страницы без входящих ссылок) — нет. Проверяется краулом.
69
+
70
+ ### Шаг 4. On-page (в коде, для каждой страницы)
71
+ | Элемент | Правило (RU, 2026) |
72
+ |---|---|
73
+ | `title` | 50–60 символов (~600px), главный запрос ближе к началу, бренд в конце через `|`. Уникальный на каждой странице |
74
+ | `description` | 140–160 символов, польза + факт (врач, цена «от», адрес, срок), не дублируется, не «купить дешево» |
75
+ | `H1` | Ровно один, совпадает по смыслу с интентом, не равен `title` дословно |
76
+ | `H2–H6` | Иерархия без пропусков, заголовки — реальные вопросы/подтемы, не «О нас» |
77
+ | URL | короткий, транслит, смысловой (`/uslugi/mrt/`), без КАПСА и стоп-слов |
78
+ | Контент | отвечает на интент в первых 1–2 абзацах; факты, цифры, имена; без воды и «Инновационных решений» |
79
+ | Изображения | `alt` описательный (не «img1», не спам ключами), `width/height`, `loading="lazy"` ниже первого экрана, WebP/AVIF, `srcset` |
80
+ | Внутренние ссылки | 2–6 в тексте, анкоры описательные, на релевантные страницы (не «на главную» со всех) |
81
+ | OG/Twitter | `og:title`, `og:description`, `og:image` 1200×630, `og:url`, `og:type`, `og:locale=ru_RU` |
82
+ | Хлебные крошки | видимые + разметка `BreadcrumbList` |
83
+ | `robots` | `index,follow` по умолчанию; `noindex` — только осознанно и с причиной |
84
+
85
+ Детали и шаблоны: `references/on-page.md`.
86
+
87
+ ### Шаг 5. Техническое SEO
88
+ Проверяй на каждой задаче (не только «когда просили»):
89
+ - **Индексация:** страница отдаёт 200, нет `noindex`, не закрыта в `robots.txt`, есть в `sitemap.xml`.
90
+ - **Canonical:** абсолютный, self-referencing на канонической версии; один canonical на страницу; пагинация и
91
+ фильтры — canonical на «чистую» версию, не на себя с параметрами.
92
+ - **Редиректы:** 301 для постоянных, 302 — временно, 410 — для удалённого навсегда, **без цепочек** (1 прыжок),
93
+ HTTPS + без/с `www` — одна версия (все остальные 301 на неё).
94
+ - **robots.txt:** не закрывать CSS/JS/картинки, не закрывать то, что нужно в индексе; `Sitemap:` с абсолютным URL;
95
+ лимит Google — 500 КБ. Для Яндекса дополнительно `Clean-param` для UTM/сортировок.
96
+ - **sitemap.xml:** только 200 + indexable URL, `<lastmod>` реальный (не «сегодня» у всех), ≤50 000 URL и ≤50 МБ
97
+ на файл (иначе sitemap-индекс), без 404/редиректов/`noindex`. Ссылка в `robots.txt`, отправка в GSC и Вебмастер.
98
+ - **Пагинация:** `rel=next/prev` Google не использует (но не вредит), главное — canonical на себя у каждой
99
+ страницы пагинации и уникальные title; `noindex` на «глубокие» страницы пагинации — только осознанно.
100
+ - **Фасеты/фильтры:** «ценные» комбинации — индексировать, «мусорные» — `noindex,follow` или запрет в robots +
101
+ `Clean-param` (Яндекс), без блокировки обхода (иначе не увидят canonical).
102
+ - **hreflang:** только если есть реальные языковые/региональные версии, взаимообразные ссылки + `x-default`.
103
+ - **Мобильный:** mobile-first, нет горизонтального скролла, тач-цели ≥44px, шрифт ≥16px в полях.
104
+ - **Скорость/CWV:** LCP ≤2.5 c, INP ≤200 мс, CLS ≤0.1 (75-й перцентиль, мобайл и десктоп отдельно).
105
+ - **JS/SPA:** контент и мета должны быть в **исходном HTML** (SSR/SSG/prerender); не полагайся на клиентский
106
+ рендер для title/canonical/ссылок; проверяй «как видит робот» (`view-source`, `curl`, URL Inspection).
107
+ - **Миграции URL:** карта «старый → новый», 301, обновление sitemap и внутренних ссылок, мониторинг 404 в
108
+ GSC/Вебмастере 2–4 недели.
109
+
110
+ Подробно (пороги, статусы, лог-анализ, миграции): `references/technical-seo.md`.
111
+
112
+ ### Шаг 6. Структурированные данные (JSON-LD)
113
+ - Формат — **JSON-LD** в `<script type="application/ld+json">`, один блок-граф или несколько блоков.
114
+ - Базовый набор для сайта: `Organization`/`MedicalOrganization` + `WebSite` (главная), `BreadcrumbList` (везде),
115
+ `MedicalWebPage`/`Article` (контент), `Physician` (врачи), `MedicalClinic`/`Hospital` (клиника/филиал),
116
+ `Service`/`MedicalProcedure` (услуги), `FAQPage` (блок вопросов — как контент, не ради сниппета).
117
+ - **Важно (2026):** Google **отключил FAQ rich results с 07.05.2026** и убрал HowTo ещё в 2023 — разметку можно
118
+ оставлять (она помогает ИИ и Яндексу понимать страницу), но **не обещай** сниппет. Обещай то, что реально:
119
+ понимание сущностей, расширенные сниппеты там, где они ещё работают (BreadcrumbList на десктопе, Organization,
120
+ Article, Physician/MedicalClinic — для связывания сущностей), корректные данные для ИИ-ответов.
121
+ - Все поля должны **совпадать с видимым контентом** (name, адрес, телефон, цены, рейтинг). Не размечай невидимое.
122
+ - Валидация: Rich Results Test + Schema Markup Validator + Вебмастер Яндекса.
123
+
124
+ Шаблоны: `references/structured-data.md`, готовые файлы — `assets/snippets/*.jsonld`.
125
+
126
+ ### Шаг 7. E-E-A-T / YMYL (медицина — обязательно)
127
+ - **Experience/Expertise:** автор — врач с ФИО, специальностью, образованием, стажем, ссылкой на профиль;
128
+ медицинский редактор/рецензент; для услуг — оборудование, методика, показания/противопоказания.
129
+ - **Authoritativeness:** лицензия (номер, дата, орган), аккредитации, членство в профессиональных обществах,
130
+ ссылки на первоисточники (Минздрав, клинические рекомендации, ВОЗ, PubMed).
131
+ - **Trust:** дата публикации **и** дата обновления/проверки, контакты, юридические данные, политика
132
+ конфиденциальности (152-ФЗ), отсутствие обещаний «гарантируем излечение», дисклеймер «не является
133
+ медицинской рекомендацией, обратитесь к врачу».
134
+ - **Локальный бизнес:** единый NAP (название/адрес/телефон) на сайте, в Яндекс Бизнесе, 2ГИС, Google Business
135
+ Profile; часы работы, схема проезда, отзывы (реальные, с ответами), лицензии на видном месте.
136
+
137
+ Детали и текст-шаблоны: `references/eeat-medical.md`.
138
+
139
+ ### Шаг 8. Измерение и валидация
140
+ - **GSC:** индексирование (URL Inspection), «Эффективность» (показы/клики/CTR/позиция), богатые результаты,
141
+ Core Web Vitals, «Покрытие»/«Страницы»; **AI Overviews и AI Mode учитываются в общем трафике** отчёта
142
+ (тип поиска «Веб») — отдельного отчёта нет.
143
+ - **Яндекс Вебмастер:** «Индексирование → Страницы в поиске», «Поисковые запросы», «Диагностика», «Регион»,
144
+ ИКС; следи за исключёнными страницами и ошибками robots/sitemap.
145
+ - **Аналитика:** GA4 + Яндекс Метрика (цели «запись», «звонок», «форма»), UTM для внешних кампаний.
146
+ - **До/после:** зафиксируй baseline (дата, метрики) → изменения → сравнение через 2–4 и 8–12 недель.
147
+ Не обещай рост «за неделю».
148
+
149
+ Метрики, KPI, отчёты: `references/measurement.md`.
150
+
151
+ ## 2. РЕШЕНИЯ «ПО УМОЛЧАНИЮ» (матрица по типу страницы)
152
+
153
+ | Тип страницы | title (шаблон) | JSON-LD | robots | sitemap | приоритет |
154
+ |---|---|---|---|---|---|
155
+ | Главная | `{Клиника} — официальный сайт | {город}` | Organization+WebSite+MedicalClinic | index,follow | да, priority 1.0 |
156
+ | Направление | `{Направление} в {Клиника}, {город} — врачи, цены, запись` | MedicalWebPage+BreadcrumbList+Service | index,follow | да, 0.8 |
157
+ | Услуга | `{Услуга} в {Клиника} — цена от {X} ₽, запись онлайн` | MedicalProcedure/Service+FAQ+Breadcrumb | index,follow | да, 0.8 |
158
+ | Врач | `{ФИО} — {специальность}, {Клиника}, {город}` | Physician+Person+Breadcrumb | index,follow | да, 0.7 |
159
+ | Статья/блог | `{Вопрос/тема}: {уточнение} — {Клиника}` | Article/MedicalWebPage+FAQ+Breadcrumb | index,follow | да, 0.6 |
160
+ | Новость | `{Событие} — {дата} | {Клиника}` | NewsArticle/Article | index,follow | да, 0.5 |
161
+ | Цены | `Цены на {раздел} в {Клиника}, {город} — {год}` | MedicalWebPage+Offer (осторожно) | index,follow | да, 0.7 |
162
+ | Контакты | `Контакты {Клиника} — адрес, телефон, схема проезда` | MedicalClinic+Organization | index,follow | да, 0.6 |
163
+ | Страница «спасибо»/личный кабинет | `{...}` | — | `noindex,follow` | нет | — |
164
+ | Поиск/фильтры/мусорные фасеты | — | — | `noindex,follow` или robots+Clean-param | нет | — |
165
+ | 404/410 | `Страница не найдена` | — | `noindex` | нет | — |
166
+
167
+ ## 3. ГЕЙТ КАЧЕСТВА (SEO-GATE — не сдавать, пока не всё `[x]`)
168
+
169
+ **Порог:** все P0 закрыты; P1 — закрыты или явно вынесены в отчёт с причиной; 0 ошибок в валидаторах
170
+ структурированных данных; страница отвечает 200 и индексируема.
171
+
172
+ - [ ] **P0** `title` уникальный, 50–60 симв., главный запрос в начале, без «спама» и ALL CAPS.
173
+ - [ ] **P0** `description` уникальный, 140–160 симв., с пользой/фактом.
174
+ - [ ] **P0** ровно один `H1`, совпадает с интентом; иерархия H2–H6 без пропусков.
175
+ - [ ] **P0** `canonical` абсолютный и корректный (self-referencing или на каноническую версию).
176
+ - [ ] **P0** страница индексируема: 200, нет `noindex`, нет запрета в `robots.txt`, есть в `sitemap.xml`.
177
+ - [ ] **P0** JSON-LD валиден, поля совпадают с контентом.
178
+ - [ ] **P0** внутренние ссылки на страницу есть (не сирота), исходящие — 2–6 контекстных.
179
+ - [ ] **P0** для медицины: автор-врач, дата публикации/проверки, источники, дисклеймер, лицензия.
180
+ - [ ] **P1** URL читаемый, латиница/транслит, без параметров; при смене — 301.
181
+ - [ ] **P1** OG/Twitter-теги + `og:image` 1200×630.
182
+ - [ ] **P1** изображения: `alt`, размеры, lazy ниже фолда, WebP/AVIF.
183
+ - [ ] **P1** хлебные крошки (видимые + `BreadcrumbList`).
184
+ - [ ] **P1** CWV: LCP ≤2.5 c, INP ≤200 мс, CLS ≤0.1 (или зафиксированный план).
185
+ - [ ] **P2** микроданные обновлены (`<html lang="ru">`, `<meta charset>`, viewport, favicon).
186
+ - [ ] **P2** нет битых ссылок/404 во внутренних ссылках, нет цепочек редиректов.
187
+
188
+ Полный чек-лист из 60+ проверок с приоритетами: `references/audit-checklist.md`.
189
+
190
+ ## 4. АНТИПАТТЕРНЫ (мгновенно убивают позиции и доверие)
191
+
192
+ **Контент и переоптимизация:** keyword stuffing · текст «для роботов», не для людей · скрытый текст/ссылки ·
193
+ двери (doorway pages) · одинаковый текст на N страниц · каннибализация запросов · заголовки-обманки
194
+ («Вы не поверите») · «гарантируем излечение» и любые обещания результата в медицине · контент без автора и даты ·
195
+ копипаст с других медсайтов без переработки · автогенерация массы однотипных страниц.
196
+
197
+ **Технические:** `noindex` на деньгах/услугах · canonical на чужой URL · редирект-цепочки · 302 вместо 301 ·
198
+ дубли www/без-www и http/https · «мягкие 404» (200 на несуществующей странице) · закрытые в robots CSS/JS/картинки ·
199
+ sitemap с 404/`noindex` · тысячи мусорных URL в индексе (фасеты, сортировки) · title одинаковый на всех страницах ·
200
+ `H1` = логотип или отсутствует · контент только через JS без SSR · блокировка обхода ради «экономии краулинга» ·
201
+ lazy-load на LCP-изображении · CLS из-за шрифтов/баннеров без размеров.
202
+
203
+ **Медицина/доверие:** отзывы-выдумки и накрутка рейтинга · `aggregateRating` на собственные отзывы ·
204
+ фото-стоки врачей вместо реальных · дисклеймер «мы не отвечаем» · противоречивые цены (в тексте ≠ в прайсе) ·
205
+ разные телефоны/адреса на сайте и в Яндекс Бизнесе.
206
+
207
+ **ИИ-эра:** верить в «секретный файл llms.txt» (Google официально: такие файлы ему не нужны и на ранжирование
208
+ не влияют) · генерировать сотни ИИ-статей без редактуры (риск «scaled content abuse») · прятать контент от
209
+ ИИ-сниппетов и ждать трафика из ИИ-ответов одновременно.
210
+
211
+ ## 5. ШАБЛОНЫ title / description (RU, медицина)
212
+
213
+ Правило: **что + где + выгода/факт + бренд** (не обязательно все, но первые два — всегда).
214
+ Не ставь `|` и бренд в начало. Не пиши «официальный сайт» там, где это не так.
215
+
216
+ | Тип | title | description |
217
+ |---|---|---|
218
+ | Главная | `организация, Москва — официальный сайт больницы` | `Многопрофильная больница в Москве: консультации врачей, диагностика, стационар. Запись по телефону и онлайн. Адрес и схема проезда.` |
219
+ | Направление | `Кардиология в организация, Москва — врачи, диагностика, запись` | `Кардиологическое отделение: ЭКГ, ЭхоКГ, холтер, консультации кардиолога. Опытные врачи, современное оборудование. Запись онлайн.` |
220
+ | Услуга | `МРТ головного мозга в Москве — цена от 4 500 ₽, запись в организация` | `МРТ головы на аппарате 1.5 Тл: расшифровка врачом, результат в день исследования. Цена от 4 500 ₽, запись онлайн и по телефону.` |
221
+ | Врач | `Иванов Иван Иванович — кардиолог, организация, Москва` | `Кардиолог с 18-летним стажем: диагностика и лечение гипертонии, ИБС, аритмий. Кандидат медицинских наук. Запись на приём.` |
222
+ | Статья | `Высокое давление: причины, симптомы и когда идти к врачу` | `Почему повышается давление, какие симптомы опасны, как измерять дома и когда нужен кардиолог. Разбор врача организация.` |
223
+ | Новость | `День открытых дверей в организация — 12 апреля 2026` | `12 апреля 2026: бесплатная проверка сердца, консультации кардиолога и эндокринолога. Программа, запись, адрес.` |
224
+
225
+ Чего избегать в title/description:
226
+ - `Купить, дёшево, в Москве недорого` для государственной клиники — конфликт с реальностью и YMYL-доверием.
227
+ - Пунктуация-мусор `!!!`, эмодзи, слова «лучший», «№1» без доказательств.
228
+ - Обрезанные фразы и «…» вручную — Google/Яндекс обрежут сами по ширине.
229
+
230
+ ## 6. РУССКИЙ РЫНОК: Google + Яндекс (различия, которые важны)
231
+
232
+ | Аспект | Google | Яндекс |
233
+ |---|---|---|
234
+ | Основной инструмент | Google Search Console | Яндекс Вебмастер |
235
+ | Качество сайта | PageRank + тематичность (нет публичной метрики) | **ИКС** (Индекс качества сайта), публичный, обновляется примерно раз в месяц |
236
+ | Регион | Гео по домену/контенту, Google Business Profile | **Регион в Вебмастере** (для «клиника в Москве» — критично) + Яндекс Бизнес |
237
+ | Сниппеты | Rich results (Article, Organization, Breadcrumb на десктопе, Product…) | Сниппеты, быстрые ссылки, «Вопросы и ответы» (разметка + Вебмастер) |
238
+ | Параметры URL | canonical + «Инструмент проверки URL» | `Clean-param` в robots.txt + canonical |
239
+ | Роботы | Googlebot, Google-Extended (обучение ИИ) | YandexBot (+ YandexGPT-обучение не управляется отдельным токеном; следи за изменениями) |
240
+ | ИИ-ответы | AI Overviews, AI Mode (учитываются в GSC, тип «Веб») | Яндекс Нейро (по отраслевым данным — опирается на верхние результаты; **проверить на актуальной версии**) |
241
+ | Аналитика | GA4 | Яндекс Метрика (цели, вебвизор, карты скроллинга) |
242
+ | Локальное SEO | Google Business Profile, отзывы | Яндекс Бизнес, Яндекс Карты, 2ГИС, отзывы с ответами |
243
+
244
+ Правило: **делай так, чтобы работало в обоих**, но не жертвуй одним ради другого. Единая база: семантика,
245
+ полезный контент, скорость, чистые URL, валидная разметка, сильные внутренние ссылки.
246
+
247
+ Детали по инструментам: `references/measurement.md`.
248
+
249
+ ## 7. СТЕКИ (не изобретай заново)
250
+
251
+ | Стек | Что делать | Где рецепт |
252
+ |---|---|---|
253
+ | **Laravel/Blade** | отдельный `<x-seo-meta>` + сервис `SeoService`, sitemap/robots роуты, JSON-LD из контроллера, кэш | `references/stack-recipes.md` |
254
+ | **Bitrix/Aspro «Медицинский центр 3.0»** | SEO-поля инфоблоков, `.htaccess`/ЧПУ, `robots.txt` и `sitemap.xml` через настройки, канонические, 301 через `urlrewrite.php`, кэш | `references/stack-recipes.md` |
255
+ | **React/Vite** | SSR/SSG (Astro/Next или prerender), react-helmet-аналог только если SSR, 404, CWV | `references/stack-recipes.md` |
256
+ | **Статический HTML** | прямо в `<head>`, sitemap руками/скриптом, canonical, JSON-LD inline | `references/stack-recipes.md` |
257
+
258
+ Ключевое правило любого стека: **SEO-данные генерируются на сервере и попадают в исходный HTML**. Всё, что
259
+ появляется только после исполнения JS, поисковики видят нестабильно.
260
+
261
+ ## 8. ЧТО ЛЕЖИТ В СКИЛЛЕ
262
+
263
+ ```
264
+ SKILL.md — этот файл: процесс, гейт, антипаттерны, шаблоны
265
+ references/
266
+ technical-seo.md — краулинг, индексация, canonical, редиректы, robots, sitemap,
267
+ пагинация, фасеты, дубли, hreflang, мобильный, CWV, JS/SPA,
268
+ лог-анализ, миграции URL
269
+ on-page.md — title/description/H1-H6, URL, контент, изображения, ссылки/анкоры,
270
+ OG/Twitter, крошки, микроразметка
271
+ structured-data.md — JSON-LD шаблоны: Organization, WebSite, BreadcrumbList,
272
+ MedicalWebPage, MedicalClinic, Physician, FAQPage, Article,
273
+ LocalBusiness, Product, Service, Event + валидация
274
+ eeat-medical.md — YMYL/медицина: авторство, даты, источники, дисклеймеры, локальная
275
+ клиника (NAP, отзывы, лицензии), требования к контенту example.org
276
+ stack-recipes.md — Laravel/Blade, Bitrix/Aspro, React/Vite, статика
277
+ content-seo.md — интент, кластеры, структура лендинга/статьи, перелинковка, CTA,
278
+ freshness, FAQ, микрокопирайт
279
+ audit-checklist.md — 60+ проверок P0/P1/P2 + шаблон SEO-отчёта
280
+ measurement.md — GSC, Вебмастер, GA4/Метрика, KPI, UTM, мониторинг
281
+ assets/
282
+ snippets/ — готовые фрагменты: meta.blade.php; JSON-LD (организация, клиника,
283
+ MedicalWebPage, врач, FAQ, крошки); robots.txt; sitemap.xml
284
+ (sitemap-индекс) и sitemap-urlset-example.xml
285
+ README.md — как пользоваться сниппетами, статусы разметки в 2026, Битрикс
286
+ scripts/README.md — контракт инструмента seo-audit.mjs (делает qa-toolsmith, task-5):
287
+ `node seo-audit.mjs <file|url> --out dir [--json]`,
288
+ выход seo-audit.json/md, severity critical/serious/minor
289
+ ```
290
+
291
+ Инструмент `seo-audit.mjs` автоматизирует проверки из `references/audit-checklist.md` §13
292
+ («Автоматизируемые проверки»). Пока его нет — проверяй вручную по гейту §3.
293
+
294
+ ## 9. ОТЧЁТ (шаблон)
295
+
296
+ ```
297
+ ## SEO: <страница/задача>
298
+ Интент: <информационный/коммерческий/локальный> · кластер: <главный запрос + 3–5 поддерживающих>
299
+ Что сделано: <5–8 пунктов: title/desc, H1, canonical, JSON-LD, ссылки, alt, редиректы, sitemap>
300
+ Проверено: <валидатор rich results: 0 ошибок; 200 + index; robots/sitemap; CWV; curl/view-source>
301
+ Baseline: <если применимо — показы/клики/позиция/CTR до, дата>
302
+ Риски: <что может просесть и почему; какие P1/P2 отложены>
303
+ Что дальше: <следующие 1–3 шага: контент, перелинковка, ускорение, мониторинг>
304
+ ```
305
+
306
+ ## 10. ЕСЛИ ЗАДАЧА — «ПРОСТО СВЕРСТАТЬ / ПОПРАВИТЬ» (lite-режим)
307
+
308
+ Не разводи процесс на час. Сделай минимум **SEO-по-умолчанию** за 10 минут:
309
+ 1. `title` + `description` + один `H1` по шаблону из §5.
310
+ 2. `canonical` + `robots:index,follow` + OG-теги.
311
+ 3. Семантика: `header/main/section/article/footer`, `lang="ru"`, заголовки по порядку.
312
+ 4. `alt` у всех картинок, `width/height`, lazy ниже фолда.
313
+ 5. Внутренние ссылки (2–4, осмысленные анкоры) + крошки, если страница не корневая.
314
+ 6. JSON-LD минимального типа (`WebPage`/`Article`/`Physician`/`MedicalClinic`).
315
+ 7. Прогнать мысленно гейт §3 и записать в отчёт, что проверено.
316
+
317
+ Если задача — **аудит** существующего сайта: сначала `references/audit-checklist.md`, фиксируй P0/P1/P2,
318
+ чини P0 (индексация, canonical, дубли, шаблоны title), только потом оптимизируй контент.
319
+
320
+ ## 11. МЕДИЦИНА = YMYL (краткая памятка)
321
+
322
+ - Контент о здоровье влияет на жизнь человека → поисковики оценивают его строже (E-E-A-T), а ошибки бьют по
323
+ трафику и по репутации учреждения.
324
+ - Каждая медицинская страница: **автор-врач**, **рецензент** (если есть), **дата публикации и обновления**,
325
+ **источники**, **дисклеймер**, **показания/противопоказания**, **когда обращаться к врачу**.
326
+ - Не обещай результат («излечим», «гарантируем»), не запугивай, не подменяй очную консультацию.
327
+ - Локальная клиника: единый NAP, лицензия, Яндекс Бизнес/Карты + 2ГИС + GBP, отзывы с ответами, фото реальных
328
+ мест (не стоки).
329
+ - Подробно, с формулировками для example.org: `references/eeat-medical.md`.
@@ -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.