dsh-desktop-kit 1.0.0 → 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 (144) hide show
  1. package/README.md +106 -41
  2. package/client.js +780 -28
  3. package/docs/ARCHITECTURE.md +114 -0
  4. package/docs/COMPATIBILITY.md +61 -0
  5. package/docs/INSTALL.md +84 -0
  6. package/docs/PRIVACY.md +50 -0
  7. package/docs/ROADMAP.md +57 -0
  8. package/docs/TOKENS.md +118 -0
  9. package/docs/TROUBLESHOOTING.md +68 -0
  10. package/docs/images/hero.png +0 -0
  11. package/index.js +4 -0
  12. package/package.json +15 -5
  13. package/plugins/dsh-gkb-ru-ui/lib/client.js +276 -28
  14. package/plugins/dsh-gkb-ru-ui/lib/index.js +45 -1
  15. package/plugins/dsh-gkb-ru-ui/lib/skills.js +195 -1
  16. package/plugins/dsh-gkb-ru-ui/package.json +2 -2
  17. package/plugins/dsh-gkb-ru-ui/screenshots/01-home-tiles-1440-light.png +0 -0
  18. package/plugins/dsh-gkb-ru-ui/screenshots/02-skills-1440-light.png +0 -0
  19. package/plugins/dsh-gkb-ru-ui/screenshots/03-skills-editor-1440-light.png +0 -0
  20. package/plugins/dsh-gkb-ru-ui/screenshots/04-skills-1440-dark.png +0 -0
  21. package/plugins/dsh-gkb-ru-ui/screenshots/05-skills-390-light.png +0 -0
  22. package/plugins/dsh-gkb-ru-ui/screenshots/06-home-tiles-1440-dark.png +0 -0
  23. package/plugins/dsh-peak-guard/screenshots/01-real-time-peak-start.png +0 -0
  24. package/plugins/dsh-peak-guard/screenshots/02-real-time-peak-end.png +0 -0
  25. package/plugins/dsh-peak-guard/screenshots/03-peak-card-1440-light.png +0 -0
  26. package/plugins/dsh-peak-guard/screenshots/04-peak-card-1440-dark.png +0 -0
  27. package/plugins/dsh-peak-guard/screenshots/05-peak-card-390-light.png +0 -0
  28. package/plugins/dsh-peak-guard/screenshots/05-peak-card-768-light.png +0 -0
  29. package/plugins/dsh-peak-guard/screenshots/06-peak-card-390-light.png +0 -0
  30. package/plugins/dsh-peak-guard/screenshots/07-live-preview-check.png +0 -0
  31. package/plugins/dsh-peak-guard/screenshots/07-pre-peak-1440-light.png +0 -0
  32. package/plugins/dsh-peak-guard/screenshots/08-peak-start-1440-light.png +0 -0
  33. package/plugins/dsh-peak-guard/screenshots/09-peak-end-1440-light.png +0 -0
  34. package/plugins/dsh-peak-guard/screenshots/10-pre-peak-card-1440-light.png +0 -0
  35. package/plugins/dsh-peak-guard/screenshots/11-pre-peak-card-1440-dark.png +0 -0
  36. package/plugins/dsh-peak-guard/screenshots/12-pre-peak-card-390-light.png +0 -0
  37. package/plugins/dsh-peak-guard/screenshots/qa-report.json +74 -0
  38. package/plugins/dsh-profile-transfer/screenshots/01-settings-transfer-1440-light.png +0 -0
  39. package/plugins/dsh-profile-transfer/screenshots/02-settings-transfer-preview-1440-light.png +0 -0
  40. package/plugins/dsh-profile-transfer/screenshots/03-settings-transfer-1440-dark.png +0 -0
  41. package/plugins/dsh-profile-transfer/screenshots/04-settings-transfer-390-light.png +0 -0
  42. package/plugins/dsh-profile-transfer/screenshots/05-settings-transfer-768-light.png +0 -0
  43. package/plugins/dsh-profile-transfer/screenshots/06-settings-transfer-390-dark.png +0 -0
  44. package/plugins/dsh-profile-transfer/screenshots/07-settings-transfer-export-result.png +0 -0
  45. package/plugins/dsh-profile-transfer/screenshots/08-settings-transfer-workspaces-1440-light.png +0 -0
  46. package/plugins/dsh-profile-transfer/screenshots/09-settings-transfer-workspaces-1440-dark.png +0 -0
  47. package/plugins/dsh-profile-transfer/screenshots/10-settings-transfer-workspaces-390-light.png +0 -0
  48. package/plugins/dsh-session-move/screenshots/01-row-menu-1440-light.png +0 -0
  49. package/plugins/dsh-session-move/screenshots/02-dialog-1440-light.png +0 -0
  50. package/plugins/dsh-session-move/screenshots/03-dialog-390-light.png +0 -0
  51. package/plugins/dsh-session-move/screenshots/04-dialog-1440-dark.png +0 -0
  52. package/plugins/dsh-session-move/screenshots/05-drag-highlight-1440-light.png +0 -0
  53. package/plugins/dsh-session-move/screenshots/06-drop-ungrouped-highlight.png +0 -0
  54. package/plugins/dsh-session-move/screenshots/07-after-drop-ungrouped.png +0 -0
  55. package/plugins/dsh-session-move/screenshots/08-move-dialog.png +0 -0
  56. package/plugins/dsh-session-move/screenshots/09-moved-to-second-workspace.png +0 -0
  57. package/plugins/dsh-session-move/screenshots/qa-report.json +62 -0
  58. package/plugins/dsh-skill-autopilot/cordis.patch.yml +3 -0
  59. package/plugins/dsh-skill-autopilot/index.js +444 -0
  60. package/plugins/dsh-skill-autopilot/package.json +19 -0
  61. package/plugins/dsh-token-lab/cordis.patch.yml +3 -0
  62. package/plugins/dsh-token-lab/lib/client.js +504 -0
  63. package/plugins/dsh-token-lab/lib/index.js +275 -0
  64. package/plugins/dsh-token-lab/package.json +26 -0
  65. package/plugins/dsh-token-lab/screenshots/01-token-lab-1440-light.png +0 -0
  66. package/plugins/dsh-token-lab/screenshots/02-token-lab-1440-dark.png +0 -0
  67. package/skills/code-review-checklist/SKILL.md +48 -30
  68. package/skills/content-writing/SKILL.md +64 -327
  69. package/skills/content-writing/references/process.md +123 -0
  70. package/skills/content-writing/references/quick-recipes.md +99 -0
  71. package/skills/content-writing/references/rules.md +85 -0
  72. package/skills/content-writing/references/sources.md +49 -0
  73. package/skills/context-economy/SKILL.md +60 -0
  74. package/skills/context-economy/references/long-session.md +35 -0
  75. package/skills/context-economy/references/token-math.md +42 -0
  76. package/skills/context-economy/references/tool-recipes.md +34 -0
  77. package/skills/database-safety/SKILL.md +40 -24
  78. package/skills/debugging-playbook/SKILL.md +30 -27
  79. package/skills/design-critique/SKILL.md +57 -110
  80. package/skills/design-critique/references/a11y.md +25 -0
  81. package/skills/design-critique/references/diagnoses.md +33 -0
  82. package/skills/design-critique/references/quick-tests.md +30 -0
  83. package/skills/design-critique/references/report-template.md +63 -0
  84. package/skills/design-critique/references/rubric-fast.md +73 -0
  85. package/skills/dev-workflow/SKILL.md +41 -34
  86. package/skills/dev-workflow/references/definition-of-done.md +44 -0
  87. package/skills/dev-workflow/references/memory-and-boundaries.md +31 -0
  88. package/skills/dev-workflow/references/stages.md +67 -0
  89. package/skills/git-and-ci/SKILL.md +46 -26
  90. package/skills/pg-upgrade-verify/SKILL.md +54 -35
  91. package/skills/project-deep-dive/SKILL.md +39 -164
  92. package/skills/project-deep-dive/references/recon-commands.md +12 -0
  93. package/skills/project-deep-dive/references/section-templates.md +2 -0
  94. package/skills/project-deep-dive/references/tool-and-process.md +86 -0
  95. package/skills/project-memory-maintenance/SKILL.md +39 -154
  96. package/skills/project-memory-maintenance/references/api-and-checklist.md +99 -0
  97. package/skills/project-memory-maintenance/references/journal-template.md +2 -0
  98. package/skills/project-memory-maintenance/references/section-rules.md +2 -0
  99. package/skills/release-and-deploy/SKILL.md +46 -32
  100. package/skills/requirements-and-planning/SKILL.md +44 -110
  101. package/skills/requirements-and-planning/references/antipatterns-and-checklist.md +20 -0
  102. package/skills/requirements-and-planning/references/process-steps.md +52 -0
  103. package/skills/requirements-and-planning/references/templates-and-estimates.md +29 -0
  104. package/skills/security-review/SKILL.md +33 -29
  105. package/skills/seo/SKILL.md +53 -305
  106. package/skills/seo/references/antipatterns.md +66 -0
  107. package/skills/seo/references/audit-checklist.md +14 -0
  108. package/skills/seo/references/content-seo.md +180 -174
  109. package/skills/seo/references/eeat-medical.md +2 -0
  110. package/skills/seo/references/measurement.md +28 -1
  111. package/skills/seo/references/on-page.md +5 -0
  112. package/skills/seo/references/page-templates.md +56 -0
  113. package/skills/seo/references/stack-recipes.md +2 -0
  114. package/skills/seo/references/structured-data.md +2 -0
  115. package/skills/seo/references/technical-seo.md +2 -0
  116. package/skills/service-desk-conventions/SKILL.md +40 -28
  117. package/skills/service-desk-db-safety/SKILL.md +39 -28
  118. package/skills/service-desk-release/SKILL.md +40 -22
  119. package/skills/service-desk-testing/SKILL.md +47 -33
  120. package/skills/service-desk-ui/SKILL.md +43 -24
  121. package/skills/skills-router/SKILL.md +44 -82
  122. package/skills/skills-router/references/applying-skills.md +25 -0
  123. package/skills/skills-router/references/routing-matrix.md +52 -0
  124. package/skills/testing-strategy/SKILL.md +47 -32
  125. package/skills/ui-design-system/SKILL.md +43 -38
  126. package/skills/ui-design-system/references/accessibility-and-responsive.md +50 -0
  127. package/skills/ui-design-system/references/tokens-and-components.md +67 -0
  128. package/skills/ui-design-system/references/visual-qa.md +44 -0
  129. package/skills/web-research/SKILL.md +40 -33
  130. package/skills/web-research/references/answer-and-citations.md +60 -0
  131. package/skills/web-research/references/query-recipes.md +44 -0
  132. package/skills/wow-design/SKILL.md +82 -161
  133. package/skills/wow-design/references/anti-patterns.md +3 -0
  134. package/skills/wow-design/references/critique-rubric.md +3 -0
  135. package/skills/wow-design/references/design-brief-template.md +2 -0
  136. package/skills/wow-design/references/inspiration.md +3 -0
  137. package/skills/wow-design/references/presets.md +3 -0
  138. package/skills/wow-design/references/principles.md +3 -0
  139. package/skills/wow-design/references/quick-presets.md +50 -0
  140. package/skills/wow-design/references/report-template.md +21 -0
  141. package/skills/wow-design/references/stack-recipes.md +3 -0
  142. package/skills/wow-design/references/visual-qa.md +3 -0
  143. package/skills/wow-design/references/wow-levers.md +43 -0
  144. package/tools/skill-cost.mjs +76 -0
