dsh-desktop-kit 0.0.0-stage → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (269) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +152 -2
  3. package/client.js +4101 -0
  4. package/cordis.patch.yml +5 -0
  5. package/docs/ARCHITECTURE.md +114 -0
  6. package/docs/COMPATIBILITY.md +61 -0
  7. package/docs/INSTALL.md +84 -0
  8. package/docs/PRIVACY.md +50 -0
  9. package/docs/ROADMAP.md +57 -0
  10. package/docs/TOKENS.md +118 -0
  11. package/docs/TROUBLESHOOTING.md +68 -0
  12. package/docs/images/hero.png +0 -0
  13. package/index.js +84 -0
  14. package/package.json +70 -4
  15. package/plugins/dsh-gkb-ru-ui/cordis.patch.yml +6 -0
  16. package/plugins/dsh-gkb-ru-ui/lib/client.js +1331 -0
  17. package/plugins/dsh-gkb-ru-ui/lib/index.js +186 -0
  18. package/plugins/dsh-gkb-ru-ui/lib/skills.js +570 -0
  19. package/plugins/dsh-gkb-ru-ui/package.json +28 -0
  20. package/plugins/dsh-gkb-ru-ui/screenshots/01-home-tiles-1440-light.png +0 -0
  21. package/plugins/dsh-gkb-ru-ui/screenshots/02-skills-1440-light.png +0 -0
  22. package/plugins/dsh-gkb-ru-ui/screenshots/03-skills-editor-1440-light.png +0 -0
  23. package/plugins/dsh-gkb-ru-ui/screenshots/04-skills-1440-dark.png +0 -0
  24. package/plugins/dsh-gkb-ru-ui/screenshots/05-skills-390-light.png +0 -0
  25. package/plugins/dsh-gkb-ru-ui/screenshots/06-home-tiles-1440-dark.png +0 -0
  26. package/plugins/dsh-peak-guard/README.md +70 -0
  27. package/plugins/dsh-peak-guard/client.js +741 -0
  28. package/plugins/dsh-peak-guard/cordis.patch.yml +5 -0
  29. package/plugins/dsh-peak-guard/icon.svg +12 -0
  30. package/plugins/dsh-peak-guard/index.js +2 -0
  31. package/plugins/dsh-peak-guard/locale/en.json +6 -0
  32. package/plugins/dsh-peak-guard/locale/ru.json +6 -0
  33. package/plugins/dsh-peak-guard/locale/zh.json +6 -0
  34. package/plugins/dsh-peak-guard/package.json +33 -0
  35. package/plugins/dsh-peak-guard/screenshots/01-real-time-peak-start.png +0 -0
  36. package/plugins/dsh-peak-guard/screenshots/02-real-time-peak-end.png +0 -0
  37. package/plugins/dsh-peak-guard/screenshots/03-peak-card-1440-light.png +0 -0
  38. package/plugins/dsh-peak-guard/screenshots/04-peak-card-1440-dark.png +0 -0
  39. package/plugins/dsh-peak-guard/screenshots/05-peak-card-390-light.png +0 -0
  40. package/plugins/dsh-peak-guard/screenshots/05-peak-card-768-light.png +0 -0
  41. package/plugins/dsh-peak-guard/screenshots/06-peak-card-390-light.png +0 -0
  42. package/plugins/dsh-peak-guard/screenshots/07-live-preview-check.png +0 -0
  43. package/plugins/dsh-peak-guard/screenshots/07-pre-peak-1440-light.png +0 -0
  44. package/plugins/dsh-peak-guard/screenshots/08-peak-start-1440-light.png +0 -0
  45. package/plugins/dsh-peak-guard/screenshots/09-peak-end-1440-light.png +0 -0
  46. package/plugins/dsh-peak-guard/screenshots/10-pre-peak-card-1440-light.png +0 -0
  47. package/plugins/dsh-peak-guard/screenshots/11-pre-peak-card-1440-dark.png +0 -0
  48. package/plugins/dsh-peak-guard/screenshots/12-pre-peak-card-390-light.png +0 -0
  49. package/plugins/dsh-peak-guard/screenshots/qa-report.json +74 -0
  50. package/plugins/dsh-profile-transfer/README.md +62 -0
  51. package/plugins/dsh-profile-transfer/bootstrap/01-INSTALL.cmd +7 -0
  52. package/plugins/dsh-profile-transfer/bootstrap/README-ARCHIVE.md +54 -0
  53. 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
  54. package/plugins/dsh-profile-transfer/bootstrap/install-on-clean-machine.ps1 +119 -0
  55. 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
  56. package/plugins/dsh-profile-transfer/client.js +806 -0
  57. package/plugins/dsh-profile-transfer/cordis.patch.yml +3 -0
  58. package/plugins/dsh-profile-transfer/icon.svg +13 -0
  59. package/plugins/dsh-profile-transfer/index.js +375 -0
  60. package/plugins/dsh-profile-transfer/locale/en.json +6 -0
  61. package/plugins/dsh-profile-transfer/locale/ru.json +6 -0
  62. package/plugins/dsh-profile-transfer/locale/zh.json +6 -0
  63. package/plugins/dsh-profile-transfer/package.json +36 -0
  64. package/plugins/dsh-profile-transfer/screenshots/01-settings-transfer-1440-light.png +0 -0
  65. package/plugins/dsh-profile-transfer/screenshots/02-settings-transfer-preview-1440-light.png +0 -0
  66. package/plugins/dsh-profile-transfer/screenshots/03-settings-transfer-1440-dark.png +0 -0
  67. package/plugins/dsh-profile-transfer/screenshots/04-settings-transfer-390-light.png +0 -0
  68. package/plugins/dsh-profile-transfer/screenshots/05-settings-transfer-768-light.png +0 -0
  69. package/plugins/dsh-profile-transfer/screenshots/06-settings-transfer-390-dark.png +0 -0
  70. package/plugins/dsh-profile-transfer/screenshots/07-settings-transfer-export-result.png +0 -0
  71. package/plugins/dsh-profile-transfer/screenshots/08-settings-transfer-workspaces-1440-light.png +0 -0
  72. package/plugins/dsh-profile-transfer/screenshots/09-settings-transfer-workspaces-1440-dark.png +0 -0
  73. package/plugins/dsh-profile-transfer/screenshots/10-settings-transfer-workspaces-390-light.png +0 -0
  74. package/plugins/dsh-profile-transfer/transfer.js +1004 -0
  75. package/plugins/dsh-project-memory/README.md +71 -0
  76. package/plugins/dsh-project-memory/cordis.patch.yml +4 -0
  77. package/plugins/dsh-project-memory/icon.svg +12 -0
  78. package/plugins/dsh-project-memory/index.js +1240 -0
  79. package/plugins/dsh-project-memory/locale/en.json +6 -0
  80. package/plugins/dsh-project-memory/locale/ru.json +6 -0
  81. package/plugins/dsh-project-memory/locale/zh.json +6 -0
  82. package/plugins/dsh-project-memory/package.json +26 -0
  83. package/plugins/dsh-session-move/README.md +67 -0
  84. package/plugins/dsh-session-move/client.js +719 -0
  85. package/plugins/dsh-session-move/cordis.patch.yml +5 -0
  86. package/plugins/dsh-session-move/icon.svg +14 -0
  87. package/plugins/dsh-session-move/index.js +497 -0
  88. package/plugins/dsh-session-move/locale/en.json +6 -0
  89. package/plugins/dsh-session-move/locale/ru.json +6 -0
  90. package/plugins/dsh-session-move/locale/zh.json +6 -0
  91. package/plugins/dsh-session-move/package.json +31 -0
  92. package/plugins/dsh-session-move/screenshots/01-row-menu-1440-light.png +0 -0
  93. package/plugins/dsh-session-move/screenshots/02-dialog-1440-light.png +0 -0
  94. package/plugins/dsh-session-move/screenshots/03-dialog-390-light.png +0 -0
  95. package/plugins/dsh-session-move/screenshots/04-dialog-1440-dark.png +0 -0
  96. package/plugins/dsh-session-move/screenshots/05-drag-highlight-1440-light.png +0 -0
  97. package/plugins/dsh-session-move/screenshots/06-drop-ungrouped-highlight.png +0 -0
  98. package/plugins/dsh-session-move/screenshots/07-after-drop-ungrouped.png +0 -0
  99. package/plugins/dsh-session-move/screenshots/08-move-dialog.png +0 -0
  100. package/plugins/dsh-session-move/screenshots/09-moved-to-second-workspace.png +0 -0
  101. package/plugins/dsh-session-move/screenshots/qa-report.json +62 -0
  102. package/plugins/dsh-skill-autopilot/cordis.patch.yml +3 -0
  103. package/plugins/dsh-skill-autopilot/index.js +444 -0
  104. package/plugins/dsh-skill-autopilot/package.json +19 -0
  105. package/plugins/dsh-token-lab/cordis.patch.yml +3 -0
  106. package/plugins/dsh-token-lab/lib/client.js +504 -0
  107. package/plugins/dsh-token-lab/lib/index.js +275 -0
  108. package/plugins/dsh-token-lab/package.json +26 -0
  109. package/plugins/dsh-token-lab/screenshots/01-token-lab-1440-light.png +0 -0
  110. package/plugins/dsh-token-lab/screenshots/02-token-lab-1440-dark.png +0 -0
  111. package/skills/code-review-checklist/SKILL.md +55 -0
  112. package/skills/content-writing/README.md +87 -0
  113. package/skills/content-writing/SKILL.md +85 -0
  114. package/skills/content-writing/assets/checklists/fact-check.md +53 -0
  115. package/skills/content-writing/assets/checklists/publish.md +65 -0
  116. package/skills/content-writing/assets/checklists/social.md +40 -0
  117. package/skills/content-writing/assets/templates/article.md +47 -0
  118. package/skills/content-writing/assets/templates/brief.md +44 -0
  119. package/skills/content-writing/assets/templates/doctor-card.md +41 -0
  120. package/skills/content-writing/assets/templates/image-prompts.md +128 -0
  121. package/skills/content-writing/assets/templates/post-telegram.md +36 -0
  122. package/skills/content-writing/assets/templates/post-vk.md +42 -0
  123. package/skills/content-writing/assets/templates/press-release.md +56 -0
  124. package/skills/content-writing/assets/templates/science-pop-note.md +55 -0
  125. package/skills/content-writing/assets/templates/service-card.md +46 -0
  126. package/skills/content-writing/references/anti-ai-style.md +248 -0
  127. package/skills/content-writing/references/editing.md +185 -0
  128. package/skills/content-writing/references/fact-checking.md +205 -0
  129. package/skills/content-writing/references/government-medical.md +246 -0
  130. package/skills/content-writing/references/images.md +212 -0
  131. package/skills/content-writing/references/journalism.md +252 -0
  132. package/skills/content-writing/references/process.md +123 -0
  133. package/skills/content-writing/references/quick-recipes.md +99 -0
  134. package/skills/content-writing/references/rules.md +85 -0
  135. package/skills/content-writing/references/science-popular.md +218 -0
  136. package/skills/content-writing/references/seo-content.md +172 -0
  137. package/skills/content-writing/references/social-media.md +253 -0
  138. package/skills/content-writing/references/sources.md +49 -0
  139. package/skills/content-writing/references/templates.md +291 -0
  140. package/skills/context-economy/SKILL.md +60 -0
  141. package/skills/context-economy/references/long-session.md +35 -0
  142. package/skills/context-economy/references/token-math.md +42 -0
  143. package/skills/context-economy/references/tool-recipes.md +34 -0
  144. package/skills/database-safety/SKILL.md +47 -0
  145. package/skills/debugging-playbook/SKILL.md +42 -0
  146. package/skills/design-critique/SKILL.md +65 -0
  147. package/skills/design-critique/references/a11y.md +25 -0
  148. package/skills/design-critique/references/diagnoses.md +33 -0
  149. package/skills/design-critique/references/quick-tests.md +30 -0
  150. package/skills/design-critique/references/report-template.md +63 -0
  151. package/skills/design-critique/references/rubric-fast.md +73 -0
  152. package/skills/dev-workflow/SKILL.md +48 -0
  153. package/skills/dev-workflow/references/definition-of-done.md +44 -0
  154. package/skills/dev-workflow/references/memory-and-boundaries.md +31 -0
  155. package/skills/dev-workflow/references/stages.md +67 -0
  156. package/skills/git-and-ci/SKILL.md +60 -0
  157. package/skills/pg-upgrade-verify/SKILL.md +67 -0
  158. package/skills/project-deep-dive/SKILL.md +45 -0
  159. package/skills/project-deep-dive/references/recon-commands.md +90 -0
  160. package/skills/project-deep-dive/references/section-templates.md +104 -0
  161. package/skills/project-deep-dive/references/tool-and-process.md +86 -0
  162. package/skills/project-memory-maintenance/SKILL.md +55 -0
  163. package/skills/project-memory-maintenance/references/api-and-checklist.md +99 -0
  164. package/skills/project-memory-maintenance/references/journal-template.md +50 -0
  165. package/skills/project-memory-maintenance/references/section-rules.md +59 -0
  166. package/skills/release-and-deploy/SKILL.md +53 -0
  167. package/skills/requirements-and-planning/SKILL.md +49 -0
  168. package/skills/requirements-and-planning/references/antipatterns-and-checklist.md +20 -0
  169. package/skills/requirements-and-planning/references/process-steps.md +52 -0
  170. package/skills/requirements-and-planning/references/templates-and-estimates.md +29 -0
  171. package/skills/security-review/SKILL.md +40 -0
  172. package/skills/seo/README.md +60 -0
  173. package/skills/seo/SKILL.md +77 -0
  174. package/skills/seo/assets/README.md +66 -0
  175. package/skills/seo/assets/scripts/LICENSE-playwright-core.txt +202 -0
  176. package/skills/seo/assets/scripts/README.md +179 -0
  177. package/skills/seo/assets/scripts/lib/args.mjs +105 -0
  178. package/skills/seo/assets/scripts/lib/browser.mjs +620 -0
  179. package/skills/seo/assets/scripts/lib/zip.mjs +191 -0
  180. package/skills/seo/assets/scripts/seo-audit.mjs +1675 -0
  181. package/skills/seo/assets/snippets/jsonld-breadcrumb.json +30 -0
  182. package/skills/seo/assets/snippets/jsonld-faq.json +39 -0
  183. package/skills/seo/assets/snippets/jsonld-medical-clinic.json +49 -0
  184. package/skills/seo/assets/snippets/jsonld-medical-webpage.json +33 -0
  185. package/skills/seo/assets/snippets/jsonld-organization.json +74 -0
  186. package/skills/seo/assets/snippets/jsonld-physician.json +46 -0
  187. package/skills/seo/assets/snippets/meta.blade.php +61 -0
  188. package/skills/seo/assets/snippets/robots.txt +61 -0
  189. package/skills/seo/assets/snippets/sitemap-urlset-example.xml +72 -0
  190. package/skills/seo/assets/snippets/sitemap.xml +36 -0
  191. package/skills/seo/references/antipatterns.md +66 -0
  192. package/skills/seo/references/audit-checklist.md +319 -0
  193. package/skills/seo/references/content-seo.md +204 -0
  194. package/skills/seo/references/eeat-medical.md +219 -0
  195. package/skills/seo/references/measurement.md +250 -0
  196. package/skills/seo/references/on-page.md +214 -0
  197. package/skills/seo/references/page-templates.md +56 -0
  198. package/skills/seo/references/stack-recipes.md +695 -0
  199. package/skills/seo/references/structured-data.md +487 -0
  200. package/skills/seo/references/technical-seo.md +296 -0
  201. package/skills/service-desk-conventions/SKILL.md +52 -0
  202. package/skills/service-desk-db-safety/SKILL.md +63 -0
  203. package/skills/service-desk-release/SKILL.md +61 -0
  204. package/skills/service-desk-testing/SKILL.md +61 -0
  205. package/skills/service-desk-ui/SKILL.md +52 -0
  206. package/skills/skills-router/SKILL.md +53 -0
  207. package/skills/skills-router/references/applying-skills.md +25 -0
  208. package/skills/skills-router/references/routing-matrix.md +52 -0
  209. package/skills/testing-strategy/SKILL.md +52 -0
  210. package/skills/ui-design-system/SKILL.md +50 -0
  211. package/skills/ui-design-system/references/accessibility-and-responsive.md +50 -0
  212. package/skills/ui-design-system/references/tokens-and-components.md +67 -0
  213. package/skills/ui-design-system/references/visual-qa.md +44 -0
  214. package/skills/web-research/SKILL.md +47 -0
  215. package/skills/web-research/references/answer-and-citations.md +60 -0
  216. package/skills/web-research/references/query-recipes.md +44 -0
  217. package/skills/wow-design/SKILL.md +89 -0
  218. package/skills/wow-design/assets/kit/README.md +195 -0
  219. package/skills/wow-design/assets/kit/assets/css/base.css +158 -0
  220. package/skills/wow-design/assets/kit/assets/css/components.css +1001 -0
  221. package/skills/wow-design/assets/kit/assets/css/fonts.css +73 -0
  222. package/skills/wow-design/assets/kit/assets/css/pages.css +737 -0
  223. package/skills/wow-design/assets/kit/assets/css/tokens.css +218 -0
  224. package/skills/wow-design/assets/kit/assets/fonts/LICENSE-golos-text.txt +93 -0
  225. package/skills/wow-design/assets/kit/assets/fonts/LICENSE-lora.txt +93 -0
  226. package/skills/wow-design/assets/kit/assets/fonts/LICENSE-unbounded.txt +93 -0
  227. package/skills/wow-design/assets/kit/assets/fonts/golos-text-cyrillic-400-normal.woff2 +0 -0
  228. package/skills/wow-design/assets/kit/assets/fonts/golos-text-cyrillic-500-normal.woff2 +0 -0
  229. package/skills/wow-design/assets/kit/assets/fonts/golos-text-cyrillic-600-normal.woff2 +0 -0
  230. package/skills/wow-design/assets/kit/assets/fonts/golos-text-cyrillic-700-normal.woff2 +0 -0
  231. package/skills/wow-design/assets/kit/assets/fonts/golos-text-latin-400-normal.woff2 +0 -0
  232. package/skills/wow-design/assets/kit/assets/fonts/golos-text-latin-500-normal.woff2 +0 -0
  233. package/skills/wow-design/assets/kit/assets/fonts/golos-text-latin-600-normal.woff2 +0 -0
  234. package/skills/wow-design/assets/kit/assets/fonts/golos-text-latin-700-normal.woff2 +0 -0
  235. package/skills/wow-design/assets/kit/assets/fonts/lora-cyrillic-400-italic.woff2 +0 -0
  236. package/skills/wow-design/assets/kit/assets/fonts/lora-cyrillic-400-normal.woff2 +0 -0
  237. package/skills/wow-design/assets/kit/assets/fonts/lora-cyrillic-500-normal.woff2 +0 -0
  238. package/skills/wow-design/assets/kit/assets/fonts/lora-cyrillic-600-normal.woff2 +0 -0
  239. package/skills/wow-design/assets/kit/assets/fonts/lora-latin-400-normal.woff2 +0 -0
  240. package/skills/wow-design/assets/kit/assets/fonts/lora-latin-500-normal.woff2 +0 -0
  241. package/skills/wow-design/assets/kit/assets/fonts/lora-latin-600-normal.woff2 +0 -0
  242. package/skills/wow-design/assets/kit/assets/fonts/unbounded-cyrillic-400-normal.woff2 +0 -0
  243. package/skills/wow-design/assets/kit/assets/fonts/unbounded-cyrillic-500-normal.woff2 +0 -0
  244. package/skills/wow-design/assets/kit/assets/fonts/unbounded-cyrillic-600-normal.woff2 +0 -0
  245. package/skills/wow-design/assets/kit/assets/fonts/unbounded-latin-400-normal.woff2 +0 -0
  246. package/skills/wow-design/assets/kit/assets/fonts/unbounded-latin-500-normal.woff2 +0 -0
  247. package/skills/wow-design/assets/kit/assets/fonts/unbounded-latin-600-normal.woff2 +0 -0
  248. package/skills/wow-design/assets/kit/assets/js/kit.js +550 -0
  249. package/skills/wow-design/assets/kit/pages/dashboard.html +539 -0
  250. package/skills/wow-design/assets/kit/pages/hospital.html +430 -0
  251. package/skills/wow-design/assets/kit/showcase.html +1164 -0
  252. package/skills/wow-design/assets/scripts/LICENSE-axe-core.txt +362 -0
  253. package/skills/wow-design/assets/scripts/LICENSE-playwright-core.txt +202 -0
  254. package/skills/wow-design/assets/scripts/README.md +312 -0
  255. package/skills/wow-design/assets/scripts/audit.mjs +1200 -0
  256. package/skills/wow-design/assets/scripts/capture.mjs +337 -0
  257. package/skills/wow-design/assets/scripts/package.json +30 -0
  258. package/skills/wow-design/references/anti-patterns.md +252 -0
  259. package/skills/wow-design/references/critique-rubric.md +262 -0
  260. package/skills/wow-design/references/design-brief-template.md +48 -0
  261. package/skills/wow-design/references/inspiration.md +203 -0
  262. package/skills/wow-design/references/presets.md +99 -0
  263. package/skills/wow-design/references/principles.md +371 -0
  264. package/skills/wow-design/references/quick-presets.md +50 -0
  265. package/skills/wow-design/references/report-template.md +21 -0
  266. package/skills/wow-design/references/stack-recipes.md +96 -0
  267. package/skills/wow-design/references/visual-qa.md +82 -0
  268. package/skills/wow-design/references/wow-levers.md +43 -0
  269. package/tools/skill-cost.mjs +76 -0
