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,294 @@
1
+ # Техническое SEO — краулинг, индексация, URL, скорость
2
+
3
+ > Справочник по технической части. Всё, что здесь есть, проверяется **в коде и в инструментах**, а не «на глаз».
4
+ > Первоисточники — в конце файла. Данные проверены на **04.11.2026**; спорные/меняющиеся места помечены
5
+ > «проверить на актуальной версии».
6
+
7
+ ## 1. Как поисковик проходит путь до выдачи (и где всё ломается)
8
+
9
+ `обнаружение → обход (crawl) → рендеринг → индексация → ранжирование → показ сниппета`
10
+
11
+ | Этап | Что решает | Типовые поломки |
12
+ |---|---|---|
13
+ | Обнаружение | внутренние ссылки, sitemap, внешние ссылки | сироты, ссылки только в JS-меню, `nofollow` на всём, sitemap не отправлен |
14
+ | Обход | robots.txt, статус-коды, скорость ответа, crawl budget | 5xx, таймауты, бесконечные фасеты, цепочки редиректов, закрытые CSS/JS |
15
+ | Рендеринг | SSR/SSG vs клиентский JS | контент/мета только после JS, `noindex` в JS, «мягкие 404» |
16
+ | Индексация | canonical, дубли, качество, `noindex` | canonical на чужой URL, дубли www/http, тысячи мусорных URL |
17
+ | Показ | title/description, разметка, CWV | шаблонные title, нет `og:image`, CLS, медленный LCP |
18
+
19
+ **Правило:** если страница не индексируется — не оптимизируй её контент. Сначала P0: 200 + indexable + canonical.
20
+
21
+ ## 2. Статус-коды: что делает Google и Яндекс
22
+
23
+ | Код | Значение для SEO | Что делать |
24
+ |---|---|---|
25
+ | 200 | страница живёт | норма |
26
+ | 301 | постоянный переезд, вес передаётся | смена URL, http→https, www→без www, склейка дублей |
27
+ | 302 / 307 | временно, вес **не** передаётся как постоянный | только реально временные (A/B, обслуживание) |
28
+ | 304 | не изменилось | норма (кеш) |
29
+ | 404 | не найдено, URL постепенно выпадает | удалённые без замены; лучше сразу убрать из sitemap и внутренних ссылок |
30
+ | **410** | удалено навсегда, выпадает быстрее 404 | осознанное удаление страниц (не «спасибо»-страницы) |
31
+ | 403 / 401 | запрещено | только для реально закрытого; для скрытия от поиска — `noindex`, а не 403 |
32
+ | 429 | слишком много запросов | антибот; Google/Яндекс снижают скорость обхода. Не отдавай 429 роботам |
33
+ | 5xx | ошибка сервера | **URL остаётся в индексе**, обход замедляется. Мониторь 5xx в логах и GSC |
34
+
35
+ Правила:
36
+ - **Один прыжок.** `A → B → C` — плохо, `A → C` — хорошо. Цепочки режут передачу веса и замедляют обход.
37
+ - **Никаких редиректов на главную вместо 404** — это «мягкий 404» и потеря релевантности.
38
+ - **«Мягкий 404»**: страница отдаёт 200, но контент «не найдено». Google считает soft 404, Яндекс — «малоценной».
39
+ Отдавай честный 404.
40
+ - Удалённую страницу с трафиком не удаляй «в ноль»: 301 на ближайшую релевантную или 410, если замены нет.
41
+
42
+ ## 3. robots.txt
43
+
44
+ Назначение — **управление обходом**, не индексацией. Чтобы убрать из индекса — `noindex` (и не закрывать
45
+ страницу в robots.txt, иначе робот не увидит `noindex`).
46
+
47
+ ```
48
+ # https://example.ru/robots.txt
49
+ User-agent: *
50
+ Disallow: /bitrix/
51
+ Disallow: /local/
52
+ Disallow: /search/
53
+ Disallow: /*?sort=
54
+ Disallow: /*?print=
55
+ Allow: /bitrix/components/
56
+ Allow: /bitrix/templates/
57
+ Allow: /bitrix/js/
58
+ Allow: /bitrix/css/
59
+ Clean-param: utm_source&utm_medium&utm_campaign&utm_content&utm_term&yclid&gclid&from / # Яндекс
60
+ Sitemap: https://example.ru/sitemap.xml
61
+ Host: example.ru # УСТАРЕЛО: Яндекс не использует Host с 2018 года, не пиши
62
+ ```
63
+
64
+ Обязательно:
65
+ - **Не закрывай** CSS, JS, картинки, шрифты — иначе робот не отрисует страницу и не увидит контент.
66
+ - Не закрывай разделы, которые должны ранжироваться (услуги, врачи, статьи, цены).
67
+ - `Sitemap:` — абсолютный URL, можно несколько строк.
68
+ - Лимит Google: **500 КБ** на файл; длиннее — игнорируется (проверить на актуальной версии).
69
+ - Директивы: Google поддерживает `User-agent`, `Disallow`, `Allow`, `Sitemap` (+ группы по user-agent);
70
+ всё остальное (`Crawl-delay`, `Host`, `Clean-param`) Google **игнорирует**. `Clean-param` понимает Яндекс.
71
+ - Проверка: GSC «Проверка URL»/отчёт robots.txt, Яндекс Вебмастер «Инструменты → Анализ robots.txt».
72
+ - Если сайт на поддомене/в подкаталоге — robots.txt только в корне домена.
73
+
74
+ Частая ошибка: `Disallow: /` на тестовом домене, скопированный в прод. Проверяй после каждого деплоя.
75
+
76
+ ## 4. sitemap.xml
77
+
78
+ Формат: XML, `<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">`. Обязателен `<loc>`; `<lastmod>`,
79
+ `<changefreq>`, `<priority>` — подсказки (changefreq/priority Google игнорирует, Яндекс учитывает слабо;
80
+ не «оптимизируй» ими).
81
+
82
+ Лимиты (проверить на актуальной версии перед большим сайтом):
83
+ - 1 файл: **≤50 000 URL** и **≤50 МБ** (несжатый). Больше — sitemap-индекс (≤50 000 sitemap-файлов).
84
+ - Только URL, отдающие **200 + indexable**. Никаких 301, 404, `noindex`, закрытых в robots.txt.
85
+ - `<lastmod>` — реальная дата изменения контента в W3C-формате (`2026-11-04` или с временем и `+03:00`).
86
+ Ставить «сегодня» всем URL — вред: поисковик перестанет верить lastmod.
87
+ - Региональные/языковые версии — через `xhtml:link hreflang` (если реально есть).
88
+ - Sitemap-индекс для сайта с разделами: `sitemap-pages.xml`, `sitemap-uslugi.xml`, `sitemap-vrachi.xml`,
89
+ `sitemap-news.xml`, `sitemap-docs.xml`.
90
+
91
+ ```xml
92
+ <?xml version="1.0" encoding="UTF-8"?>
93
+ <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
94
+ <url>
95
+ <loc>https://example.org/uslugi/mrt-golovy/</loc>
96
+ <lastmod>2026-10-28</lastmod>
97
+ </url>
98
+ <url>
99
+ <loc>https://example.org/vrachi/ivanov-ivan-ivanovich/</loc>
100
+ <lastmod>2026-09-12</lastmod>
101
+ </url>
102
+ </urlset>
103
+ ```
104
+
105
+ Отправка:
106
+ - Google: GSC → «Файлы Sitemap»; пинг-эндпоинт sitemap **устарел** (Google отключил ping в 2023) — не используй.
107
+ - Яндекс: Вебмастер → «Индексирование → Файлы Sitemap»; для быстрых изменений — «Переобход страниц» / API.
108
+ - IndexNow (Bing, Яндекс) — для оперативного уведомления об изменениях; **проверить актуальную поддержку**.
109
+
110
+ ## 5. Canonical
111
+
112
+ ```html
113
+ <link rel="canonical" href="https://example.org/uslugi/mrt-golovy/">
114
+ ```
115
+
116
+ Правила:
117
+ - **Абсолютный** URL, тот же протокол и хост, что в sitemap и внутренних ссылках.
118
+ - Один canonical на страницу. Self-referencing — норма (страница ссылается на себя).
119
+ - Canonical — **подсказка**, а не приказ: поисковики могут выбрать другой URL, если сигналы противоречат
120
+ (внутренние ссылки, sitemap, редиректы, hreflang).
121
+ - Не ставь canonical с параметрами на «чистый» URL и наоборот непоследовательно.
122
+ - Пагинация: canonical на **саму страницу пагинации** (`?page=2` → само на себя). Canonical всех страниц
123
+ пагинации на первую — ошибка: страницы 2…N выпадут из индекса.
124
+ - Фасеты: «ценные» фильтры (например, `/uslugi/mrt/?price=do-5000`) — можно индексировать; «мусорные»
125
+ (сортировки, `print`, `view=list`) — `noindex,follow` или `Clean-param` (Яндекс). Не блокируй обход
126
+ фасетов в robots.txt — робот не увидит `noindex`.
127
+ - Дубли www/без-www, http/https, слэш/без слэша, `index.php` — склеивай 301 + canonical.
128
+ - Если контент проиндексирован по «не тому» URL — исправляй сигналы (внутренние ссылки, sitemap), а не только
129
+ canonical. Отчет GSC «Страницы → Альтернативная страница с корректным каноническим тегом» это показывает.
130
+
131
+ ## 6. Дубли и «тонкие» страницы
132
+
133
+ Виды дублей: параметры URL, сортировки, `print`/`amp`-версии, www/http, слеш, КАПС, `?utm_*`, копии контента
134
+ между разделами, одинаковые карточки врачей в нескольких отделениях.
135
+
136
+ Антидубль-набор:
137
+ 1. 301 на канонический URL (www/http/слэш) — на уровне сервера.
138
+ 2. `canonical` на канонический URL — на уровне HTML.
139
+ 3. Один URL в sitemap и внутренних ссылках.
140
+ 4. UTM-метки не должны создавать индексируемые копии: `Clean-param` (Яндекс), `noindex` на страницах с
141
+ «кампанейскими» параметрами, canonical на чистый URL.
142
+ 5. Уникальные title/description/H1 на каждой значимой странице (шаблон + данные).
143
+
144
+ «Тонкие» страницы (мало контента, нет уникальной ценности): карточка врача из 2 строк, услуга-заглушка,
145
+ тег с одним постом, страница «спасибо». Решение: обогатить (фото, образование, цены, показания, FAQ) или
146
+ `noindex,follow` и убрать из sitemap. Массовые «пустые» URL — прямой путь к фильтру «малоценных страниц»
147
+ (Яндекс) и снижению качества сайта в целом.
148
+
149
+ ## 7. Пагинация
150
+
151
+ - Страницы пагинации — **индексируемые**, canonical self-referencing, уникальные title
152
+ (`Раздел — страница 2`), ссылки `?page=N` обычными `<a href>`.
153
+ - `rel="next"/"prev"` Google **не использует** с 2019 — можно не ставить (не вредит).
154
+ - `noindex` на пагинацию — только если это чисто навигационные страницы без самостоятельной ценности и
155
+ есть альтернативный доступ к контенту (категории/фильтры).
156
+ - Бесконечный скролл: обеспечь реальные URL для «следующих» страниц (иначе контент не проиндексируется).
157
+ - «View all» — допустимо как отдельный URL с canonical на себя, если страница не слишком тяжёлая.
158
+
159
+ ## 8. hreflang (только при реальной мультиязычности/мультирегиональности)
160
+
161
+ ```html
162
+ <link rel="alternate" hreflang="ru-RU" href="https://example.ru/">
163
+ <link rel="alternate" hreflang="en" href="https://example.com/">
164
+ <link rel="alternate" hreflang="x-default" href="https://example.ru/">
165
+ ```
166
+
167
+ - Ссылки **взаимные**: каждая версия ссылается на все остальные и на себя (self-referencing обязателен).
168
+ - `x-default` — для страницы выбора языка/региона.
169
+ - Не путай с `lang="ru"` на `<html>` — это разные вещи (hreflang про альтернативные URL).
170
+ - Ошибки видны в GSC (отчёт «Международные цели») — проверяй.
171
+ - Для example.org (один язык, один регион) hreflang **не нужен** — не добавляй «на всякий случай».
172
+
173
+ ## 9. Мобильный и Core Web Vitals
174
+
175
+ Индексирование mobile-first: робот в основном смотрит мобильную версию. Значит мобильная версия должна
176
+ содержать тот же контент и мета, что десктопная.
177
+
178
+ ### Пороговые значения CWV (75-й перцентиль, отдельно mobile/desktop)
179
+
180
+ | Метрика | Хорошо | Требует улучшения | Плохо | Что оптимизировать |
181
+ |---|---|---|---|---|
182
+ | **LCP** (загрузка) | ≤ 2,5 с | 2,5–4,0 с | > 4,0 с | сервер/TTFB, размер LCP-картинки, preload, `fetchpriority="high"`, критический CSS |
183
+ | **INP** (отзывчивость) | ≤ 200 мс | 200–500 мс | > 500 мс | длинные JS-задачи, разбиение, `requestIdleCallback`, меньше сторонних скриптов |
184
+ | **CLS** (сдвиги) | ≤ 0,1 | 0,1–0,25 | > 0,25 | размеры у img/iframe/video, `font-display`, место под баннеры, без вставок над контентом |
185
+
186
+ Источник: `web.dev/articles/vitals` (обновлено 31.10.2024; INP заменил FID в марте 2024).
187
+
188
+ Быстрые победы:
189
+ - LCP-изображение — не `loading="lazy"`, наоборот `fetchpriority="high"` + `preload`; WebP/AVIF; правильные размеры;
190
+ CDN или кеш; TTFB < 0,8 с (цель).
191
+ - Шрифты: `font-display: swap`, `preload` для основного, `size-adjust`/фолбэк с похожими метриками.
192
+ - CLS: всегда `width`/`height` или `aspect-ratio`; не вставляй рекламу/баннер над контентом; не подменяй шрифт
193
+ с другими метриками без `size-adjust`.
194
+ - JS: минимум сторонних скриптов; счётчики — async/defer; тяжёлые виджеты (карты, чаты) — lazy после
195
+ взаимодействия.
196
+ - Проверка: PageSpeed Insights (поле + лаборатория), GSC «Основные интернет-показатели», Lighthouse,
197
+ Chrome UX Report (CrUX). Лабораторные данные ≠ полевые: сдавай по полевым (CrUX) или по плану улучшения.
198
+
199
+ ## 10. JavaScript / SPA
200
+
201
+ Google умеет рендерить JS, но:
202
+ - Рендеринг **отложенный** и не гарантирован для каждого URL; `noindex` в JS может не сработать — только в HTML.
203
+ - Контент, ссылки, мета должны быть в **исходном HTML** (SSR/SSG/prerender). Проверка: `curl -A "Googlebot" URL`
204
+ и `view-source:` — в ответе должны быть title/description/H1/текст/ссылки.
205
+ - После 2025 Google уточнял: страницы с не-200 кодом могут **не** отправляться на рендеринг — не отдавай
206
+ контент с 404/500 «для красоты».
207
+ - Ссылки — настоящие `<a href>`, а не `onclick`/`div`.
208
+ - Canonical — в исходном HTML, соответствующий серверному URL. Canonical, добавленный только через JS,
209
+ Google может проигнорировать (проверить на актуальной версии).
210
+ - SPA-роутинг: каждый маршрут должен иметь серверный ответ 200 с уникальным HTML (SSR/SSG), иначе будет
211
+ один индексируемый URL и пустые остальные.
212
+ - Dynamic rendering — **не рекомендуется** (временный костыль), лучше SSR/SSG.
213
+
214
+ Стек-решения: `stack-recipes.md`.
215
+
216
+ ## 11. Лог-анализ и crawl budget (для больших сайтов)
217
+
218
+ Когда делать: > 10 000 URL, тысячи фасетов, медленная индексация, скачки 5xx.
219
+ - Возьми access-логи за 7–30 дней, отфильтруй по `Googlebot`/`YandexBot` user-agent + проверь **обратный DNS**
220
+ (user-agent легко подделать).
221
+ - Что смотреть: доля 5xx/404 у робота, самые обходимые URL (не мусор ли), глубина обхода, скорость ответа
222
+ роботу, сколько уникальных URL обошёл за период, какие разделы робот не заходит вообще.
223
+ - Цель: робот тратит бюджет на деньги-страницы, а не на `?sort=price_asc&page=17`.
224
+ - Яндекс: «Индексирование → Обход сайта» в Вебмастере; Google: GSC → «Настройки → Статистика обхода»
225
+ (в 2025 часть отчётов переехала — проверить расположение на актуальной версии).
226
+ - Инструмент: `seo-audit.mjs` умеет считать распределение статусов по логам, если передать access.log.
227
+
228
+ ## 12. Миграции URL и переезды (самый опасный жанр)
229
+
230
+ Чек-лист миграции (переезд, смена ЧПУ, редизайн, смена CMS):
231
+ 1. **Инвентаризация:** выгрузи все индексируемые URL (sitemap + GSC/Вебмастер + краул), зафиксируй трафик
232
+ по URL за 3 месяца (baseline).
233
+ 2. **Карта редиректов** «старый → новый», 1:1, без цепочек. Для групп — правила, но проверь каждую.
234
+ 3. **301** на новые URL (не 302), на уровне сервера/`.htaccess`/nginx, до приложения.
235
+ 4. **Внутренние ссылки** — обнови на новые URL (иначе робот ходит по старым через редирект).
236
+ 5. **sitemap** — только новые URL; отправь в GSC и Вебмастер.
237
+ 6. **Canonical/OG/hreflang** — обнови.
238
+ 7. **Мониторинг 2–4 недели:** 404 и 5xx в GSC/Вебмастере и логах; «Страницы» — не растёт ли «Не найдено».
239
+ 8. **Инструмент смены адреса:** GSC «Изменение адреса» (для смены домена), Яндекс Вебмастер — «Переезд сайта».
240
+ Для смены структуры внутри домена — только редиректы + новые sitemap.
241
+ 9. Не выкатывай редизайн и смену URL одновременно с крупным релизом — не сможешь отделить причину просадки.
242
+
243
+ Правило отката: карта редиректов и старые шаблоны мета хранятся в git, откат — за один деплой.
244
+
245
+ ## 13. Безопасность и служебные зоны
246
+
247
+ - Служебные разделы (`/admin`, `/bitrix/`, `/local/`, личные кабинеты, поиск, корзина) — `noindex` или
248
+ `Disallow` + `noindex`; лучше `noindex,follow`, чтобы не плодить «скрытые» URL в индексе.
249
+ - Тестовые домены/стейджи — **HTTP Basic Auth** или `noindex` + robots, иначе копии контента конкурируют.
250
+ - `noindex` на страницах пагинации/фильтров — только осознанно (см. §7).
251
+ - Не отдавай 200 на несуществующие страницы (soft 404) и не прячь ошибки PHP за «красивой» страницей.
252
+ - `X-Robots-Tag` в заголовках — для не-HTML (PDF, изображения) и для закрытия целых групп на сервере.
253
+
254
+ ## 14. Частые технические ошибки (топ-20)
255
+
256
+ 1. `noindex` на услугах/деньгах после «правок безопасности».
257
+ 2. Canonical с параметрами (`?utm=`) или на главную со всех страниц.
258
+ 3. Дубли www/http/слэш без 301.
259
+ 4. Шаблонные title/description на сотнях страниц.
260
+ 5. Sitemap с 404/редиректами/`noindex`.
261
+ 6. `lastmod` = сегодня у всех URL.
262
+ 7. Закрытые в robots.txt CSS/JS → робот не видит контент.
263
+ 8. Цепочки редиректов и редирект на главную вместо 404.
264
+ 9. Контент только после JS без SSR.
265
+ 10. Lazy-load на LCP-картинке.
266
+ 11. Нет `width/height` у изображений → CLS.
267
+ 12. Бесконечные фасеты в индексе.
268
+ 13. Нет мобильной версии/мобильная версия без контента десктопа.
269
+ 14. Битые внутренние ссылки и 404 в меню.
270
+ 15. Дубли контента между разделами без canonical.
271
+ 16. Разные URL для одного раздела (меню/крошки/хлебные крошки ведут на разные варианты).
272
+ 17. Пагинация с canonical на первую страницу.
273
+ 18. Скрытый текст/ссылки «для SEO» (риск санкций).
274
+ 19. Отсутствие 404-страницы с навигацией (пользователь уходит).
275
+ 20. Не настроен регион в Яндексе для локального бизнеса.
276
+
277
+ ## 15. Первоисточники (проверять при сомнениях)
278
+
279
+ - Технические требования Google: https://developers.google.com/search/docs/essentials
280
+ - Обход и индексация: https://developers.google.com/search/docs/crawling-indexing
281
+ - robots.txt: https://developers.google.com/search/docs/crawling-indexing/robots/intro
282
+ - Sitemap: https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap
283
+ - Canonical/дубли: https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls
284
+ - URL-структура: https://developers.google.com/search/docs/crawling-indexing/url-structure
285
+ - 301-редиректы: https://developers.google.com/search/docs/crawling-indexing/301-redirects
286
+ - HTTP-коды и сети: https://developers.google.com/search/docs/crawling-indexing/http-network-errors
287
+ - JavaScript SEO: https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics
288
+ - hreflang: https://developers.google.com/search/docs/specialty/international/localized-versions
289
+ - Спам-политики: https://developers.google.com/search/docs/essentials/spam-policies
290
+ - CWV: https://web.dev/articles/vitals · LCP: https://web.dev/articles/lcp · INP: https://web.dev/articles/inp ·
291
+ CLS: https://web.dev/articles/cls
292
+ - PageSpeed Insights: https://pagespeed.web.dev
293
+ - Яндекс Вебмастер (справка): https://yandex.ru/support/webmaster/ru/
294
+ - Обновления документации Google (хронология): https://developers.google.com/search/updates
@@ -0,0 +1,40 @@
1
+ ---
2
+ name: service-desk-conventions
3
+ description: "Соглашения и инварианты проекта Service Desk организация — где что лежит, как устроены модули, темы и RBAC, что нельзя ломать."
4
+ whenToUse: "Любая задача по проекту Service Desk (заявки, активы, склад, отчёты, справочник, AD/LDAP, UI) — читать перед правками."
5
+ user-invocable: true
6
+ ---
7
+
8
+ # Service Desk организация — соглашения проекта
9
+
10
+ ## Где что
11
+ - Рабочая копия (1.39.0): `%USERPROFILE%\OneDrive\Документы\deepseek-harness\default-workspace\src\service-desk-1.38.1`
12
+ - Досье проекта: `%USERPROFILE%\.dsh\memory\projects\service-desk.md`
13
+ - Приватный архив (аудит/тесты/релизы/скриншоты): `%USERPROFILE%\.dsh\memory\projects\service-desk\`
14
+ - Реальный сервер: `app-server`, `/var/www/service-desk`, PostgreSQL `servicedesk`, сайт `http://127.0.0.1:8000`.
15
+
16
+ ## Архитектура (коротко)
17
+ - Laravel 13 / PHP 8.5 / PostgreSQL / Blade + Vite + SCSS.
18
+ - Модули: `modules/{Tickets,Assets,Inventory,Reports,DirectorySync}`; регистрация — явно `config/modules.php` → `app/Providers/ModuleServiceProvider.php`; провайдер = `loadViewsFrom` + `loadMigrationsFrom` + `Route::middleware('web')->group(routes/web.php)`.
19
+ - Маршруты модулей **без `auth`** — только `permission:*`; добавляя маршрут, ставь `auth` (или осознанно) и `permission:*`; не переименовывай route names.
20
+ - RBAC: `CheckPermission` (`permission:`), `EnsureAdmin` (`admin`), `RoleGate` (ALLOWED/DENIED по именам). Админ-роль `admin` даёт все права.
21
+ - Темы: каркас `themes/default/views/layouts/app.blade.php` (один на все палитры); страницы — `themes/default/views/*`, `resources/views`, `modules/*/resources/views` (namespace `tickets::` и т.п.).
22
+ - UI-стили: `resources/scss/app.scss` → `_tokens.scss`, `_ui-refresh.scss` (новые правила сюда), `_legacy.scss` (только база).
23
+ - Аудит: `AuditObserver` (Ticket/Asset/Consumable/StockMove/Reminder/News) → `audit_logs`.
24
+
25
+ ## Нельзя ломать
26
+ - Миграции — только новые, аддитивные; не редактировать старые.
27
+ - `db:seed` в 1.39.1 идемпотентен — не переделывать на updateOrCreate/сброс паролей.
28
+ - Формы: не убирать `name`-атрибуты, `required` и подписи под полями (на них тесты `FormHintsTest`, `TicketFormVisibilityTest`).
29
+ - `@html` (HtmlSanitizer) — единственный безопасный вывод размеченного текста; не использовать `{!! !!}` для пользовательских данных.
30
+ - Права/владельцы: не менять логику доступа без теста на обычного пользователя и админа.
31
+ - Скрытые разделы: `MODULES_HIDDEN` (config `modules.hidden`), `Modules::visible()`.
32
+
33
+ ## Стиль кода
34
+ - Русский язык комментариев/интерфейса; PHP PSR-12 (Laravel Pint), 4 пробела.
35
+ - Транзакции для многозаписных операций, `lockForUpdate()` при гонках, валидация входящих данных.
36
+ - После доработки — bump версии в `config/app.php` (feature → minor, fix → patch) по правилам из досье.
37
+
38
+ ## Полезное
39
+ - Тесты: `php scripts/test.php` (из корня проекта), либо `make test` (Linux).
40
+ - Стандарты правок и релиза: скиллы `service-desk-db-safety`, `service-desk-testing`, `service-desk-release`, `service-desk-ui`.
@@ -0,0 +1,52 @@
1
+ ---
2
+ name: service-desk-db-safety
3
+ description: "Безопасная работа с PostgreSQL проекта Service Desk — бэкапы, восстановление, запрещённые команды, имитация обновления на копии."
4
+ whenToUse: "Перед любыми миграциями, сидами, загрузкой данных, релизом или действиями, которые могут изменить или удалить данные БД."
5
+ user-invocable: true
6
+ ---
7
+
8
+ # PostgreSQL: безопасность данных (Service Desk)
9
+
10
+ ## Железные правила
11
+ - Боевая БД — PostgreSQL на сервере `app-server` (`servicedesk`). Локальный кластер — только тестовый.
12
+ - **НИКОГДА** без прямого разрешения пользователя:
13
+ - `migrate:fresh|refresh|reset`, `db:wipe`, `db:seed` на боевой БД, `migrate:rollback`, `dropdb`;
14
+ - `TRUNCATE` для `phonebook_entries` (каскад на `users` и связанные таблицы!);
15
+ - `composer run preview:reset` (при отсутствии `.env.preview` берёт боевой `.env` → `migrate:fresh` на проде);
16
+ - `clear-tickets.sh` / `tickets:purge` (удаляет все заявки и вложения).
17
+ - Перед рискованным: бэкап + проверка окружения.
18
+ - Никогда не подключаться к боевой БД с локальных экспериментов.
19
+
20
+ ## Бэкап (на сервере)
21
+ ```bash
22
+ sudo -u den php artisan backup:run --reason="before-<что>"
23
+ sudo -u postgres pg_dump -Fc -d servicedesk -f /var/backups/service-desk/pre-<версия>.dump
24
+ sudo -u postgres pg_restore -l /var/backups/service-desk/pre-<версия>.dump | head
25
+ ```
26
+ - `backup:run` кладёт database.dump + env.txt + files.zip в `BACKUP_PATH` (по умолчанию `/var/backups/service-desk`).
27
+ - Копию обязательно скачать себе (WinSCP), не хранить только на том же сервере.
28
+ - Требует `pg_dump` в PATH (на сервере есть; локально Windows — добавить `C:\Program Files\PostgreSQL\18\bin`).
29
+
30
+ ## Восстановление (только по разрешению)
31
+ ```bash
32
+ cd /var/www/service-desk && sudo -u den php artisan down
33
+ sudo -u postgres dropdb servicedesk && sudo -u postgres createdb servicedesk
34
+ sudo -u postgres pg_restore --no-owner --role=postgres -d servicedesk <dump>
35
+ sudo -u den php artisan migrate --force && sudo -u den php artisan optimize:clear
36
+ sudo -u den php artisan up
37
+ ```
38
+ `dropdb` — только после подтверждения и при наличии проверенного дампа.
39
+
40
+ ## Локальная проверка (безопасно)
41
+ - Локальный кластер: PostgreSQL 18, данные `...\default-workspace\pgruntime\data` (ICU locale ru-RU, порт 5432); БД `servicedesk` (dev) и `servicedesk_test` (PHPUnit, RefreshDatabase).
42
+ - Имитация обновления: развернуть старую версию в отдельной папке/БД, засеять данные, снять контрольные суммы, наложить новый код, `migrate --force`, сверить counts/md5 — см. скилл `pg-upgrade-verify`.
43
+ - В тестах `RefreshDatabase` работает только на `servicedesk_test`, не на прод.
44
+
45
+ ## Перед релизом с миграциями
46
+ 1. Сравнить списки миграций старой и новой версии; прочитать новые: нет ли `dropColumn`, изменения NOT NULL, переименований.
47
+ 2. Прогнать `php artisan migrate --pretend` (на копии!) и посмотреть SQL.
48
+ 3. Сделать бэкап, только потом `migrate --force`.
49
+
50
+ ## Признаки проблемы
51
+ - Сайт в maintenance → `sudo -u den php artisan up`.
52
+ - Ошибки БД → `storage/logs/laravel.log`, `journalctl -u service-desk-queue`, не спешить с откатом/восстановлением.
@@ -0,0 +1,43 @@
1
+ ---
2
+ name: service-desk-release
3
+ description: "Выпуск и выкатка обновления Service Desk — версия, сборка tgz, checksums, deploy/update.sh, проверки и откат."
4
+ whenToUse: "При подготовке любого обновления или релиза и при выкатке на сервер app-server."
5
+ user-invocable: true
6
+ ---
7
+
8
+ # Релиз Service Desk (tgz + update.sh)
9
+
10
+ ## Правила версии
11
+ - Версия по умолчанию — `config/app.php`: `env('APP_VERSION', 'X.Y.Z')`.
12
+ - feature → minor (1.39.0 → 1.40.0), fix → patch (1.39.0 → 1.39.1), breaking → major.
13
+ - При обновлении `deploy-ubuntu.sh` берёт RELEASE из `config/app.php` и записывает в `.env`.
14
+
15
+ ## Сборка архива (как Claude Code)
16
+ 1. Правки проверены: `php scripts/test.php` зелёный, UI-скриншоты сделаны.
17
+ 2. Собрать tgz **без** `vendor/ node_modules/ public/build/ storage/ .env .env.preview .git .claude`.
18
+ 3. Надёжный способ: распаковать эталонную предыдущую версию в staging, наложить изменённые файлы, `tar -czf`.
19
+ 4. Посчитать sha256, записать в `checksums.txt`; файл положить на Рабочий стол.
20
+
21
+ ## Выкатка (сервер app-server, пользователь den)
22
+ ```bash
23
+ cd /tmp && sha256sum service-desk-X.Y.Z.tgz # сверить с локальным
24
+ sudo tar --no-same-owner -xzf /tmp/service-desk-X.Y.Z.tgz -C /var/www/service-desk
25
+ cd /var/www/service-desk && sudo APP_ADDR=127.0.0.1 bash deploy/update.sh
26
+ ```
27
+ `update.sh` сам: backup → maintenance → composer/npm/build → migrate → seed (идемпотентен) → services/caches → up.
28
+
29
+ ## Проверки после «Готово»
30
+ 1. Ctrl+F5 → версия внизу меню = X.Y.Z.
31
+ 2. Число заявок прежнее, старые номера/вложения открываются.
32
+ 3. Затронутый раздел/фича работает (сценарий из задачи).
33
+ 4. Админ и обычный пользователь — оба сценария.
34
+ 5. При желании: `sudo -u den php artisan launch:check`.
35
+
36
+ ## Откат
37
+ - Код: вернуть папку `Task.old-<дата>` (если делали копию до обновления) или распаковать предыдущий архив.
38
+ - БД: восстанавливать только если релиз менял данные/схему (см. `service-desk-db-safety`); обычно не нужно.
39
+ - Снять maintenance: `sudo -u den php artisan up`.
40
+
41
+ ## Журнал
42
+ - Записать факт выкатки и проверки в `%USERPROFILE%\.dsh\memory\SESSIONS.md` + досье проекта.
43
+ - Структуру/команды и пример — `...\memory\projects\service-desk\release\UPDATE-1.39.0.md`.
@@ -0,0 +1,47 @@
1
+ ---
2
+ name: service-desk-testing
3
+ description: "Как тестировать Service Desk — PHPUnit на PostgreSQL, baseline, известные особенности, Playwright E2E и визуальные проверки."
4
+ whenToUse: "При любой правке кода или UI проекта — до и после изменений; при подготовке релиза."
5
+ user-invocable: true
6
+ ---
7
+
8
+ # Тестирование Service Desk
9
+
10
+ ## Рабочая копия
11
+ `%USERPROFILE%\OneDrive\Документы\deepseek-harness\default-workspace\src\service-desk-1.38.1`
12
+
13
+ ## PHPUnit на PostgreSQL (обязательно)
14
+ ```powershell
15
+ # из корня проекта (Windows)
16
+ php scripts/test.php
17
+ # Linux/CI
18
+ make test
19
+ ```
20
+ Скрипт поднимает env: `DB_CONNECTION=pgsql DB_HOST=127.0.0.1 DB_PORT=5432 DB_DATABASE=servicedesk_test DB_USERNAME=postgres DB_PASSWORD= APP_URL=http://localhost`.
21
+ - Тесты используют `RefreshDatabase` на **servicedesk_test** — боевую БД не трогают.
22
+ - Локальный кластер PostgreSQL 18: `pgruntime/data` (ICU locale ru-RU — важно для ILIKE кириллицы), порт 5432.
23
+ - Если PG не запущен: `Start-Process "$pgbin\pg_ctl.exe" -ArgumentList @('-D', $data, '-l', $log, 'start') -WindowStyle Hidden`.
24
+ - Baseline (эталон): 542 теста / 2750 assertions — все зелёные (предупреждение PHPUnit deprecation — нормально).
25
+ - Пропуски `markTestSkipped` — только для отсутствующих пользовательских файлов (`docs/requests/*.xlsx`), это норм.
26
+
27
+ ## Что проверять
28
+ 1. До правки — зафиксировать baseline (`php scripts/test.php`), после — сравнить.
29
+ 2. Новую функциональность покрывать: feature-тест доступов/валидации/сценария + unit для логики.
30
+ 3. Права: отдельно проверить админа и обычного пользователя (нельзя открывать служебные поля/разделы).
31
+ 4. Данные: форма не должна терять/подменять значения (см. `TicketStrictAccountingTest`).
32
+
33
+ ## E2E/UI (Playwright)
34
+ - Инструменты: `%USERPROFILE%\OneDrive\Документы\deepseek-harness\default-workspace\tools\e2e` (`npx.cmd playwright test`).
35
+ - Стенд: `php artisan serve --port=8125` из рабочей копии (PG dev-БД `servicedesk`); вход `admin@example.com/admin`, `user@example.com/user`.
36
+ - Скриншоты складывать в `...\default-workspace\audit\screenshots\` (desktop 1440 + mobile 390/412, светлая/тёмная темы).
37
+ - Эталонные e2e: `tools\e2e\tests\priority.spec.js` (фича 1.39.0).
38
+
39
+ ## Известные особенности
40
+ - Тесты требуют собранный `public/build` (`@vite` в layout). Пересобрать: `npm run build`.
41
+ - Локальный Windows: `is_writable` мог быть false под старыми политиками — сейчас полный доступ.
42
+ - Не запускай полный набор параллельно с другим прогоном (общая БД `servicedesk_test`).
43
+ - При падении: читать `storage/logs/laravel.log` (в тестах `LOG_CHANNEL=null` в скрипте) и полный вывод PHPUnit.
44
+
45
+ ## Качество
46
+ - `make lint` / `php scripts/lint.php` — Pint по изменённым файлам (vs HEAD);
47
+ - `make stan` / `php scripts/stan.php` — PHPStan/Larastan (baseline для legacy).
@@ -0,0 +1,33 @@
1
+ ---
2
+ name: service-desk-ui
3
+ description: "Правила UI/UX проекта Service Desk — где править вёрстку и темы, дизайн-токены, скриншоты и визуальная проверка."
4
+ whenToUse: "Любая правка интерфейса, тем, вёрстки, SCSS/JS или UX-текстов в Service Desk."
5
+ user-invocable: true
6
+ ---
7
+
8
+ # UI/UX Service Desk
9
+
10
+ ## Где править
11
+ - Каркас (меню/шапка/футер): `themes/default/views/layouts/app.blade.php` (темы — только палитры; отдельные папки тем удалены).
12
+ - Страницы: `themes/default/views/*` (dashboard, news, reminders, users, access), `resources/views/*` (auth/login, errors/403, phonebook, partials, pagination), `modules/*/resources/views/*` (заявки, активы, склад, отчёты — namespace `tickets::` и т.п.).
13
+ - Стили: `resources/scss/app.scss` — точка входа; новые правила в `_ui-refresh.scss`, базовое — `_legacy.scss`; токены — `_tokens.scss`.
14
+ - JS: `resources/js/app.js` (+ Bootstrap, виджеты React по требованию). Сборка: `npm run build` (иначе production 500 и тесты падают).
15
+ - Иконки: `public/themes/default/icons/*.svg`; шрифты: `public/fonts`.
16
+
17
+ ## Дизайн-правила проекта
18
+ - Прямые углы (радиусы 0), спокойная медицинская палитра, 4 палитры: light/dark/contrast/modern.
19
+ - Обязательные состояния: hover, focus-visible, active, disabled, loading, empty, error.
20
+ - Адаптив: ≤560px (одна колонка), ≤960px (меню сверху), >960px (сайдбар); широкие таблицы — в `.table-wrap`.
21
+ - Под каждым полем — `.field-help` (одно предложение, без терминов); ошибки — `.field-error`; обязательные — `label-required`.
22
+ - Не использовать `{!! !!}` для пользовательского контента — только `@html` (HtmlSanitizer).
23
+ - Тексты — по-русски, коротко и по делу; кнопки — глаголом («Создать заявку», «Сохранить»).
24
+
25
+ ## Проверка UI
26
+ 1. `php artisan serve --port=8125` из рабочей копии; вход `admin@example.com/admin` / `user@example.com/user`.
27
+ 2. Playwright: `...\default-workspace\tools\e2e` → `npx.cmd playwright test`; скриншоты desktop 1440 и mobile (Pixel 7).
28
+ 3. Проверить светлую и тёмную темы, пустые состояния, длинные тексты, кириллицу, ошибки форм.
29
+ 4. Скриншоты «до/после» приложить к отчёту (`...\default-workspace\audit\screenshots`).
30
+
31
+ ## Полезное
32
+ - Прошлые скриншоты: `%USERPROFILE%\.dsh\memory\projects\service-desk\screenshots\`
33
+ - Правила вывода ошибок/валидации: `resources/lang` нет — `lang/ru/validation.php`; сообщения на русском.
@@ -0,0 +1,91 @@
1
+ ---
2
+ name: skills-router
3
+ description: "Маршрутизатор навыков: классифицирует любую задачу и обязывает загрузить все применимые скиллы до начала работы — код, анализ, тесты, дизайн, SEO, БД, безопасность, релиз, плагины."
4
+ whenToUse: "В начале КАЖДОЙ задачи (даже небольшой): быстро определить тип работы и загрузить нужные скиллы; при сомнении загрузить и просмотреть."
5
+ user-invocable: true
6
+ ---
7
+
8
+ # SKILLS-ROUTER — навыки применяются сами, везде, где применимо
9
+
10
+ > Проблема, которую решает этот скилл: модель знает о скиллах, но забывает их загрузить — особенно
11
+ > в «мелких» задачах. Здесь жёсткий протокол: **классифицируй задачу → загрузи применимые скиллы →
12
+ > только потом действуй**. Навык — не справка «на всякий случай», а рабочий контракт.
13
+
14
+ ## 0. Правило
15
+ 1. В начале задачи (до чтения кода/данных) пройди триаж по таблице ниже.
16
+ 2. Загрузи **все** применимые скиллы через tool `skill`. Два-три скилла — норма, не перегруз.
17
+ 3. В плане/первом сообщении явно перечисли, какие скиллы применяешь и почему.
18
+ 4. В финальном отчёте — какие гейты пройдены. Если ни один скилл не применим — скажи это.
19
+ 5. «Маленькая задача» — не причина пропускать скилл: именно мелочи чаще всего ломают данные/дизайн/SEO.
20
+ 6. Проектные скиллы уточняют универсальные; при конфликте побеждает проектный, но не в ущерб безопасности.
21
+ 7. Вопрос про **актуальное/сегодня/последние изменения/цены/версии/законы** — это всегда `web-research` (живой `web_search` + `web_fetch`), с датой и ссылками. Память модели не источник свежих фактов.
22
+
23
+ ## 1. Триаж за 60 секунд
24
+ Ответь себе:
25
+ - **Что создаём/меняем?** (код, интерфейс, контент, данные, конфиг, документ, инфраструктура, плагин)
26
+ - **Какой стек?** (PHP/Laravel, Bitrix/Aspro, JS/TS/React, Python, PowerShell, SQL, HTML/CSS)
27
+ - **Какие риски?** (данные/БД, безопасность/доступ, деньги, публичный контент, прод, необратимость)
28
+ - **Что пользователь увидит/измерит?** (UI, SEO, скорость, отчёты, API)
29
+ - **Как проверим?** (тесты, скриншоты, аудит, ручной сценарий, бэкап/восстановление)
30
+ - **Какие артефакты на выходе?** (файлы, архив, релиз, документация, скриншоты)
31
+
32
+ ## 2. Матрица «тип задачи → скиллы»
33
+
34
+ | Тип задачи / триггер | Обязательные скиллы |
35
+ |---|---|
36
+ | **Любая задача** (старт и финал) | `skills-router`, `dev-workflow`; в конце — `code-review-checklist` |
37
+ | Планирование, ТЗ, анализ, декомпозиция, оценка, исследование | `requirements-and-planning` (+ `dev-workflow`) |
38
+ | Актуальные факты, новости, «что сейчас», цены, версии, законы, документация, конкуренты | `web-research` (+ профильный: `content-writing` / `seo` / `php-laravel` / `bitrix-aspro` по теме) |
39
+ | Любая вёрстка, UI, компонент, лендинг, дашборд, тема, адаптив | `wow-design`; ревью/апгрейд — `design-critique`; стили/каскад — `css-scss` |
40
+ | Любой веб-артефакт: страница, шаблон, URL, мета, контент, миграция сайта, лендинг, блог | `seo` (SEO по умолчанию) + `wow-design` (если UI) |
41
+ | Laravel / PHP / Blade / Eloquent / artisan | `php-laravel`; при UI — `wow-design`; при контенте — `seo` |
42
+ | Bitrix / Aspro / шаблоны сайта | `bitrix-aspro` + `seo` (+ `css-scss` при стилях) |
43
+ | React / JS / TS / Vite / Node / плагины DSH | `javascript-typescript` (+ `react` для React, `security-review` для плагинов) |
44
+ | БД, SQL, миграции, импорт/экспорт, восстановление | `database-safety` (+ проектный `service-desk-db-safety`); перед миграциями — бэкап |
45
+ | Тесты (unit/feature/E2E/визуальные), baseline | `testing-strategy` (+ `service-desk-testing` для Service Desk) |
46
+ | Баг, падение теста, «не работает» | `debugging-playbook`; тесты — `testing-strategy` |
47
+ | Аутентификация, авторизация, роли, загрузки, платежи, секреты | `security-review` (+ `code-review-checklist`) |
48
+ | Релиз, деплой, версия, архив, откат | `release-and-deploy` (+ `git-and-ci`, `service-desk-release` при необходимости) |
49
+ | Git, ветки, CI, теги, коммиты | `git-and-ci` |
50
+ | Документы Word/Excel/PowerPoint/PDF | `office` + соответствующий `office-*` |
51
+ | Генерация изображений | `img` |
52
+ | Проверка/аудит готового кода/UI | `code-review-checklist` + `design-critique` (UI) + `seo` (веб) |
53
+ | Анализ/исследование/сравнение вариантов | `requirements-and-planning` + `dev-workflow`; фиксировать выводы в память |
54
+
55
+ Несколько строк применимы одновременно — загрузи все (например, «новый лендинг на Laravel» → `php-laravel` + `wow-design` + `seo` + `testing-strategy` + `code-review-checklist`).
56
+
57
+ ## 3. Минимальный набор по артефактам
58
+
59
+ | Артефакт | Минимум |
60
+ |---|---|
61
+ | Новая страница/лендинг | `wow-design` + `seo` (+ `css-scss`, если правятся стили) |
62
+ | Новый компонент/UI-кит | `wow-design` (+ `react`/`javascript-typescript`) |
63
+ | Правка шаблона Bitrix | `bitrix-aspro` + `seo` (+ `wow-design` для UI) |
64
+ | Миграция/изменение схемы | `database-safety` + `php-laravel` (+ бэкап) |
65
+ | Новый API/форма/авторизация | `php-laravel` + `security-review` + `testing-strategy` |
66
+ | Плагин/скрипт автоматизации | `javascript-typescript` + `security-review` + `testing-strategy` |
67
+ | Релизный архив/выкатка | `release-and-deploy` + `git-and-ci` (+ `code-review-checklist`) |
68
+ | Тексты/статьи/анкеты для сайта | `seo` + `requirements-and-planning` (+ `wow-design`, если вёрстка) |
69
+ | Аудит существующего | `code-review-checklist` (+ `design-critique`/`seo` по объекту) |
70
+
71
+ ## 4. Что считается «применил скилл»
72
+ - Прочитал `SKILL.md` и релевантные `references/` (не только каталог).
73
+ - Взял оттуда конкретные правила/шаблоны/чек-листы и применил их в работе.
74
+ - Прошёл гейт/DoD из скилла (тесты, скриншоты, SEO-аудит, бэкап, ревью и т.д.).
75
+ - Указал в отчёте: «Применено: wow-design (гейт рубрики 4.6), seo (title/meta/schema), testing-strategy (unit+E2E)».
76
+
77
+ ## 5. Антипаттерны (не делать)
78
+ - «Загружу скилл, если вспомню» — триаж обязателен в начале.
79
+ - Прочитать только `description` и считать, что применил.
80
+ - Пропустить `seo`, потому что «это просто правка шаблона» — именно шаблоны ломают индексацию.
81
+ - Пропустить `database-safety`, потому что «миграция аддитивная» — бэкап всё равно обязателен.
82
+ - Игнорировать `wow-design`, потому что «это внутренняя админка» — качество UI влияет на скорость работы.
83
+ - Применять веб-скиллы (`css-scss`, `seo`) к не-веб задачам (скрипт, документ, БД) — шум и потеря времени.
84
+ - Загрузить 5 скиллов и не применить ни один.
85
+
86
+ ## 6. Автоконтроль перед сдачей
87
+ - [ ] Триаж выполнен в начале, список скиллов зафиксирован.
88
+ - [ ] Все применимые скиллы загружены и реально использованы.
89
+ - [ ] Гейты пройдены: тесты/скриншоты/SEO/бэкап/ревью — что применимо.
90
+ - [ ] В отчёте перечислены применённые скиллы и результаты гейтов.
91
+ - [ ] Если скилл не применим — это осознанное решение, а не забывчивость.