@@ -0,0 +1,56 @@
1
+ > Часть навыка seo. ≈2 250 токенов. Читать, когда: пишешь title/description, проектируешь новую страницу или решаешь, что ставить в JSON-LD/robots/sitemap для конкретного типа страницы.
2
+
3
+ # Шаблоны по типам страниц: мета, разметка, индексация
4
+
5
+ > Готовые решения «по умолчанию»: не изобретай title и разметку заново для каждой страницы.
6
+ > Правила самих элементов — `on-page.md`; шаблоны JSON-LD — `structured-data.md`. Проверено 04.11.2026.
7
+
8
+ ## 1. Матрица по типу страницы
9
+
10
+ | Тип страницы | `title` (шаблон) | JSON-LD | `robots` | sitemap | priority |
11
+ |---|---|---|---|---|---|
12
+ | Главная | `{Клиника} — официальный сайт | {город}` | Organization+WebSite+MedicalClinic | index,follow | да | 1.0 |
13
+ | Направление | `{Направление} в {Клиника}, {город} — врачи, цены, запись` | MedicalWebPage+BreadcrumbList+Service | index,follow | да | 0.8 |
14
+ | Услуга | `{Услуга} в {Клиника} — цена от {X} ₽, запись онлайн` | MedicalProcedure/Service+FAQ+Breadcrumb | index,follow | да | 0.8 |
15
+ | Врач | `{ФИО} — {специальность}, {Клиника}, {город}` | Physician+Person+Breadcrumb | index,follow | да | 0.7 |
16
+ | Статья/блог | `{Вопрос/тема}: {уточнение} — {Клиника}` | Article/MedicalWebPage+FAQ+Breadcrumb | index,follow | да | 0.6 |
17
+ | Новость | `{Событие} — {дата} | {Клиника}` | NewsArticle/Article | index,follow | да | 0.5 |
18
+ | Цены | `Цены на {раздел} в {Клиника}, {город} — {год}` | MedicalWebPage+Offer (осторожно) | index,follow | да | 0.7 |
19
+ | Контакты | `Контакты {Клиника} — адрес, телефон, схема проезда` | MedicalClinic+Organization | index,follow | да | 0.6 |
20
+ | Документы/лицензии | `Лицензии и документы {Клиника} — {город}` | MedicalOrganization | index,follow | да | 0.4 |
21
+ | Спасибо / личный кабинет | `{...}` | — | `noindex,follow` | нет | — |
22
+ | Поиск / фильтры / мусорные фасеты | — | — | `noindex,follow` или robots+`Clean-param` | нет | — |
23
+ | 404 / 410 | `Страница не найдена` | — | `noindex` | нет | — |
24
+
25
+ Оговорки:
26
+ - **`priority` и `changefreq` — подсказка**, а не рычаг: Google их игнорирует, Яндекс учитывает слабо. Ставь для
27
+ порядка в карте, не «оптимизируй» ими (`technical-seo.md` §4).
28
+ - «Цены» с `Offer` — только если цены публичные, актуальные и совпадают с прайсом на странице.
29
+ - «Документы/лицензии» — страница доверия: номер, дата, орган выдачи, ссылка на реестр Росздравнадзора
30
+ (`eeat-medical.md` §3).
31
+ - Один кластер = одна страница: если под один интент уже есть страница, не создавай вторую (каннибализация).
32
+ - Тип страницы определяет блоки контента: услуга/направление/статья — `content-seo.md` §4–5.
33
+
34
+ ## 2. Шаблоны `title` / `description` (RU, медицина)
35
+
36
+ Правило: **что + где + выгода/факт + бренд** (не обязательно все, но первые два — всегда).
37
+ `|` и бренд — не в начало. «Официальный сайт» — только если это действительно официальный сайт организации.
38
+
39
+ | Тип | `title` | `description` |
40
+ |---|---|---|
41
+ | Главная | `организация, Москва — официальный сайт больницы` | `Многопрофильная больница в Москве: консультации врачей, диагностика, стационар. Запись по телефону и онлайн. Адрес и схема проезда.` |
42
+ | Направление | `Кардиология в организация, Москва — врачи, диагностика, запись` | `Кардиологическое отделение: ЭКГ, ЭхоКГ, холтер, консультации кардиолога. Опытные врачи, современное оборудование. Запись онлайн.` |
43
+ | Услуга | `МРТ головного мозга в Москве — цена от 4 500 ₽, запись в организация` | `МРТ головы на аппарате 1.5 Тл: расшифровка врачом, результат в день исследования. Цена от 4 500 ₽, запись онлайн и по телефону.` |
44
+ | Врач | `Иванов Иван Иванович — кардиолог, организация, Москва` | `Кардиолог с 18-летним стажем: диагностика и лечение гипертонии, ИБС, аритмий. Кандидат медицинских наук. Запись на приём.` |
45
+ | Статья | `Высокое давление: причины, симптомы и когда идти к врачу` | `Почему повышается давление, какие симптомы опасны, как измерять дома и когда нужен кардиолог. Разбор врача организация.` |
46
+ | Новость | `День открытых дверей в организация — 12 апреля 2026` | `12 апреля 2026: бесплатная проверка сердца, консультации кардиолога и эндокринолога. Программа, запись, адрес.` |
47
+
48
+ ## 3. Чего избегать в `title` / `description`
49
+
50
+ - `Купить, дёшево, в Москве недорого` для государственной клиники — конфликт с реальностью и YMYL-доверием.
51
+ - Пунктуация-мусор `!!!`, эмодзи, слова «лучший», «№1» без доказательств.
52
+ - Обрезанные фразы и «…» вручную — Google/Яндекс обрежут сами по ширине.
53
+ - Дубли: один и тот же шаблон на сотнях страниц = дубли и потеря релевантности (`technical-seo.md` §6).
54
+ - `description` «Читайте на сайте», набор ключей без пользы, обещания результата лечения.
55
+
56
+ Детали и примеры «плохо → хорошо»: `on-page.md` §1–2, §13.
@@ -1,3 +1,5 @@
1
+ > Часть навыка seo. ≈10 100 токенов. Читать, когда: пишешь SEO в коде — Laravel/Blade, Bitrix/Aspro, React/Vite, статика; один источник SEO-данных, мета и JSON-LD в исходном HTML, сервер/деплой.
2
+
1
3
  # Стек-рецепты: Laravel/Blade, Bitrix/Aspro, React/Vite, статика