@@ -0,0 +1,296 @@
1
+ > Часть навыка seo. ≈8 050 токенов. Читать, когда: техническая правка или просадка трафика — статусы, robots, sitemap, canonical, пагинация, фасеты, hreflang, CWV, JS/SPA, миграции URL.
2
+
3
+ # Техническое SEO — краулинг, индексация, URL, скорость
4
+
5
+ > Справочник по технической части. Всё, что здесь есть, проверяется **в коде и в инструментах**, а не «на глаз».
6
+ > Первоисточники — в конце файла. Данные проверены на **04.11.2026**; спорные/меняющиеся места помечены
7
+ > «проверить на актуальной версии».
8
+
9
+ ## 1. Как поисковик проходит путь до выдачи (и где всё ломается)
10
+
11
+ `обнаружение → обход (crawl) → рендеринг → индексация → ранжирование → показ сниппета`
12
+
13
+ | Этап | Что решает | Типовые поломки |
14
+ |---|---|---|
15
+ | Обнаружение | внутренние ссылки, sitemap, внешние ссылки | сироты, ссылки только в JS-меню, `nofollow` на всём, sitemap не отправлен |
16
+ | Обход | robots.txt, статус-коды, скорость ответа, crawl budget | 5xx, таймауты, бесконечные фасеты, цепочки редиректов, закрытые CSS/JS |
17
+ | Рендеринг | SSR/SSG vs клиентский JS | контент/мета только после JS, `noindex` в JS, «мягкие 404» |
18
+ | Индексация | canonical, дубли, качество, `noindex` | canonical на чужой URL, дубли www/http, тысячи мусорных URL |
19
+ | Показ | title/description, разметка, CWV | шаблонные title, нет `og:image`, CLS, медленный LCP |
20
+
21
+ **Правило:** если страница не индексируется — не оптимизируй её контент. Сначала P0: 200 + indexable + canonical.
22
+
23
+ ## 2. Статус-коды: что делает Google и Яндекс
24
+
25
+ | Код | Значение для SEO | Что делать |
26
+ |---|---|---|
27
+ | 200 | страница живёт | норма |
28
+ | 301 | постоянный переезд, вес передаётся | смена URL, http→https, www→без www, склейка дублей |
29
+ | 302 / 307 | временно, вес **не** передаётся как постоянный | только реально временные (A/B, обслуживание) |
30
+ | 304 | не изменилось | норма (кеш) |
31
+ | 404 | не найдено, URL постепенно выпадает | удалённые без замены; лучше сразу убрать из sitemap и внутренних ссылок |
32
+ | **410** | удалено навсегда, выпадает быстрее 404 | осознанное удаление страниц (не «спасибо»-страницы) |
33
+ | 403 / 401 | запрещено | только для реально закрытого; для скрытия от поиска — `noindex`, а не 403 |
34
+ | 429 | слишком много запросов | антибот; Google/Яндекс снижают скорость обхода. Не отдавай 429 роботам |
35
+ | 5xx | ошибка сервера | **URL остаётся в индексе**, обход замедляется. Мониторь 5xx в логах и GSC |
36
+
37
+ Правила:
38
+ - **Один прыжок.** `A → B → C` — плохо, `A → C` — хорошо. Цепочки режут передачу веса и замедляют обход.
39
+ - **Никаких редиректов на главную вместо 404** — это «мягкий 404» и потеря релевантности.
40
+ - **«Мягкий 404»**: страница отдаёт 200, но контент «не найдено». Google считает soft 404, Яндекс — «малоценной».
41
+ Отдавай честный 404.
42
+ - Удалённую страницу с трафиком не удаляй «в ноль»: 301 на ближайшую релевантную или 410, если замены нет.
43
+
44
+ ## 3. robots.txt
45
+
46
+ Назначение — **управление обходом**, не индексацией. Чтобы убрать из индекса — `noindex` (и не закрывать
47
+ страницу в robots.txt, иначе робот не увидит `noindex`).
48
+
49
+ ```
50
+ # https://example.ru/robots.txt
51
+ User-agent: *
52
+ Disallow: /bitrix/
53
+ Disallow: /local/
54
+ Disallow: /search/
55
+ Disallow: /*?sort=
56
+ Disallow: /*?print=
57
+ Allow: /bitrix/components/
58
+ Allow: /bitrix/templates/
59
+ Allow: /bitrix/js/
60
+ Allow: /bitrix/css/
61
+ Clean-param: utm_source&utm_medium&utm_campaign&utm_content&utm_term&yclid&gclid&from / # Яндекс
62
+ Sitemap: https://example.ru/sitemap.xml
63
+ Host: example.ru # УСТАРЕЛО: Яндекс не использует Host с 2018 года, не пиши
64
+ ```
65
+
66
+ Обязательно:
67
+ - **Не закрывай** CSS, JS, картинки, шрифты — иначе робот не отрисует страницу и не увидит контент.
68
+ - Не закрывай разделы, которые должны ранжироваться (услуги, врачи, статьи, цены).
69
+ - `Sitemap:` — абсолютный URL, можно несколько строк.
70
+ - Лимит Google: **500 КБ** на файл; длиннее — игнорируется (проверить на актуальной версии).
71
+ - Директивы: Google поддерживает `User-agent`, `Disallow`, `Allow`, `Sitemap` (+ группы по user-agent);
72
+ всё остальное (`Crawl-delay`, `Host`, `Clean-param`) Google **игнорирует**. `Clean-param` понимает Яндекс.
73
+ - Проверка: GSC «Проверка URL»/отчёт robots.txt, Яндекс Вебмастер «Инструменты → Анализ robots.txt».
74
+ - Если сайт на поддомене/в подкаталоге — robots.txt только в корне домена.
75
+
76
+ Частая ошибка: `Disallow: /` на тестовом домене, скопированный в прод. Проверяй после каждого деплоя.
77
+
78
+ ## 4. sitemap.xml
79
+
80
+ Формат: XML, `<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">`. Обязателен `<loc>`; `<lastmod>`,
81
+ `<changefreq>`, `<priority>` — подсказки (changefreq/priority Google игнорирует, Яндекс учитывает слабо;
82
+ не «оптимизируй» ими).
83
+
84
+ Лимиты (проверить на актуальной версии перед большим сайтом):
85
+ - 1 файл: **≤50 000 URL** и **≤50 МБ** (несжатый). Больше — sitemap-индекс (≤50 000 sitemap-файлов).
86
+ - Только URL, отдающие **200 + indexable**. Никаких 301, 404, `noindex`, закрытых в robots.txt.
87
+ - `<lastmod>` — реальная дата изменения контента в W3C-формате (`2026-11-04` или с временем и `+03:00`).
88
+ Ставить «сегодня» всем URL — вред: поисковик перестанет верить lastmod.
89
+ - Региональные/языковые версии — через `xhtml:link hreflang` (если реально есть).
90
+ - Sitemap-индекс для сайта с разделами: `sitemap-pages.xml`, `sitemap-uslugi.xml`, `sitemap-vrachi.xml`,
91
+ `sitemap-news.xml`, `sitemap-docs.xml`.
92
+
93
+ ```xml
94
+ <?xml version="1.0" encoding="UTF-8"?>
95
+ <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
96
+ <url>
97
+ <loc>https://example.org/uslugi/mrt-golovy/</loc>
98
+ <lastmod>2026-10-28</lastmod>
99
+ </url>
100
+ <url>
101
+ <loc>https://example.org/vrachi/ivanov-ivan-ivanovich/</loc>
102
+ <lastmod>2026-09-12</lastmod>
103
+ </url>
104
+ </urlset>
105
+ ```
106
+
107
+ Отправка:
108
+ - Google: GSC → «Файлы Sitemap»; пинг-эндпоинт sitemap **устарел** (Google отключил ping в 2023) — не используй.
109
+ - Яндекс: Вебмастер → «Индексирование → Файлы Sitemap»; для быстрых изменений — «Переобход страниц» / API.
110
+ - IndexNow (Bing, Яндекс) — для оперативного уведомления об изменениях; **проверить актуальную поддержку**.
111
+
112
+ ## 5. Canonical
113
+
114
+ ```html
115
+ <link rel="canonical" href="https://example.org/uslugi/mrt-golovy/">
116
+ ```
117
+
118
+ Правила:
119
+ - **Абсолютный** URL, тот же протокол и хост, что в sitemap и внутренних ссылках.
120
+ - Один canonical на страницу. Self-referencing — норма (страница ссылается на себя).
121
+ - Canonical — **подсказка**, а не приказ: поисковики могут выбрать другой URL, если сигналы противоречат
122
+ (внутренние ссылки, sitemap, редиректы, hreflang).
123
+ - Не ставь canonical с параметрами на «чистый» URL и наоборот непоследовательно.
124
+ - Пагинация: canonical на **саму страницу пагинации** (`?page=2` → само на себя). Canonical всех страниц
125
+ пагинации на первую — ошибка: страницы 2…N выпадут из индекса.
126
+ - Фасеты: «ценные» фильтры (например, `/uslugi/mrt/?price=do-5000`) — можно индексировать; «мусорные»
127
+ (сортировки, `print`, `view=list`) — `noindex,follow` или `Clean-param` (Яндекс). Не блокируй обход
128
+ фасетов в robots.txt — робот не увидит `noindex`.
129
+ - Дубли www/без-www, http/https, слэш/без слэша, `index.php` — склеивай 301 + canonical.
130
+ - Если контент проиндексирован по «не тому» URL — исправляй сигналы (внутренние ссылки, sitemap), а не только
131
+ canonical. Отчет GSC «Страницы → Альтернативная страница с корректным каноническим тегом» это показывает.
132
+
133
+ ## 6. Дубли и «тонкие» страницы
134
+
135
+ Виды дублей: параметры URL, сортировки, `print`/`amp`-версии, www/http, слеш, КАПС, `?utm_*`, копии контента
136
+ между разделами, одинаковые карточки врачей в нескольких отделениях.
137
+
138
+ Антидубль-набор:
139
+ 1. 301 на канонический URL (www/http/слэш) — на уровне сервера.
140
+ 2. `canonical` на канонический URL — на уровне HTML.
141
+ 3. Один URL в sitemap и внутренних ссылках.
142
+ 4. UTM-метки не должны создавать индексируемые копии: `Clean-param` (Яндекс), `noindex` на страницах с
143
+ «кампанейскими» параметрами, canonical на чистый URL.
144
+ 5. Уникальные title/description/H1 на каждой значимой странице (шаблон + данные).
145
+
146
+ «Тонкие» страницы (мало контента, нет уникальной ценности): карточка врача из 2 строк, услуга-заглушка,
147
+ тег с одним постом, страница «спасибо». Решение: обогатить (фото, образование, цены, показания, FAQ) или
148
+ `noindex,follow` и убрать из sitemap. Массовые «пустые» URL — прямой путь к фильтру «малоценных страниц»
149
+ (Яндекс) и снижению качества сайта в целом.
150
+
151
+ ## 7. Пагинация
152
+
153
+ - Страницы пагинации — **индексируемые**, canonical self-referencing, уникальные title
154
+ (`Раздел — страница 2`), ссылки `?page=N` обычными `<a href>`.
155
+ - `rel="next"/"prev"` Google **не использует** с 2019 — можно не ставить (не вредит).
156
+ - `noindex` на пагинацию — только если это чисто навигационные страницы без самостоятельной ценности и
157
+ есть альтернативный доступ к контенту (категории/фильтры).
158
+ - Бесконечный скролл: обеспечь реальные URL для «следующих» страниц (иначе контент не проиндексируется).
159
+ - «View all» — допустимо как отдельный URL с canonical на себя, если страница не слишком тяжёлая.
160
+
161
+ ## 8. hreflang (только при реальной мультиязычности/мультирегиональности)
162
+
163
+ ```html
164
+ <link rel="alternate" hreflang="ru-RU" href="https://example.ru/">
165
+ <link rel="alternate" hreflang="en" href="https://example.com/">
166
+ <link rel="alternate" hreflang="x-default" href="https://example.ru/">
167
+ ```
168
+
169
+ - Ссылки **взаимные**: каждая версия ссылается на все остальные и на себя (self-referencing обязателен).
170
+ - `x-default` — для страницы выбора языка/региона.
171
+ - Не путай с `lang="ru"` на `<html>` — это разные вещи (hreflang про альтернативные URL).
172
+ - Ошибки видны в GSC (отчёт «Международные цели») — проверяй.
173
+ - Для example.org (один язык, один регион) hreflang **не нужен** — не добавляй «на всякий случай».
174
+
175
+ ## 9. Мобильный и Core Web Vitals
176
+
177
+ Индексирование mobile-first: робот в основном смотрит мобильную версию. Значит мобильная версия должна
178
+ содержать тот же контент и мета, что десктопная.
179
+
180
+ ### Пороговые значения CWV (75-й перцентиль, отдельно mobile/desktop)
181
+
182
+ | Метрика | Хорошо | Требует улучшения | Плохо | Что оптимизировать |
183
+ |---|---|---|---|---|
184
+ | **LCP** (загрузка) | ≤ 2,5 с | 2,5–4,0 с | > 4,0 с | сервер/TTFB, размер LCP-картинки, preload, `fetchpriority="high"`, критический CSS |
185
+ | **INP** (отзывчивость) | ≤ 200 мс | 200–500 мс | > 500 мс | длинные JS-задачи, разбиение, `requestIdleCallback`, меньше сторонних скриптов |
186
+ | **CLS** (сдвиги) | ≤ 0,1 | 0,1–0,25 | > 0,25 | размеры у img/iframe/video, `font-display`, место под баннеры, без вставок над контентом |
187
+
188
+ Источник: `web.dev/articles/vitals` (обновлено 31.10.2024; INP заменил FID в марте 2024).
189
+
190
+ Быстрые победы:
191
+ - LCP-изображение — не `loading="lazy"`, наоборот `fetchpriority="high"` + `preload`; WebP/AVIF; правильные размеры;
192
+ CDN или кеш; TTFB < 0,8 с (цель).
193
+ - Шрифты: `font-display: swap`, `preload` для основного, `size-adjust`/фолбэк с похожими метриками.
194
+ - CLS: всегда `width`/`height` или `aspect-ratio`; не вставляй рекламу/баннер над контентом; не подменяй шрифт
195
+ с другими метриками без `size-adjust`.
196
+ - JS: минимум сторонних скриптов; счётчики — async/defer; тяжёлые виджеты (карты, чаты) — lazy после
197
+ взаимодействия.
198
+ - Проверка: PageSpeed Insights (поле + лаборатория), GSC «Основные интернет-показатели», Lighthouse,
199
+ Chrome UX Report (CrUX). Лабораторные данные ≠ полевые: сдавай по полевым (CrUX) или по плану улучшения.
200
+
201
+ ## 10. JavaScript / SPA
202
+
203
+ Google умеет рендерить JS, но:
204
+ - Рендеринг **отложенный** и не гарантирован для каждого URL; `noindex` в JS может не сработать — только в HTML.
205
+ - Контент, ссылки, мета должны быть в **исходном HTML** (SSR/SSG/prerender). Проверка: `curl -A "Googlebot" URL`
206
+ и `view-source:` — в ответе должны быть title/description/H1/текст/ссылки.
207
+ - После 2025 Google уточнял: страницы с не-200 кодом могут **не** отправляться на рендеринг — не отдавай
208
+ контент с 404/500 «для красоты».
209
+ - Ссылки — настоящие `<a href>`, а не `onclick`/`div`.
210
+ - Canonical — в исходном HTML, соответствующий серверному URL. Canonical, добавленный только через JS,
211
+ Google может проигнорировать (проверить на актуальной версии).
212
+ - SPA-роутинг: каждый маршрут должен иметь серверный ответ 200 с уникальным HTML (SSR/SSG), иначе будет
213
+ один индексируемый URL и пустые остальные.
214
+ - Dynamic rendering — **не рекомендуется** (временный костыль), лучше SSR/SSG.
215
+
216
+ Стек-решения: `stack-recipes.md`.
217
+
218
+ ## 11. Лог-анализ и crawl budget (для больших сайтов)
219
+
220
+ Когда делать: > 10 000 URL, тысячи фасетов, медленная индексация, скачки 5xx.
221
+ - Возьми access-логи за 7–30 дней, отфильтруй по `Googlebot`/`YandexBot` user-agent + проверь **обратный DNS**
222
+ (user-agent легко подделать).
223
+ - Что смотреть: доля 5xx/404 у робота, самые обходимые URL (не мусор ли), глубина обхода, скорость ответа
224
+ роботу, сколько уникальных URL обошёл за период, какие разделы робот не заходит вообще.
225
+ - Цель: робот тратит бюджет на деньги-страницы, а не на `?sort=price_asc&page=17`.
226
+ - Яндекс: «Индексирование → Обход сайта» в Вебмастере; Google: GSC → «Настройки → Статистика обхода»
227
+ (в 2025 часть отчётов переехала — проверить расположение на актуальной версии).
228
+ - Инструмент: `seo-audit.mjs` умеет считать распределение статусов по логам, если передать access.log.
229
+
230
+ ## 12. Миграции URL и переезды (самый опасный жанр)
231
+
232
+ Чек-лист миграции (переезд, смена ЧПУ, редизайн, смена CMS):
233
+ 1. **Инвентаризация:** выгрузи все индексируемые URL (sitemap + GSC/Вебмастер + краул), зафиксируй трафик
234
+ по URL за 3 месяца (baseline).
235
+ 2. **Карта редиректов** «старый → новый», 1:1, без цепочек. Для групп — правила, но проверь каждую.
236
+ 3. **301** на новые URL (не 302), на уровне сервера/`.htaccess`/nginx, до приложения.
237
+ 4. **Внутренние ссылки** — обнови на новые URL (иначе робот ходит по старым через редирект).
238
+ 5. **sitemap** — только новые URL; отправь в GSC и Вебмастер.
239
+ 6. **Canonical/OG/hreflang** — обнови.
240
+ 7. **Мониторинг 2–4 недели:** 404 и 5xx в GSC/Вебмастере и логах; «Страницы» — не растёт ли «Не найдено».
241
+ 8. **Инструмент смены адреса:** GSC «Изменение адреса» (для смены домена), Яндекс Вебмастер — «Переезд сайта».
242
+ Для смены структуры внутри домена — только редиректы + новые sitemap.
243
+ 9. Не выкатывай редизайн и смену URL одновременно с крупным релизом — не сможешь отделить причину просадки.
244
+
245
+ Правило отката: карта редиректов и старые шаблоны мета хранятся в git, откат — за один деплой.
246
+
247
+ ## 13. Безопасность и служебные зоны
248
+
249
+ - Служебные разделы (`/admin`, `/bitrix/`, `/local/`, личные кабинеты, поиск, корзина) — `noindex` или
250
+ `Disallow` + `noindex`; лучше `noindex,follow`, чтобы не плодить «скрытые» URL в индексе.
251
+ - Тестовые домены/стейджи — **HTTP Basic Auth** или `noindex` + robots, иначе копии контента конкурируют.
252
+ - `noindex` на страницах пагинации/фильтров — только осознанно (см. §7).
253
+ - Не отдавай 200 на несуществующие страницы (soft 404) и не прячь ошибки PHP за «красивой» страницей.
254
+ - `X-Robots-Tag` в заголовках — для не-HTML (PDF, изображения) и для закрытия целых групп на сервере.
255
+
256
+ ## 14. Частые технические ошибки (топ-20)
257
+
258
+ 1. `noindex` на услугах/деньгах после «правок безопасности».
259
+ 2. Canonical с параметрами (`?utm=`) или на главную со всех страниц.
260
+ 3. Дубли www/http/слэш без 301.
261
+ 4. Шаблонные title/description на сотнях страниц.
262
+ 5. Sitemap с 404/редиректами/`noindex`.
263
+ 6. `lastmod` = сегодня у всех URL.
264
+ 7. Закрытые в robots.txt CSS/JS → робот не видит контент.
265
+ 8. Цепочки редиректов и редирект на главную вместо 404.
266
+ 9. Контент только после JS без SSR.
267
+ 10. Lazy-load на LCP-картинке.
268
+ 11. Нет `width/height` у изображений → CLS.
269
+ 12. Бесконечные фасеты в индексе.
270
+ 13. Нет мобильной версии/мобильная версия без контента десктопа.
271
+ 14. Битые внутренние ссылки и 404 в меню.
272
+ 15. Дубли контента между разделами без canonical.
273
+ 16. Разные URL для одного раздела (меню/крошки/хлебные крошки ведут на разные варианты).
274
+ 17. Пагинация с canonical на первую страницу.
275
+ 18. Скрытый текст/ссылки «для SEO» (риск санкций).
276
+ 19. Отсутствие 404-страницы с навигацией (пользователь уходит).
277
+ 20. Не настроен регион в Яндексе для локального бизнеса.
278
+
279
+ ## 15. Первоисточники (проверять при сомнениях)
280
+
281
+ - Технические требования Google: https://developers.google.com/search/docs/essentials
282
+ - Обход и индексация: https://developers.google.com/search/docs/crawling-indexing
283
+ - robots.txt: https://developers.google.com/search/docs/crawling-indexing/robots/intro
284
+ - Sitemap: https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap
285
+ - Canonical/дубли: https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls
286
+ - URL-структура: https://developers.google.com/search/docs/crawling-indexing/url-structure
287
+ - 301-редиректы: https://developers.google.com/search/docs/crawling-indexing/301-redirects
288
+ - HTTP-коды и сети: https://developers.google.com/search/docs/crawling-indexing/http-network-errors
289
+ - JavaScript SEO: https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics
290
+ - hreflang: https://developers.google.com/search/docs/specialty/international/localized-versions
291
+ - Спам-политики: https://developers.google.com/search/docs/essentials/spam-policies
292
+ - CWV: https://web.dev/articles/vitals · LCP: https://web.dev/articles/lcp · INP: https://web.dev/articles/inp ·
293
+ CLS: https://web.dev/articles/cls
294
+ - PageSpeed Insights: https://pagespeed.web.dev
295
+ - Яндекс Вебмастер (справка): https://yandex.ru/support/webmaster/ru/
296
+ - Обновления документации Google (хронология): https://developers.google.com/search/updates
@@ -0,0 +1,52 @@
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
+ ## 0. Когда применять
11
+ - Задачи по Service Desk: заявки, активы, склад, отчёты, справочник, AD/LDAP, UI.
12
+ - Перед правками модулей, маршрутов, RBAC, тем, миграций.
13
+ - Нужно понять, куда положить код.
14
+
15
+ ## 1. Главное
16
+
17
+ **Где что**
18
+ - Рабочая копия (1.39.0): `%USERPROFILE%\OneDrive\Документы\deepseek-harness\default-workspace\src\service-desk-1.38.1`
19
+ - Досье: `%USERPROFILE%\.dsh\memory\projects\service-desk.md`; архив: `%USERPROFILE%\.dsh\memory\projects\service-desk\` (аудит/тесты/релизы).
20
+ - Сервер: `app-server`, `/var/www/service-desk`, PostgreSQL `servicedesk`, сайт `http://127.0.0.1:8000`.
21
+
22
+ **Архитектура**
23
+ - Laravel 13 / PHP 8.5 / PostgreSQL / Blade + Vite + SCSS.
24
+ - Модули `modules/{Tickets,Assets,Inventory,Reports,DirectorySync}`; регистрация — `config/modules.php` → `app/Providers/ModuleServiceProvider.php`; провайдер: `loadViewsFrom` + `loadMigrationsFrom` + `Route::middleware('web')->group(routes/web.php)`.
25
+ - Маршруты модулей **без `auth`** — только `permission:*`; новый маршрут — с `auth` (или осознанно) и `permission:*`; route names не переименовывать.
26
+ - RBAC: `CheckPermission` (`permission:`), `EnsureAdmin` (`admin`), `RoleGate` (ALLOWED/DENIED по именам); роль `admin` даёт все права.
27
+ - Темы: каркас `themes/default/views/layouts/app.blade.php` (один на все палитры); страницы — `themes/default/views/*`, `resources/views`, `modules/*/resources/views` (namespace `tickets::`).
28
+ - Стили: `resources/scss/app.scss` → `_tokens.scss`, `_ui-refresh.scss` (новые правила), `_legacy.scss` (только база).
29
+ - Аудит: `AuditObserver` (Ticket/Asset/Consumable/StockMove/Reminder/News) → `audit_logs`.
30
+
31
+ **Нельзя ломать**
32
+ - Миграции — только новые и аддитивные; старые не редактировать.
33
+ - `db:seed` в 1.39.1 идемпотентен — не переделывать на updateOrCreate/сброс паролей.
34
+ - Формы: не убирать `name`, `required` и подписи (тесты `FormHintsTest`, `TicketFormVisibilityTest`).
35
+ - `@html` (HtmlSanitizer) — единственный безопасный вывод разметки; не `{!! !!}` для пользовательских данных.
36
+ - Права/владельцы: не менять доступ без теста на обычного пользователя и админа.
37
+ - Скрытые разделы: `MODULES_HIDDEN` (`config modules.hidden`), `Modules::visible()`.
38
+
39
+ **Стиль**
40
+ - Русский язык комментариев/интерфейса; PSR-12 (Laravel Pint), 4 пробела.
41
+ - Транзакции для многозаписных операций, `lockForUpdate()` при гонках, валидация.
42
+ - После доработки — bump версии в `config/app.php`: feature → minor, fix → patch.
43
+
44
+ ## 2. Куда грузить дальше
45
+ `service-desk-db-safety` — БД/бэкап; `service-desk-testing` — PHPUnit/Playwright; `service-desk-release` — tgz/`update.sh`; `service-desk-ui` — вёрстка/темы. Тесты: `php scripts/test.php` (Linux `make test`).
46
+
47
+ ## 3. Гейт перед сдачей
48
+ - [ ] Досье и `AGENTS.md` прочитаны; правки локальны.
49
+ - [ ] Старые миграции не тронуты, новые аддитивны.
50
+ - [ ] Маршруты: `auth` + `permission:*`; route names целы.
51
+ - [ ] Формы, `@html`, RBAC целы; проверены пользователь и админ.
52
+ - [ ] `php scripts/test.php` зелёный; версия в `config/app.php` поднята.
@@ -0,0 +1,63 @@
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
+ ## 0. Когда применять
11
+ - Миграции, сиды, загрузка справочника/данных, релиз с изменениями схемы.
12
+ - Восстановление и очистка заявок.
13
+ - Любая запись/удаление на сервере.
14
+
15
+ ## 1. Главное
16
+
17
+ **Железные правила**
18
+ - Боевая БД — PostgreSQL на `app-server` (`servicedesk`); локальный кластер — только тестовый.
19
+ - **Никогда** без прямого разрешения: `migrate:fresh|refresh|reset`, `db:wipe`, `db:seed` на боевой, `migrate:rollback`, `dropdb`, `TRUNCATE` `phonebook_entries` (каскад на `users` и связанные!), `composer run preview:reset` (без `.env.preview` берёт боевой `.env` → `migrate:fresh`), `clear-tickets.sh`/`tickets:purge` (удаляет все заявки и вложения).
20
+ - Перед рискованным — бэкап и проверка окружения; никогда не подключаться к боевой БД с локальных экспериментов.
21
+
22
+ **Бэкап (на сервере)**
23
+ ```bash
24
+ sudo -u den php artisan backup:run --reason="before-<что>"
25
+ sudo -u postgres pg_dump -Fc -d servicedesk -f /var/backups/service-desk/pre-<версия>.dump
26
+ sudo -u postgres pg_restore -l /var/backups/service-desk/pre-<версия>.dump | head
27
+ sudo -u den php artisan backup:verify
28
+ ```
29
+ - `backup:run` кладёт `database.dump`, `env.txt`, `files.zip` в `BACKUP_PATH` (`/var/backups/service-desk`); `backup:verify` проверяет восстановление.
30
+ - Копию скачать себе (WinSCP), не хранить только на сервере.
31
+ - `pg_dump` в PATH (на сервере есть; локально Windows — `C:\Program Files\PostgreSQL\18\bin`).
32
+
33
+ **Восстановление (только по разрешению)**
34
+ ```bash
35
+ cd /var/www/service-desk && sudo -u den php artisan down
36
+ sudo -u postgres dropdb servicedesk && sudo -u postgres createdb servicedesk
37
+ sudo -u postgres pg_restore --no-owner --role=postgres -d servicedesk <dump>
38
+ sudo -u den php artisan migrate --force && sudo -u den php artisan optimize:clear
39
+ sudo -u den php artisan up
40
+ ```
41
+ `dropdb` — только после подтверждения и проверенного дампа.
42
+
43
+ **Локальная проверка**
44
+ - Кластер PG 18: `...\default-workspace\pgruntime\data` (ICU ru-RU, 5432); БД `servicedesk` (dev), `servicedesk_test` (PHPUnit, RefreshDatabase — только на тестовой).
45
+ - Имитация обновления — по `pg-upgrade-verify`: отдельная папка/БД, counts/md5 до и после.
46
+
47
+ **Перед релизом с миграциями**
48
+ 1. Сравнить списки миграций; прочитать новые: `dropColumn`, NOT NULL, переименования.
49
+ 2. `migrate --pretend` на копии и посмотреть SQL.
50
+ 3. Бэкап — только потом `migrate --force`.
51
+
52
+ **Сбой**
53
+ - Сайт в maintenance → `sudo -u den php artisan up`.
54
+ - Ошибки БД → `storage/logs/laravel.log`, `journalctl -u service-desk-queue`; не спешить с откатом/восстановлением.
55
+
56
+ ## 2. Куда грузить дальше
57
+ `pg-upgrade-verify` — копия; `service-desk-release` — выкатка.
58
+
59
+ ## 3. Гейт перед сдачей
60
+ - [ ] Окружение проверено, боевая БД не затронута.
61
+ - [ ] Свежий бэкап создан, читается (`pg_restore -l` / `backup:verify`), копия вне сервера.
62
+ - [ ] Запрещённые команды не выполнялись без разрешения.
63
+ - [ ] Новые миграции аддитивны и прогнаны на копии; план отката есть.
@@ -0,0 +1,61 @@
1
+ ---
2
+ name: service-desk-release
3
+ description: "Релиз Service Desk: версия в config/app.php, tgz без мусора, SHA-256, deploy/update.sh, smoke после выкатки и откат."
4
+ whenToUse: "При подготовке обновления, сборке архива, выкатке на app-server, проверке после релиза и откате."
5
+ user-invocable: true
6
+ ---
7
+
8
+ # Релиз Service Desk (tgz + update.sh)
9
+
10
+ ## 0. Когда применять
11
+ - Готовишь обновление Service Desk: версия, сборка, checksums.
12
+ - Выкатываешь на `app-server` или нужен план отката.
13
+ - В релизе есть миграции — сначала `service-desk-db-safety` и `pg-upgrade-verify`.
14
+
15
+ ## 1. Главное
16
+
17
+ **Версия**
18
+ - `config/app.php`: `env('APP_VERSION', 'X.Y.Z')`. feature → minor (1.39.0 → 1.40.0), fix → patch (1.39.0 → 1.39.1), breaking → major.
19
+ - `deploy-ubuntu.sh` берёт RELEASE из `config/app.php` и записывает в `.env`; версия видна внизу меню.
20
+ - Версия, тег и имя архива совпадают; версия поднята **до** сборки.
21
+
22
+ **Сборка**
23
+ 1. `php scripts/test.php` зелёный, UI-скриншоты сделаны.
24
+ 2. Собрать tgz **без** `vendor/ node_modules/ public/build/ storage/ .env .env.preview .git .claude`.
25
+ 3. Надёжно: распаковать предыдущую версию в staging, наложить изменённые файлы, `tar -czf`.
26
+ 4. `sha256sum` → `checksums.txt`; архив и checksums — на Рабочий стол.
27
+ 5. Проверить листинг: нет секретов/мусора, все изменённые файлы на месте.
28
+
29
+ **Выкатка (сервер `app-server`, пользователь `den`)**
30
+ ```bash
31
+ cd /tmp && sha256sum service-desk-X.Y.Z.tgz # сверить с локальным
32
+ sudo tar --no-same-owner -xzf /tmp/service-desk-X.Y.Z.tgz -C /var/www/service-desk
33
+ cd /var/www/service-desk && sudo APP_ADDR=127.0.0.1 bash deploy/update.sh
34
+ ```
35
+ `update.sh` сам: backup → maintenance → composer/npm/build → migrate → seed (идемпотентен) → services/caches → up. При сбое сайт остаётся в maintenance — исправить и `php artisan up`.
36
+
37
+ **Проверки после «Готово»**
38
+ 1. Ctrl+F5 → версия внизу меню = X.Y.Z.
39
+ 2. Число заявок прежнее, старые номера/вложения открываются.
40
+ 3. Затронутый раздел/фича работает (сценарий из задачи).
41
+ 4. Админ и обычный пользователь — оба сценария.
42
+ 5. `php artisan migrate:status`, логи без ошибок; при желании `sudo -u den php artisan launch:check`.
43
+
44
+ **Откат**
45
+ - Код: папка `Task.old-<дата>` (если копировали) или предыдущий архив; распаковать, вернуть версию.
46
+ - БД: только если релиз менял данные/схему (см. `service-desk-db-safety`); обычно не нужно.
47
+ - `sudo -u den php artisan up`, повторить smoke.
48
+
49
+ **Журнал**
50
+ - Записать факт выкатки и проверки в `%USERPROFILE%\.dsh\memory\SESSIONS.md` и досье.
51
+ - Пример структуры — `...\memory\projects\service-desk\release\UPDATE-1.39.0.md`.
52
+
53
+ ## 2. Куда грузить дальше
54
+ `service-desk-db-safety` — бэкап/восстановление; `pg-upgrade-verify` — миграции на копии; `release-and-deploy` — общие правила; `git-and-ci` — тег.
55
+
56
+ ## 3. Гейт перед сдачей
57
+ - [ ] Версия поднята в `config/app.php`; тег и архив совпадают.
58
+ - [ ] Тесты зелёные, скриншоты сделаны; архив без секретов/мусора.
59
+ - [ ] sha256 локально и на сервере совпал; бэкап перед выкаткой есть.
60
+ - [ ] `update.sh` прошёл; версия, заявки/вложения, фича, админ + пользователь проверены.
61
+ - [ ] Логи и `migrate:status` чистые; откат описан; запись в память сделана.
@@ -0,0 +1,61 @@
1
+ ---
2
+ name: service-desk-testing
3
+ description: "Тесты Service Desk: PHPUnit на PostgreSQL, baseline, права и формы, Playwright E2E, скриншоты, Pint и PHPStan."
4
+ whenToUse: "Перед и после любой правки кода/UI Service Desk, при подготовке релиза и при разборе упавших тестов."
5
+ user-invocable: true
6
+ ---
7
+
8
+ # Тестирование Service Desk
9
+
10
+ ## 0. Когда применять
11
+ - Любая правка кода/UI: сначала baseline, после — сравнение.
12
+ - Нужны feature/unit-тесты, проверка прав или форм.
13
+ - Подготовка релиза, E2E или визуальная проверка.
14
+
15
+ ## 1. Главное
16
+
17
+ **PHPUnit на PostgreSQL (обязательно)**
18
+ ```powershell
19
+ # из корня проекта (Windows)
20
+ php scripts/test.php
21
+ php scripts/test.php --filter=TicketFormVisibilityTest
22
+ php scripts/test.php --stop-on-failure
23
+ # Linux/CI
24
+ make test
25
+ ```
26
+ Скрипт поднимает 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`; кэш/очередь/сессии/почта — array/sync, `LOG_CHANNEL=null`.
27
+ - `RefreshDatabase` — на **servicedesk_test**, боевую БД не трогает.
28
+ - PG 18: `pgruntime/data` (ICU ru-RU — важно для ILIKE кириллицы), порт 5432. Если не запущен: `Start-Process "$pgbin\pg_ctl.exe" -ArgumentList @('-D', $data, '-l', $log, 'start') -WindowStyle Hidden`.
29
+ - Baseline (эталон): 542 теста / 2753 assertions, все зелёные; deprecation PHPUnit — норма. Пропуски `markTestSkipped` — только для отсутствующих `docs/requests/*.xlsx`.
30
+
31
+ **Что проверять**
32
+ 1. До правки — baseline, после — сравнить; новые падения — блокер.
33
+ 2. Новое: feature на доступы/валидацию/сценарий + unit логики.
34
+ 3. Права: админ и обычный пользователь; служебные поля/разделы закрыты.
35
+ 4. Данные: форма не теряет/не подменяет значения (`TicketStrictAccountingTest`).
36
+
37
+ **E2E/UI (Playwright)**
38
+ - `...\default-workspace\tools\e2e` → `npx.cmd playwright test`.
39
+ - Стенд: `php artisan serve --port=8125` (PG dev `servicedesk`); вход `admin@example.com/admin`, `user@example.com/user`.
40
+ - Скриншоты — `...\default-workspace\audit\screenshots\`: desktop 1440 + mobile 390/412, light/dark; смотреть через `read_image`.
41
+ - Эталон: `tools\e2e\tests\priority.spec.js` (1.39.0).
42
+
43
+ **Известные особенности**
44
+ - Нужен собранный `public/build` (`@vite`); пересобрать `npm run build`.
45
+ - Не запускать полный набор параллельно (общая `servicedesk_test`).
46
+ - Падение: `storage/logs/laravel.log` (в тестах `LOG_CHANNEL=null`) + полный вывод PHPUnit.
47
+ - Windows: `is_writable` сейчас полный доступ.
48
+
49
+ **Качество**
50
+ - `make lint` / `php scripts/lint.php` — Pint по изменённым (vs HEAD); `--fix` / `make fmt`.
51
+ - `make stan` / `php scripts/stan.php` — PHPStan/Larastan (baseline legacy).
52
+
53
+ ## 2. Куда грузить дальше
54
+ `service-desk-ui` — UI/скриншоты; `service-desk-db-safety` — тестовая БД; `service-desk-release` — релиз; `testing-strategy` — общая стратегия.
55
+
56
+ ## 3. Гейт перед сдачей
57
+ - [ ] Baseline снят до правки; после — не хуже.
58
+ - [ ] Новые тесты: feature + unit; права админа и пользователя.
59
+ - [ ] `php scripts/test.php` зелёный; боевая БД не тронута.
60
+ - [ ] `npm run build`; E2E/скриншоты 1440/390, light/dark проверены.
61
+ - [ ] `lint`/`stan` без новых ошибок; baseline обновлён при необходимости.
@@ -0,0 +1,52 @@
1
+ ---
2
+ name: service-desk-ui
3
+ description: "UI Service Desk: где править вёрстку и темы, дизайн-токены, состояния и адаптив, сборка, скриншоты и визуальная проверка."
4
+ whenToUse: "Любая правка интерфейса, тем, вёрстки, SCSS/JS или UX-текстов Service Desk; визуальный баг и проверка перед сдачей."
5
+ user-invocable: true
6
+ ---
7
+
8
+ # UI/UX Service Desk
9
+
10
+ ## 0. Когда применять
11
+ - Любая правка интерфейса, тем, вёрстки, SCSS/JS или UX-текстов.
12
+ - Новая страница, форма, таблица, дашборд; визуальный баг.
13
+ - Перед сдачей UI нужны скриншоты и проверка тем.
14
+
15
+ ## 1. Главное
16
+
17
+ **Где править**
18
+ - Каркас (меню/шапка/футер): `themes/default/views/layouts/app.blade.php` (темы — только палитры; отдельных папок тем нет).
19
+ - Страницы: `themes/default/views/*` (dashboard, news, reminders, users, access), `resources/views/*` (auth/login, errors/403, phonebook, partials, pagination), `modules/*/resources/views/*` (namespace `tickets::`).
20
+ - Стили: `resources/scss/app.scss` — вход; `_tokens.scss` — токены, `_ui-refresh.scss` — новые правила, `_legacy.scss` — только база.
21
+ - JS: `resources/js/app.js` (+ Bootstrap, React-виджеты); сборка `npm run build` — без неё production 500 и тесты падают.
22
+ - Иконки: `public/themes/default/icons/*.svg`; шрифты: `public/fonts`.
23
+
24
+ **Дизайн-правила**
25
+ - Прямые углы (radius 0), спокойная медицинская палитра; 4 палитры: light/dark/contrast/modern.
26
+ - Состояния: hover, focus-visible, active, disabled, loading, empty, error.
27
+ - Адаптив: ≤560px — одна колонка; ≤960px — меню сверху; >960px — сайдбар; широкие таблицы — `.table-wrap`.
28
+ - Под полем — `.field-help` (одно предложение, без терминов); ошибки — `.field-error`; обязательные — `label-required`.
29
+ - Не `{!! !!}` для пользовательского контента — только `@html` (HtmlSanitizer).
30
+ - Тексты по-русски, коротко; кнопки — глаголом («Создать заявку», «Сохранить»).
31
+ - Контраст AA, клавиатура и focus-visible; иконки — SVG, не эмодзи; без horizontal scroll на 390.
32
+
33
+ **Проверка UI**
34
+ 1. `php artisan serve --port=8125`; вход `admin@example.com/admin` / `user@example.com/user`.
35
+ 2. Playwright: `...\default-workspace\tools\e2e` → `npx.cmd playwright test`.
36
+ 3. Скриншоты desktop 1440 и mobile (Pixel 7 / 390), светлая и тёмная темы; смотреть через `read_image`.
37
+ 4. Проверить пустые состояния, длинные тексты, кириллицу, ошибки форм, фокус.
38
+ 5. «До/после» — в `...\default-workspace\audit\screenshots`.
39
+
40
+ **Полезное**
41
+ - Прошлые скриншоты: `%USERPROFILE%\.dsh\memory\projects\service-desk\screenshots\`.
42
+ - Валидация: `lang/ru/validation.php` (`resources/lang` нет).
43
+
44
+ ## 2. Куда грузить дальше
45
+ `wow-design` — арт-направление/токены; `design-critique` — аудит UI; `service-desk-testing` — E2E; `service-desk-conventions` — инварианты.
46
+
47
+ ## 3. Гейт перед сдачей
48
+ - [ ] Правка в правильном слое; `npm run build` выполнен.
49
+ - [ ] 4 палитры/темы, состояния, адаптив 1440/390 проверены.
50
+ - [ ] `.table-wrap`, `.field-help`, `.field-error`, `label-required` на месте.
51
+ - [ ] `@html` вместо `{!! !!}`; тексты по-русски, кнопки-глаголы.
52
+ - [ ] Скриншоты light/dark 1440/390 сняты и просмотрены; overflow нет.