2
4
 
3
5
  > Готовые паттерны, чтобы SEO-по-умолчанию не превращалось в ручную работу. Всё написано так, чтобы
@@ -1,3 +1,5 @@
1
+ > Часть навыка seo. ≈8 700 токенов. Читать, когда: добавляешь JSON-LD — шаблоны Organization, BreadcrumbList, MedicalWebPage, Physician, MedicalClinic, Service, FAQPage, Article; что не размечать; валидация.
2
+
1
3
  # Структурированные данные (JSON-LD) — шаблоны и правила
2
4
 
3
5
  > Разметка помогает поисковикам и ИИ-системам **понять сущности** страницы: кто вы, где вы, какие услуги, кто врач,
@@ -1,3 +1,5 @@
1
+ > Часть навыка seo. ≈8 050 токенов. Читать, когда: техническая правка или просадка трафика — статусы, robots, sitemap, canonical, пагинация, фасеты, hreflang, CWV, JS/SPA, миграции URL.
2
+
1
3
  # Техническое SEO — краулинг, индексация, URL, скорость
2
4
 
3
5
  > Справочник по технической части. Всё, что здесь есть, проверяется **в коде и в инструментах**, а не «на глаз».
@@ -1,40 +1,52 @@
1
1
  ---
2
2
  name: service-desk-conventions
3
- description: "Соглашения и инварианты проекта Service Desk организация — где что лежит, как устроены модули, темы и RBAC, что нельзя ломать."
4
- whenToUse: "Любая задача по проекту Service Desk (заявки, активы, склад, отчёты, справочник, AD/LDAP, UI) — читать перед правками."
3
+ description: "Инварианты Service Desk: где что лежит, модули, маршруты и RBAC, темы, миграции и формы — что нельзя ломать перед правками."
4
+ whenToUse: "Любая задача по Service Desk (заявки, активы, склад, отчёты, справочник, AD/LDAP, UI) — читать до правок."
5
5
  user-invocable: true
6
6
  ---
7
7
 
8
- # Service Desk организация — соглашения проекта
8
+ # Service Desk — соглашения проекта
9
9
 
10
- ## Где что
10
+ ## 0. Когда применять
11
+ - Задачи по Service Desk: заявки, активы, склад, отчёты, справочник, AD/LDAP, UI.
12
+ - Перед правками модулей, маршрутов, RBAC, тем, миграций.
13
+ - Нужно понять, куда положить код.
14
+
15
+ ## 1. Главное
16
+
17
+ **Где что**
11
18
  - Рабочая копия (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`.
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`.
15
21
 
16
- ## Архитектура (коротко)
22
+ **Архитектура**
17
23
  - 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` (только база).
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` (только база).
23
29
  - Аудит: `AuditObserver` (Ticket/Asset/Consumable/StockMove/Reminder/News) → `audit_logs`.
24
30
 
25
- ## Нельзя ломать
26
- - Миграции — только новые, аддитивные; не редактировать старые.
31
+ **Нельзя ломать**
32
+ - Миграции — только новые и аддитивные; старые не редактировать.
27
33
  - `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`.
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` поднята.
@@ -1,33 +1,36 @@
1
1
  ---
2
2
  name: service-desk-db-safety
3
- description: "Безопасная работа с PostgreSQL проекта Service Desk — бэкапы, восстановление, запрещённые команды, имитация обновления на копии."
4
- whenToUse: "Перед любыми миграциями, сидами, загрузкой данных, релизом или действиями, которые могут изменить или удалить данные БД."
3
+ description: "PostgreSQL Service Desk: бэкап и проверка копии, запрещённые команды, восстановление, миграции — без потери данных."
4
+ whenToUse: "Перед миграциями, сидами, загрузкой данных, релизом или любым действием, которое может изменить/удалить данные БД."
5
5
  user-invocable: true
6
6
  ---
7
7
 
8
8
  # PostgreSQL: безопасность данных (Service Desk)
9
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
- ## Бэкап (на сервере)
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
+ **Бэкап (на сервере)**
21
23
  ```bash
22
24
  sudo -u den php artisan backup:run --reason="before-<что>"
23
25
  sudo -u postgres pg_dump -Fc -d servicedesk -f /var/backups/service-desk/pre-<версия>.dump
24
26
  sudo -u postgres pg_restore -l /var/backups/service-desk/pre-<версия>.dump | head
27
+ sudo -u den php artisan backup:verify
25
28
  ```
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
+ - `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`).
29
32
 
30
- ## Восстановление (только по разрешению)
33
+ **Восстановление (только по разрешению)**
31
34
  ```bash
32
35
  cd /var/www/service-desk && sudo -u den php artisan down
33
36
  sudo -u postgres dropdb servicedesk && sudo -u postgres createdb servicedesk
@@ -35,18 +38,26 @@ sudo -u postgres pg_restore --no-owner --role=postgres -d servicedesk <dump>
35
38
  sudo -u den php artisan migrate --force && sudo -u den php artisan optimize:clear
36
39
  sudo -u den php artisan up
37
40
  ```
38
- `dropdb` — только после подтверждения и при наличии проверенного дампа.
41
+ `dropdb` — только после подтверждения и проверенного дампа.
39
42
 
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`, не на прод.
43
+ **Локальная проверка**
44
+ - Кластер PG 18: `...\default-workspace\pgruntime\data` (ICU ru-RU, 5432); БД `servicedesk` (dev), `servicedesk_test` (PHPUnit, RefreshDatabase — только на тестовой).
45
+ - Имитация обновления — по `pg-upgrade-verify`: отдельная папка/БД, counts/md5 до и после.
44
46
 
45
- ## Перед релизом с миграциями
46
- 1. Сравнить списки миграций старой и новой версии; прочитать новые: нет ли `dropColumn`, изменения NOT NULL, переименований.
47
- 2. Прогнать `php artisan migrate --pretend` (на копии!) и посмотреть SQL.
48
- 3. Сделать бэкап, только потом `migrate --force`.
47
+ **Перед релизом с миграциями**
48
+ 1. Сравнить списки миграций; прочитать новые: `dropColumn`, NOT NULL, переименования.
49
+ 2. `migrate --pretend` на копии и посмотреть SQL.
50
+ 3. Бэкап — только потом `migrate --force`.
49
51
 
50
- ## Признаки проблемы
52
+ **Сбой**
51
53
  - Сайт в maintenance → `sudo -u den php artisan up`.
52
- - Ошибки БД → `storage/logs/laravel.log`, `journalctl -u service-desk-queue`, не спешить с откатом/восстановлением.
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
+ - [ ] Новые миграции аддитивны и прогнаны на копии; план отката есть.
@@ -1,43 +1,61 @@
1
1
  ---
2
2
  name: service-desk-release
3
- description: "Выпуск и выкатка обновления Service Desk — версия, сборка tgz, checksums, deploy/update.sh, проверки и откат."
4
- whenToUse: "При подготовке любого обновления или релиза и при выкатке на сервер app-server."
3
+ description: "Релиз Service Desk: версия в config/app.php, tgz без мусора, SHA-256, deploy/update.sh, smoke после выкатки и откат."
4
+ whenToUse: "При подготовке обновления, сборке архива, выкатке на app-server, проверке после релиза и откате."
5
5
  user-invocable: true
6
6
  ---
7
7
 
8
8
  # Релиз Service Desk (tgz + update.sh)
9
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`.
10
+ ## 0. Когда применять
11
+ - Готовишь обновление Service Desk: версия, сборка, checksums.
12
+ - Выкатываешь на `app-server` или нужен план отката.
13
+ - В релизе есть миграции — сначала `service-desk-db-safety` и `pg-upgrade-verify`.
14
14
 
15
- ## Сборка архива (как Claude Code)
16
- 1. Правки проверены: `php scripts/test.php` зелёный, UI-скриншоты сделаны.
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-скриншоты сделаны.
17
24
  2. Собрать tgz **без** `vendor/ node_modules/ public/build/ storage/ .env .env.preview .git .claude`.
18
- 3. Надёжный способ: распаковать эталонную предыдущую версию в staging, наложить изменённые файлы, `tar -czf`.
19
- 4. Посчитать sha256, записать в `checksums.txt`; файл положить на Рабочий стол.
25
+ 3. Надёжно: распаковать предыдущую версию в staging, наложить изменённые файлы, `tar -czf`.
26
+ 4. `sha256sum` → `checksums.txt`; архив и checksums — на Рабочий стол.
27
+ 5. Проверить листинг: нет секретов/мусора, все изменённые файлы на месте.
20
28
 
21
- ## Выкатка (сервер app-server, пользователь den)
29
+ **Выкатка (сервер `app-server`, пользователь `den`)**
22
30
  ```bash
23
- cd /tmp && sha256sum service-desk-X.Y.Z.tgz # сверить с локальным
31
+ cd /tmp && sha256sum service-desk-X.Y.Z.tgz # сверить с локальным
24
32
  sudo tar --no-same-owner -xzf /tmp/service-desk-X.Y.Z.tgz -C /var/www/service-desk
25
33
  cd /var/www/service-desk && sudo APP_ADDR=127.0.0.1 bash deploy/update.sh
26
34
  ```
27
- `update.sh` сам: backup → maintenance → composer/npm/build → migrate → seed (идемпотентен) → services/caches → up.
35
+ `update.sh` сам: backup → maintenance → composer/npm/build → migrate → seed (идемпотентен) → services/caches → up. При сбое сайт остаётся в maintenance — исправить и `php artisan up`.
28
36
 
29
- ## Проверки после «Готово»
37
+ **Проверки после «Готово»**
30
38
  1. Ctrl+F5 → версия внизу меню = X.Y.Z.
31
39
  2. Число заявок прежнее, старые номера/вложения открываются.
32
40
  3. Затронутый раздел/фича работает (сценарий из задачи).
33
41
  4. Админ и обычный пользователь — оба сценария.
34
- 5. При желании: `sudo -u den php artisan launch:check`.
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`.
35
52
 
36
- ## Откат
37
- - Код: вернуть папку `Task.old-<дата>` (если делали копию до обновления) или распаковать предыдущий архив.
38
- - БД: восстанавливать только если релиз менял данные/схему (см. `service-desk-db-safety`); обычно не нужно.
39
- - Снять maintenance: `sudo -u den php artisan up`.
53
+ ## 2. Куда грузить дальше
54
+ `service-desk-db-safety` — бэкап/восстановление; `pg-upgrade-verify` — миграции на копии; `release-and-deploy` — общие правила; `git-and-ci` — тег.
40
55
 
41
- ## Журнал
42
- - Записать факт выкатки и проверки в `%USERPROFILE%\.dsh\memory\SESSIONS.md` + досье проекта.
43
- - Структуру/команды и пример — `...\memory\projects\service-desk\release\UPDATE-1.39.0.md`.
56
+ ## 3. Гейт перед сдачей
57
+ - [ ] Версия поднята в `config/app.php`; тег и архив совпадают.
58
+ - [ ] Тесты зелёные, скриншоты сделаны; архив без секретов/мусора.
59
+ - [ ] sha256 локально и на сервере совпал; бэкап перед выкаткой есть.
60
+ - [ ] `update.sh` прошёл; версия, заявки/вложения, фича, админ + пользователь проверены.
61
+ - [ ] Логи и `migrate:status` чистые; откат описан; запись в память сделана.
@@ -1,47 +1,61 @@
1
1
  ---
2
2
  name: service-desk-testing
3
- description: "Как тестировать Service Desk — PHPUnit на PostgreSQL, baseline, известные особенности, Playwright E2E и визуальные проверки."
4
- whenToUse: "При любой правке кода или UI проекта — до и после изменений; при подготовке релиза."
3
+ description: "Тесты Service Desk: PHPUnit на PostgreSQL, baseline, права и формы, Playwright E2E, скриншоты, Pint и PHPStan."
4
+ whenToUse: "Перед и после любой правки кода/UI Service Desk, при подготовке релиза и при разборе упавших тестов."
5
5
  user-invocable: true
6
6
  ---
7
7
 
8
8
  # Тестирование Service Desk
9
9
 
10
- ## Рабочая копия
11
- `%USERPROFILE%\OneDrive\Документы\deepseek-harness\default-workspace\src\service-desk-1.38.1`
10
+ ## 0. Когда применять
11
+ - Любая правка кода/UI: сначала baseline, после — сравнение.
12
+ - Нужны feature/unit-тесты, проверка прав или форм.
13
+ - Подготовка релиза, E2E или визуальная проверка.
12
14
 
13
- ## PHPUnit на PostgreSQL (обязательно)
15
+ ## 1. Главное
16
+
17
+ **PHPUnit на PostgreSQL (обязательно)**
14
18
  ```powershell
15
19
  # из корня проекта (Windows)
16
20
  php scripts/test.php
21
+ php scripts/test.php --filter=TicketFormVisibilityTest
22
+ php scripts/test.php --stop-on-failure
17
23
  # Linux/CI
18
24
  make test
19
25
  ```
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).
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 обновлён при необходимости.
@@ -1,33 +1,52 @@
1
1
  ---
2
2
  name: service-desk-ui
3
- description: "Правила UI/UX проекта Service Desk — где править вёрстку и темы, дизайн-токены, скриншоты и визуальная проверка."
4
- whenToUse: "Любая правка интерфейса, тем, вёрстки, SCSS/JS или UX-текстов в Service Desk."
3
+ description: "UI Service Desk: где править вёрстку и темы, дизайн-токены, состояния и адаптив, сборка, скриншоты и визуальная проверка."
4
+ whenToUse: "Любая правка интерфейса, тем, вёрстки, SCSS/JS или UX-текстов Service Desk; визуальный баг и проверка перед сдачей."
5
5
  user-invocable: true
6
6
  ---
7
7
 
8
8
  # UI/UX Service Desk
9
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 и тесты падают).
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 и тесты падают.
15
22
  - Иконки: `public/themes/default/icons/*.svg`; шрифты: `public/fonts`.
16
23
 
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`; сообщения на русском.
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 нет.