dsh-desktop-kit 0.0.0-stage → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +152 -2
- package/client.js +4101 -0
- package/cordis.patch.yml +5 -0
- package/docs/ARCHITECTURE.md +114 -0
- package/docs/COMPATIBILITY.md +61 -0
- package/docs/INSTALL.md +84 -0
- package/docs/PRIVACY.md +50 -0
- package/docs/ROADMAP.md +57 -0
- package/docs/TOKENS.md +118 -0
- package/docs/TROUBLESHOOTING.md +68 -0
- package/docs/images/hero.png +0 -0
- package/index.js +84 -0
- package/package.json +70 -4
- package/plugins/dsh-gkb-ru-ui/cordis.patch.yml +6 -0
- package/plugins/dsh-gkb-ru-ui/lib/client.js +1331 -0
- package/plugins/dsh-gkb-ru-ui/lib/index.js +186 -0
- package/plugins/dsh-gkb-ru-ui/lib/skills.js +570 -0
- package/plugins/dsh-gkb-ru-ui/package.json +28 -0
- package/plugins/dsh-gkb-ru-ui/screenshots/01-home-tiles-1440-light.png +0 -0
- package/plugins/dsh-gkb-ru-ui/screenshots/02-skills-1440-light.png +0 -0
- package/plugins/dsh-gkb-ru-ui/screenshots/03-skills-editor-1440-light.png +0 -0
- package/plugins/dsh-gkb-ru-ui/screenshots/04-skills-1440-dark.png +0 -0
- package/plugins/dsh-gkb-ru-ui/screenshots/05-skills-390-light.png +0 -0
- package/plugins/dsh-gkb-ru-ui/screenshots/06-home-tiles-1440-dark.png +0 -0
- package/plugins/dsh-peak-guard/README.md +70 -0
- package/plugins/dsh-peak-guard/client.js +741 -0
- package/plugins/dsh-peak-guard/cordis.patch.yml +5 -0
- package/plugins/dsh-peak-guard/icon.svg +12 -0
- package/plugins/dsh-peak-guard/index.js +2 -0
- package/plugins/dsh-peak-guard/locale/en.json +6 -0
- package/plugins/dsh-peak-guard/locale/ru.json +6 -0
- package/plugins/dsh-peak-guard/locale/zh.json +6 -0
- package/plugins/dsh-peak-guard/package.json +33 -0
- package/plugins/dsh-peak-guard/screenshots/01-real-time-peak-start.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/02-real-time-peak-end.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/03-peak-card-1440-light.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/04-peak-card-1440-dark.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/05-peak-card-390-light.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/05-peak-card-768-light.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/06-peak-card-390-light.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/07-live-preview-check.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/07-pre-peak-1440-light.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/08-peak-start-1440-light.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/09-peak-end-1440-light.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/10-pre-peak-card-1440-light.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/11-pre-peak-card-1440-dark.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/12-pre-peak-card-390-light.png +0 -0
- package/plugins/dsh-peak-guard/screenshots/qa-report.json +74 -0
- package/plugins/dsh-profile-transfer/README.md +62 -0
- package/plugins/dsh-profile-transfer/bootstrap/01-INSTALL.cmd +7 -0
- package/plugins/dsh-profile-transfer/bootstrap/README-ARCHIVE.md +54 -0
- package/plugins/dsh-profile-transfer/bootstrap/README-/320/243/320/241/320/242/320/220/320/235/320/236/320/222/320/232/320/220.md +42 -0
- package/plugins/dsh-profile-transfer/bootstrap/install-on-clean-machine.ps1 +119 -0
- package/plugins/dsh-profile-transfer/bootstrap//320/243/320/241/320/242/320/220/320/235/320/236/320/222/320/230/320/242/320/254.cmd +5 -0
- package/plugins/dsh-profile-transfer/client.js +806 -0
- package/plugins/dsh-profile-transfer/cordis.patch.yml +3 -0
- package/plugins/dsh-profile-transfer/icon.svg +13 -0
- package/plugins/dsh-profile-transfer/index.js +375 -0
- package/plugins/dsh-profile-transfer/locale/en.json +6 -0
- package/plugins/dsh-profile-transfer/locale/ru.json +6 -0
- package/plugins/dsh-profile-transfer/locale/zh.json +6 -0
- package/plugins/dsh-profile-transfer/package.json +36 -0
- package/plugins/dsh-profile-transfer/screenshots/01-settings-transfer-1440-light.png +0 -0
- package/plugins/dsh-profile-transfer/screenshots/02-settings-transfer-preview-1440-light.png +0 -0
- package/plugins/dsh-profile-transfer/screenshots/03-settings-transfer-1440-dark.png +0 -0
- package/plugins/dsh-profile-transfer/screenshots/04-settings-transfer-390-light.png +0 -0
- package/plugins/dsh-profile-transfer/screenshots/05-settings-transfer-768-light.png +0 -0
- package/plugins/dsh-profile-transfer/screenshots/06-settings-transfer-390-dark.png +0 -0
- package/plugins/dsh-profile-transfer/screenshots/07-settings-transfer-export-result.png +0 -0
- package/plugins/dsh-profile-transfer/screenshots/08-settings-transfer-workspaces-1440-light.png +0 -0
- package/plugins/dsh-profile-transfer/screenshots/09-settings-transfer-workspaces-1440-dark.png +0 -0
- package/plugins/dsh-profile-transfer/screenshots/10-settings-transfer-workspaces-390-light.png +0 -0
- package/plugins/dsh-profile-transfer/transfer.js +1004 -0
- package/plugins/dsh-project-memory/README.md +71 -0
- package/plugins/dsh-project-memory/cordis.patch.yml +4 -0
- package/plugins/dsh-project-memory/icon.svg +12 -0
- package/plugins/dsh-project-memory/index.js +1240 -0
- package/plugins/dsh-project-memory/locale/en.json +6 -0
- package/plugins/dsh-project-memory/locale/ru.json +6 -0
- package/plugins/dsh-project-memory/locale/zh.json +6 -0
- package/plugins/dsh-project-memory/package.json +26 -0
- package/plugins/dsh-session-move/README.md +67 -0
- package/plugins/dsh-session-move/client.js +719 -0
- package/plugins/dsh-session-move/cordis.patch.yml +5 -0
- package/plugins/dsh-session-move/icon.svg +14 -0
- package/plugins/dsh-session-move/index.js +497 -0
- package/plugins/dsh-session-move/locale/en.json +6 -0
- package/plugins/dsh-session-move/locale/ru.json +6 -0
- package/plugins/dsh-session-move/locale/zh.json +6 -0
- package/plugins/dsh-session-move/package.json +31 -0
- package/plugins/dsh-session-move/screenshots/01-row-menu-1440-light.png +0 -0
- package/plugins/dsh-session-move/screenshots/02-dialog-1440-light.png +0 -0
- package/plugins/dsh-session-move/screenshots/03-dialog-390-light.png +0 -0
- package/plugins/dsh-session-move/screenshots/04-dialog-1440-dark.png +0 -0
- package/plugins/dsh-session-move/screenshots/05-drag-highlight-1440-light.png +0 -0
- package/plugins/dsh-session-move/screenshots/06-drop-ungrouped-highlight.png +0 -0
- package/plugins/dsh-session-move/screenshots/07-after-drop-ungrouped.png +0 -0
- package/plugins/dsh-session-move/screenshots/08-move-dialog.png +0 -0
- package/plugins/dsh-session-move/screenshots/09-moved-to-second-workspace.png +0 -0
- package/plugins/dsh-session-move/screenshots/qa-report.json +62 -0
- package/plugins/dsh-skill-autopilot/cordis.patch.yml +3 -0
- package/plugins/dsh-skill-autopilot/index.js +444 -0
- package/plugins/dsh-skill-autopilot/package.json +19 -0
- package/plugins/dsh-token-lab/cordis.patch.yml +3 -0
- package/plugins/dsh-token-lab/lib/client.js +504 -0
- package/plugins/dsh-token-lab/lib/index.js +275 -0
- package/plugins/dsh-token-lab/package.json +26 -0
- package/plugins/dsh-token-lab/screenshots/01-token-lab-1440-light.png +0 -0
- package/plugins/dsh-token-lab/screenshots/02-token-lab-1440-dark.png +0 -0
- package/skills/code-review-checklist/SKILL.md +55 -0
- package/skills/content-writing/README.md +87 -0
- package/skills/content-writing/SKILL.md +85 -0
- package/skills/content-writing/assets/checklists/fact-check.md +53 -0
- package/skills/content-writing/assets/checklists/publish.md +65 -0
- package/skills/content-writing/assets/checklists/social.md +40 -0
- package/skills/content-writing/assets/templates/article.md +47 -0
- package/skills/content-writing/assets/templates/brief.md +44 -0
- package/skills/content-writing/assets/templates/doctor-card.md +41 -0
- package/skills/content-writing/assets/templates/image-prompts.md +128 -0
- package/skills/content-writing/assets/templates/post-telegram.md +36 -0
- package/skills/content-writing/assets/templates/post-vk.md +42 -0
- package/skills/content-writing/assets/templates/press-release.md +56 -0
- package/skills/content-writing/assets/templates/science-pop-note.md +55 -0
- package/skills/content-writing/assets/templates/service-card.md +46 -0
- package/skills/content-writing/references/anti-ai-style.md +248 -0
- package/skills/content-writing/references/editing.md +185 -0
- package/skills/content-writing/references/fact-checking.md +205 -0
- package/skills/content-writing/references/government-medical.md +246 -0
- package/skills/content-writing/references/images.md +212 -0
- package/skills/content-writing/references/journalism.md +252 -0
- package/skills/content-writing/references/process.md +123 -0
- package/skills/content-writing/references/quick-recipes.md +99 -0
- package/skills/content-writing/references/rules.md +85 -0
- package/skills/content-writing/references/science-popular.md +218 -0
- package/skills/content-writing/references/seo-content.md +172 -0
- package/skills/content-writing/references/social-media.md +253 -0
- package/skills/content-writing/references/sources.md +49 -0
- package/skills/content-writing/references/templates.md +291 -0
- package/skills/context-economy/SKILL.md +60 -0
- package/skills/context-economy/references/long-session.md +35 -0
- package/skills/context-economy/references/token-math.md +42 -0
- package/skills/context-economy/references/tool-recipes.md +34 -0
- package/skills/database-safety/SKILL.md +47 -0
- package/skills/debugging-playbook/SKILL.md +42 -0
- package/skills/design-critique/SKILL.md +65 -0
- package/skills/design-critique/references/a11y.md +25 -0
- package/skills/design-critique/references/diagnoses.md +33 -0
- package/skills/design-critique/references/quick-tests.md +30 -0
- package/skills/design-critique/references/report-template.md +63 -0
- package/skills/design-critique/references/rubric-fast.md +73 -0
- package/skills/dev-workflow/SKILL.md +48 -0
- package/skills/dev-workflow/references/definition-of-done.md +44 -0
- package/skills/dev-workflow/references/memory-and-boundaries.md +31 -0
- package/skills/dev-workflow/references/stages.md +67 -0
- package/skills/git-and-ci/SKILL.md +60 -0
- package/skills/pg-upgrade-verify/SKILL.md +67 -0
- package/skills/project-deep-dive/SKILL.md +45 -0
- package/skills/project-deep-dive/references/recon-commands.md +90 -0
- package/skills/project-deep-dive/references/section-templates.md +104 -0
- package/skills/project-deep-dive/references/tool-and-process.md +86 -0
- package/skills/project-memory-maintenance/SKILL.md +55 -0
- package/skills/project-memory-maintenance/references/api-and-checklist.md +99 -0
- package/skills/project-memory-maintenance/references/journal-template.md +50 -0
- package/skills/project-memory-maintenance/references/section-rules.md +59 -0
- package/skills/release-and-deploy/SKILL.md +53 -0
- package/skills/requirements-and-planning/SKILL.md +49 -0
- package/skills/requirements-and-planning/references/antipatterns-and-checklist.md +20 -0
- package/skills/requirements-and-planning/references/process-steps.md +52 -0
- package/skills/requirements-and-planning/references/templates-and-estimates.md +29 -0
- package/skills/security-review/SKILL.md +40 -0
- package/skills/seo/README.md +60 -0
- package/skills/seo/SKILL.md +77 -0
- package/skills/seo/assets/README.md +66 -0
- package/skills/seo/assets/scripts/LICENSE-playwright-core.txt +202 -0
- package/skills/seo/assets/scripts/README.md +179 -0
- package/skills/seo/assets/scripts/lib/args.mjs +105 -0
- package/skills/seo/assets/scripts/lib/browser.mjs +620 -0
- package/skills/seo/assets/scripts/lib/zip.mjs +191 -0
- package/skills/seo/assets/scripts/seo-audit.mjs +1675 -0
- package/skills/seo/assets/snippets/jsonld-breadcrumb.json +30 -0
- package/skills/seo/assets/snippets/jsonld-faq.json +39 -0
- package/skills/seo/assets/snippets/jsonld-medical-clinic.json +49 -0
- package/skills/seo/assets/snippets/jsonld-medical-webpage.json +33 -0
- package/skills/seo/assets/snippets/jsonld-organization.json +74 -0
- package/skills/seo/assets/snippets/jsonld-physician.json +46 -0
- package/skills/seo/assets/snippets/meta.blade.php +61 -0
- package/skills/seo/assets/snippets/robots.txt +61 -0
- package/skills/seo/assets/snippets/sitemap-urlset-example.xml +72 -0
- package/skills/seo/assets/snippets/sitemap.xml +36 -0
- package/skills/seo/references/antipatterns.md +66 -0
- package/skills/seo/references/audit-checklist.md +319 -0
- package/skills/seo/references/content-seo.md +204 -0
- package/skills/seo/references/eeat-medical.md +219 -0
- package/skills/seo/references/measurement.md +250 -0
- package/skills/seo/references/on-page.md +214 -0
- package/skills/seo/references/page-templates.md +56 -0
- package/skills/seo/references/stack-recipes.md +695 -0
- package/skills/seo/references/structured-data.md +487 -0
- package/skills/seo/references/technical-seo.md +296 -0
- package/skills/service-desk-conventions/SKILL.md +52 -0
- package/skills/service-desk-db-safety/SKILL.md +63 -0
- package/skills/service-desk-release/SKILL.md +61 -0
- package/skills/service-desk-testing/SKILL.md +61 -0
- package/skills/service-desk-ui/SKILL.md +52 -0
- package/skills/skills-router/SKILL.md +53 -0
- package/skills/skills-router/references/applying-skills.md +25 -0
- package/skills/skills-router/references/routing-matrix.md +52 -0
- package/skills/testing-strategy/SKILL.md +52 -0
- package/skills/ui-design-system/SKILL.md +50 -0
- package/skills/ui-design-system/references/accessibility-and-responsive.md +50 -0
- package/skills/ui-design-system/references/tokens-and-components.md +67 -0
- package/skills/ui-design-system/references/visual-qa.md +44 -0
- package/skills/web-research/SKILL.md +47 -0
- package/skills/web-research/references/answer-and-citations.md +60 -0
- package/skills/web-research/references/query-recipes.md +44 -0
- package/skills/wow-design/SKILL.md +89 -0
- package/skills/wow-design/assets/kit/README.md +195 -0
- package/skills/wow-design/assets/kit/assets/css/base.css +158 -0
- package/skills/wow-design/assets/kit/assets/css/components.css +1001 -0
- package/skills/wow-design/assets/kit/assets/css/fonts.css +73 -0
- package/skills/wow-design/assets/kit/assets/css/pages.css +737 -0
- package/skills/wow-design/assets/kit/assets/css/tokens.css +218 -0
- package/skills/wow-design/assets/kit/assets/fonts/LICENSE-golos-text.txt +93 -0
- package/skills/wow-design/assets/kit/assets/fonts/LICENSE-lora.txt +93 -0
- package/skills/wow-design/assets/kit/assets/fonts/LICENSE-unbounded.txt +93 -0
- package/skills/wow-design/assets/kit/assets/fonts/golos-text-cyrillic-400-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/golos-text-cyrillic-500-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/golos-text-cyrillic-600-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/golos-text-cyrillic-700-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/golos-text-latin-400-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/golos-text-latin-500-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/golos-text-latin-600-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/golos-text-latin-700-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/lora-cyrillic-400-italic.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/lora-cyrillic-400-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/lora-cyrillic-500-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/lora-cyrillic-600-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/lora-latin-400-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/lora-latin-500-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/lora-latin-600-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/unbounded-cyrillic-400-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/unbounded-cyrillic-500-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/unbounded-cyrillic-600-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/unbounded-latin-400-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/unbounded-latin-500-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/fonts/unbounded-latin-600-normal.woff2 +0 -0
- package/skills/wow-design/assets/kit/assets/js/kit.js +550 -0
- package/skills/wow-design/assets/kit/pages/dashboard.html +539 -0
- package/skills/wow-design/assets/kit/pages/hospital.html +430 -0
- package/skills/wow-design/assets/kit/showcase.html +1164 -0
- package/skills/wow-design/assets/scripts/LICENSE-axe-core.txt +362 -0
- package/skills/wow-design/assets/scripts/LICENSE-playwright-core.txt +202 -0
- package/skills/wow-design/assets/scripts/README.md +312 -0
- package/skills/wow-design/assets/scripts/audit.mjs +1200 -0
- package/skills/wow-design/assets/scripts/capture.mjs +337 -0
- package/skills/wow-design/assets/scripts/package.json +30 -0
- package/skills/wow-design/references/anti-patterns.md +252 -0
- package/skills/wow-design/references/critique-rubric.md +262 -0
- package/skills/wow-design/references/design-brief-template.md +48 -0
- package/skills/wow-design/references/inspiration.md +203 -0
- package/skills/wow-design/references/presets.md +99 -0
- package/skills/wow-design/references/principles.md +371 -0
- package/skills/wow-design/references/quick-presets.md +50 -0
- package/skills/wow-design/references/report-template.md +21 -0
- package/skills/wow-design/references/stack-recipes.md +96 -0
- package/skills/wow-design/references/visual-qa.md +82 -0
- package/skills/wow-design/references/wow-levers.md +43 -0
- package/tools/skill-cost.mjs +76 -0
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
# design-qa — инструменты визуальной проверки UI
|
|
2
|
+
|
|
3
|
+
Набор CLI-инструментов для петли «собрал → снял скриншоты → проверил доступность/технику → исправил → снова снял».
|
|
4
|
+
Используется в WOW-дизайне (дизайн-кит `projects/design-kit/`) и для проверки любых других страниц.
|
|
5
|
+
|
|
6
|
+
| Инструмент | Что делает |
|
|
7
|
+
|---|---|
|
|
8
|
+
| `capture.mjs` | PNG-скриншоты страницы во всех viewport и темах через headless Chrome (CDP) |
|
|
9
|
+
| `audit.mjs` | axe-core + кастомные проверки (overflow, tap-targets, заголовки, alt, шрифты, консоль) → `audit.json` + `audit.md` |
|
|
10
|
+
| `validate-package.mjs` | Валидатор портативного пакета DSH (ZIP или каталог): структура, скиллы, секреты, sha256 |
|
|
11
|
+
|
|
12
|
+
## Требования окружения
|
|
13
|
+
|
|
14
|
+
- Node.js 24 (в репозитории уже есть `node_modules` с `playwright-core` и `axe-core` — ставить ничего не нужно).
|
|
15
|
+
- Chrome, запущенный с `--remote-debugging-port=9333` (в текущем окружении он уже запущен).
|
|
16
|
+
Если CDP недоступен, `capture/audit` **сами** запускают `chrome.exe` из `ms-playwright` с временным профилем
|
|
17
|
+
(порт берётся свободный). Чужой Chrome инструменты **не перезапускают**.
|
|
18
|
+
- Переопределение браузера: `--cdp <url>` / env `CDP_URL`, путь к chrome.exe — env `CHROME_PATH`.
|
|
19
|
+
- Все артефакты по умолчанию складываются в `tmp/qa-artifacts/` (от корня workspace).
|
|
20
|
+
|
|
21
|
+
Запускать команды удобнее из корня workspace:
|
|
22
|
+
|
|
23
|
+
```powershell
|
|
24
|
+
node tools/design-qa/capture.mjs projects/design-kit/showcase.html --name showcase
|
|
25
|
+
node tools/design-qa/audit.mjs projects/design-kit/showcase.html --name showcase
|
|
26
|
+
node tools/design-qa/validate-package.mjs dist/dsh-portable-2026-11-04-dry.zip
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## capture.mjs — скриншоты
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
node tools/design-qa/capture.mjs <путь-к-html|url> --name <name> [опции]
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
| Опция | Описание |
|
|
38
|
+
|---|---|
|
|
39
|
+
| `--name <name>` | Префикс имён PNG (по умолчанию — имя html-файла) |
|
|
40
|
+
| `--out <dir>` | Куда писать PNG и `shots.json` (по умолчанию `tmp/qa-artifacts`) |
|
|
41
|
+
| `--viewports <list>` | `desktop,tablet,mobile` или `1440x900,390x844` (по умолчанию все три) |
|
|
42
|
+
| `--themes <list>` | `light,dark` (по умолчанию обе) |
|
|
43
|
+
| `--full` / `--no-full` | Полная страница (по умолчанию включено) или только видимая часть |
|
|
44
|
+
| `--selector <css>` | Снять только первый элемент по селектору (например, `"main"` или `"#components"`) |
|
|
45
|
+
| `--dpr <1..4>` | `devicePixelRatio` (retina-скриншоты; по умолчанию 1) |
|
|
46
|
+
| `--preset <id>` | Выставить `data-preset` на `<html>`: `aurora`, `graphite`, `editorial`, `warm`, `swiss` |
|
|
47
|
+
| `--serve` | Отдать страницу локальным HTTP-сервером (нужно для `<script type="module">`) |
|
|
48
|
+
| `--cdp <url>` | CDP-эндпоинт (по умолчанию `http://127.0.0.1:9333`) |
|
|
49
|
+
| `--timeout <ms>` | Таймаут загрузки (по умолчанию 30000) |
|
|
50
|
+
| `--json` | Манифест в stdout как JSON (логи — в stderr) |
|
|
51
|
+
| `-h, --help` | Справка |
|
|
52
|
+
|
|
53
|
+
Что происходит внутри (важно для предсказуемости скриншотов):
|
|
54
|
+
|
|
55
|
+
1. Подключение к CDP (при недоступности — fallback-запуск Chromium).
|
|
56
|
+
2. Путь к локальному html превращается в `file://` URL (валидное URL-кодирование кириллицы и пробелов).
|
|
57
|
+
3. `data-theme`/`data-preset` выставляются **до** первой отрисовки (init script), затем повторно после загрузки —
|
|
58
|
+
на случай, если JS страницы перезапишет тему из localStorage.
|
|
59
|
+
4. Ожидание `document.fonts.ready`; отдельно фиксируется `document.fonts.status`.
|
|
60
|
+
5. Инжектится CSS, гасящий анимации/переходы и скрывающий скроллбар (чтобы layout не зависел от 15-px скроллбара).
|
|
61
|
+
6. Страница проскролливается сверху вниз и обратно — срабатывают reveal-анимации (IntersectionObserver) и lazy-load;
|
|
62
|
+
изображения принудительно декодируются.
|
|
63
|
+
7. Стабилизация (несколько кадров + повторное ожидание шрифтов), затем скриншот.
|
|
64
|
+
|
|
65
|
+
Результат:
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
tmp/qa-artifacts/
|
|
69
|
+
showcase-desktop-light.png # <name>-<viewport>-<theme>.png
|
|
70
|
+
showcase-desktop-dark.png
|
|
71
|
+
showcase-tablet-light.png ...
|
|
72
|
+
showcase-mobile-dark.png
|
|
73
|
+
shots.json # манифест прогона
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
`shots.json`: `name`, `source`, `url`, `browser`, `options`, `shots[]` (viewport/theme/dpr/размеры PNG, title,
|
|
77
|
+
scrollWidth/scrollHeight, `fonts.status`, ошибки консоли/сети, `error`), агрегированные `consoleErrors`,
|
|
78
|
+
`pageErrors`, `failedRequests`, `totals`, `ok`.
|
|
79
|
+
|
|
80
|
+
Коды выхода: `0` — все скриншоты сняты; `1` — ошибка/частичный сбой (смотрите `shots.json` → `error`).
|
|
81
|
+
Страница со сломанными ассетами всё равно снимается: ошибки фиксируются в манифесте.
|
|
82
|
+
|
|
83
|
+
Примеры:
|
|
84
|
+
|
|
85
|
+
```powershell
|
|
86
|
+
# Полный набор 6 скриншотов
|
|
87
|
+
node tools/design-qa/capture.mjs projects/design-kit/showcase.html --name showcase
|
|
88
|
+
|
|
89
|
+
# Скриншоты сразу в каталог дизайн-кита (как в DoD)
|
|
90
|
+
node tools/design-qa/capture.mjs projects/design-kit/showcase.html --name showcase --out projects/design-kit/screenshots
|
|
91
|
+
|
|
92
|
+
# Только мобильный тёмный + двойное разрешение
|
|
93
|
+
node tools/design-qa/capture.mjs projects/design-kit/pages/dashboard.html --name dashboard --viewports mobile --themes dark --dpr 2
|
|
94
|
+
|
|
95
|
+
# Отдельный блок (не вся страница)
|
|
96
|
+
node tools/design-qa/capture.mjs projects/design-kit/showcase.html --name palette --selector "#colors"
|
|
97
|
+
|
|
98
|
+
# Страница с ES-модулями (file:// их блокирует CORS)
|
|
99
|
+
node tools/design-qa/capture.mjs projects/design-kit/showcase.html --name showcase --serve
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## audit.mjs — доступность и технический аудит
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
node tools/design-qa/audit.mjs <путь-к-html|url> [--out <dir>] [--name <name>] [--json]
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
| Опция | Описание |
|
|
111
|
+
|---|---|
|
|
112
|
+
| `--out <dir>` | Каталог отчётов (по умолчанию `tmp/qa-artifacts`) |
|
|
113
|
+
| `--name <name>` | Имена файлов `<name>-audit.json` / `<name>-audit.md`; без `--name` — `audit.json` / `audit.md` |
|
|
114
|
+
| `--themes <list>` | `light,dark` (по умолчанию обе) |
|
|
115
|
+
| `--preset <id>` | Выставить `data-preset` |
|
|
116
|
+
| `--serve` / `--cdp` / `--timeout` | Как у capture |
|
|
117
|
+
| `--json` | Полный JSON в stdout (логи — в stderr) |
|
|
118
|
+
|
|
119
|
+
Что проверяется (каждая тема × desktop 1440×900 и mobile 390×844):
|
|
120
|
+
|
|
121
|
+
- **axe-core** из `node_modules/axe-core/axe.min.js` (теги: `wcag2a`, `wcag2aa`, `wcag21a`, `wcag21aa`, `wcag22aa`, `best-practice`).
|
|
122
|
+
Контраст текста проверяется отдельно в обеих темах.
|
|
123
|
+
- **Горизонтальный overflow** на 390px: `scrollWidth > clientWidth`, с поиском элементов-виновников
|
|
124
|
+
(исключая содержимое легитимных `overflow-x:auto` контейнеров).
|
|
125
|
+
- **Tap-targets (WCAG 2.5.8)**:
|
|
126
|
+
- иконочные цели `< 24×24px` (кнопки/ссылки без видимого текста) → **critical** (блокер exit-кода);
|
|
127
|
+
- цели `24–39px`, текстовые ссылки малой высоты и нативные контролы (checkbox/radio/select) → **minor**
|
|
128
|
+
(best practice, на вердикт не влияет);
|
|
129
|
+
- инлайновые ссылки в тексте/навигации (`a` внутри `p`, `li`, `nav`, breadcrumbs) → advisory, не считаются.
|
|
130
|
+
- **Порядок заголовков**: нет h1 / несколько h1 / пропуск уровня (`h2 → h4`).
|
|
131
|
+
- **Изображения**: отсутствие атрибута `alt`, битые картинки (`naturalWidth === 0`).
|
|
132
|
+
- **Ссылки/кнопки без доступного имени** (текст, `aria-label`, `aria-labelledby`, `title`, `img alt`).
|
|
133
|
+
- **Шрифты**: `document.fonts.status !== "loaded"`, `@font-face` со статусом `error`.
|
|
134
|
+
- **Консоль и сеть**: `console.error`, `pageerror`, сбои загрузки ресурсов (404, CORS, битые пути).
|
|
135
|
+
Шум, который создаёт сам axe-core (XHR к CSS на `file://`), отфильтрован — диагностика снимается до инжекта axe.
|
|
136
|
+
|
|
137
|
+
Severity и код выхода:
|
|
138
|
+
|
|
139
|
+
| Severity | Влияет на exit code |
|
|
140
|
+
|---|---|
|
|
141
|
+
| `critical` | да |
|
|
142
|
+
| `serious` | да |
|
|
143
|
+
| `moderate` / `minor` | нет |
|
|
144
|
+
|
|
145
|
+
Коды выхода: `0` — нет critical/serious; `2` — есть critical/serious (страницу нельзя сдавать); `1` — сбой инструмента.
|
|
146
|
+
|
|
147
|
+
`audit.md` (человекочитаемо): вердикт, сводка по severity, **топ-10 «что чинить в первую очередь»** с подсказками
|
|
148
|
+
по исправлению, разделы axe по правилам (id, impact, helpUrl, узлы), кастомные проверки (overflow, tap-targets,
|
|
149
|
+
заголовки, изображения, ссылки, шрифты), консоль/сеть, таблица прогонов.
|
|
150
|
+
`audit.json` (машиночитаемо): `summary`, `issues[]` (source/id/severity/theme/viewport/help/helpUrl/nodes/seenIn/fix),
|
|
151
|
+
`axe[]` по прогонам, `custom[]` (сырые метрики), `console`, `fonts`, `options`, `exitCode`.
|
|
152
|
+
|
|
153
|
+
Как читать отчёт:
|
|
154
|
+
|
|
155
|
+
1. `## Вердикт` — PASS/FAIL и counts. Цель для UI: `critical = 0`, `serious = 0`.
|
|
156
|
+
2. `## Что чинить в первую очередь` — 10 самых важных пунктов с готовой формулировкой правки.
|
|
157
|
+
3. `## Axe: нарушения` — конкретные CSS-селекторы/HTML и `failureSummary` (что именно не так).
|
|
158
|
+
4. `## Кастомные проверки` — overflow/tap-targets/заголовки/alt/шрифты.
|
|
159
|
+
5. `## Консоль и сеть` — ошибки JS и незагруженные ресурсы.
|
|
160
|
+
|
|
161
|
+
Пример:
|
|
162
|
+
|
|
163
|
+
```powershell
|
|
164
|
+
node tools/design-qa/audit.mjs projects/design-kit/showcase.html --name showcase
|
|
165
|
+
# exit 0 — чисто; 2 — есть блокеры (аудит-файлы в tmp/qa-artifacts/)
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## validate-package.mjs — валидатор портативного пакета DSH
|
|
171
|
+
|
|
172
|
+
```
|
|
173
|
+
node tools/design-qa/validate-package.mjs <zip|каталог> [--json] [--skip-secrets] [--quiet]
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
Проверки:
|
|
177
|
+
|
|
178
|
+
1. **Структура** — обязательные `install.ps1`, `README.md`, `metadata.json`, `payload/AGENTS.md`,
|
|
179
|
+
`payload/memory/`, `payload/skills/`, `payload/profiles/desktop/`; рекомендуемые
|
|
180
|
+
`УСТАНОВИТЬ.cmd`, `payload/memory/INDEX.md`, `payload/profiles/desktop/cordis.yml`, `package.json`.
|
|
181
|
+
2. **metadata.json** — валидный JSON, обязательные поля `schemaVersion` (number), `exportedAt` (ISO-дата),
|
|
182
|
+
`dshVersion` (string); отсутствие рекомендуемых полей — предупреждение.
|
|
183
|
+
3. **Скиллы** — для каждого `payload/skills/<name>/SKILL.md`: YAML-frontmatter, `name` в kebab-case,
|
|
184
|
+
`name` совпадает с именем папки, есть `description` и `whenToUse`, нет дублей имён, файл не пустой, UTF-8.
|
|
185
|
+
4. **Целостность ZIP** — читается каждая запись, проверяются CRC32 и размер (обрезанный/битый архив → FAIL);
|
|
186
|
+
для каталога — проверяется читаемость всех файлов.
|
|
187
|
+
5. **Битые/опасные пути** — path traversal (`..`), абсолютные пути/буква диска, пустые сегменты, управляющие
|
|
188
|
+
символы, дубликаты, коллизии регистра, конфликт «файл и каталог», сегменты с точкой/пробелом на конце,
|
|
189
|
+
длинные пути; обратные слэши определяются как стиль упаковщика (одно предупреждение, не 90).
|
|
190
|
+
6. **Секреты** в текстовых файлах: `sk-…`, `gh*_…`, `AKIA/ASIA…`, `AIza…`, `xox…`, `npm_…`, приватные ключи.
|
|
191
|
+
Найденное **маскируется** в отчёте; заглушки/примеры (`sk-xxx`, `<...>`, `example`) игнорируются.
|
|
192
|
+
7. **Размеры и sha256** — размер архива, `sha256` ZIP, `content-sha256` (хеш по содержимому файлов) и топ-5
|
|
193
|
+
крупнейших файлов. `content-sha256` для каталога и ZIP с тем же содержимым **совпадает** — удобный инвариант
|
|
194
|
+
при пересборке.
|
|
195
|
+
|
|
196
|
+
Коды выхода: `0` — OK (могут быть предупреждения); `1` — FAIL (есть ошибки); `2` — не удалось прочитать
|
|
197
|
+
входные данные/неверные аргументы. Предупреждения не блокируют приёмку.
|
|
198
|
+
|
|
199
|
+
Примеры:
|
|
200
|
+
|
|
201
|
+
```powershell
|
|
202
|
+
# Каталог сборки
|
|
203
|
+
node tools/design-qa/validate-package.mjs tmp/package-build/dsh-portable-2026-11-04-dry
|
|
204
|
+
|
|
205
|
+
# Готовый ZIP + сверка sha256 с SHA256SUMS.txt
|
|
206
|
+
node tools/design-qa/validate-package.mjs dist/dsh-portable-2026-11-04-dry.zip
|
|
207
|
+
Get-Content dist/SHA256SUMS.txt # sha256 архива должен совпасть
|
|
208
|
+
|
|
209
|
+
# Машиночитаемый результат
|
|
210
|
+
node tools/design-qa/validate-package.mjs dist/dsh-portable-2026-11-04-dry.zip --json
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
Проверено на реальных артефактах:
|
|
214
|
+
|
|
215
|
+
- `%USERPROFILE%\Downloads\dsh-portable-2026-11-03.zip` — **OK**, 15 скиллов, 94 файла;
|
|
216
|
+
- `tmp/package-build/dsh-portable-2026-11-04-dry` (каталог) — **OK**, 17 скиллов (включая `wow-design`,
|
|
217
|
+
`design-critique`), 289 файлов, 0 ошибок/предупреждений;
|
|
218
|
+
- `dist/dsh-portable-2026-11-04-dry.zip` — **OK**, sha256 совпал с `dist/SHA256SUMS.txt`
|
|
219
|
+
(`3e5480d7…e35fd8`), `content-sha256` совпал с каталогом (`ea12c490…38f999`);
|
|
220
|
+
- fixtures с намеренными нарушениями — **FAIL** (см. ниже).
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## Фикстуры и самопроверка инструментов
|
|
225
|
+
|
|
226
|
+
```
|
|
227
|
+
tools/design-qa/fixtures/
|
|
228
|
+
test.html # эталонная страница: без нарушений (обе темы, reveal, lazy, таблица)
|
|
229
|
+
broken.html # страница с намеренными нарушениями (для негативного теста audit)
|
|
230
|
+
package-ok/ # валидный мини-пакет (генерируется)
|
|
231
|
+
package-bad/ # пакет с ошибками (генерируется)
|
|
232
|
+
make-fixtures.mjs # пересоздаёт package-ok / package-bad
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
Регрессионная проверка инструментов (ожидаемые результаты):
|
|
236
|
+
|
|
237
|
+
```powershell
|
|
238
|
+
cd %USERPROFILE%\Documents\deepseek-harness\default-workspace
|
|
239
|
+
|
|
240
|
+
# 0) фикстуры пакетов
|
|
241
|
+
node tools/design-qa/fixtures/make-fixtures.mjs
|
|
242
|
+
|
|
243
|
+
# 1) capture: 6/6 скриншотов, exit 0
|
|
244
|
+
node tools/design-qa/capture.mjs tools/design-qa/fixtures/test.html --name fixture
|
|
245
|
+
|
|
246
|
+
# 2) audit эталона: PASS, exit 0
|
|
247
|
+
node tools/design-qa/audit.mjs tools/design-qa/fixtures/test.html --name fixture-test
|
|
248
|
+
|
|
249
|
+
# 3) audit «плохой» страницы: FAIL, exit 2 (color-contrast, image-alt, button-name, overflow, pageerror…)
|
|
250
|
+
node tools/design-qa/audit.mjs tools/design-qa/fixtures/broken.html --name fixture-broken
|
|
251
|
+
|
|
252
|
+
# 4) валидатор пакета: OK, exit 0
|
|
253
|
+
node tools/design-qa/validate-package.mjs tools/design-qa/fixtures/package-ok
|
|
254
|
+
|
|
255
|
+
# 5) валидатор «плохого» пакета: FAIL, exit 1
|
|
256
|
+
node tools/design-qa/validate-package.mjs tools/design-qa/fixtures/package-bad
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
Дополнительно проверены: обрезанный ZIP (exit 2 + понятная ошибка), ZIP с `../`/дублями/конфликтами
|
|
260
|
+
(FAIL с кодами `PATH_INVALID`, `PATH_CONFLICT`), секреты в тексте (маскируются).
|
|
261
|
+
|
|
262
|
+
---
|
|
263
|
+
|
|
264
|
+
## CDP и браузер: детали
|
|
265
|
+
|
|
266
|
+
- По умолчанию `capture/audit` подключаются к `http://127.0.0.1:9333` (env `CDP_URL` или `--cdp`).
|
|
267
|
+
- Чужой Chrome **не перезапускается и не закрывается**: соединение открывается/закрывается, вкладки закрываются,
|
|
268
|
+
браузер продолжает работать для других агентов.
|
|
269
|
+
- Если CDP недоступен, инструмент запускает свой headless Chromium (`ms-playwright/chromium-*/chrome-win64/chrome.exe`,
|
|
270
|
+
путь можно задать `CHROME_PATH`) с временным профилем и свободным портом. Временный профиль удаляется.
|
|
271
|
+
- При ошибке «Не найден chrome.exe» — задайте `CHROME_PATH` или запустите Chrome с `--remote-debugging-port=9333`.
|
|
272
|
+
- `--serve` поднимает локальный статический HTTP-сервер (корень — текущий каталог, случайный порт) — это решает
|
|
273
|
+
проблему ES-модулей и XHR с `file://`, но для обычных «двойной клик по html» страниц не нужен.
|
|
274
|
+
|
|
275
|
+
## Ограничения и предостережения
|
|
276
|
+
|
|
277
|
+
- **Скриншоты и отчёты могут содержать данные со страницы** (текст, HTML-фрагменты). `tmp/qa-artifacts/` — рабочая
|
|
278
|
+
зона, не коммитить в git и не выкладывать наружу.
|
|
279
|
+
- `file://` + `<script type="module">`/`fetch`/XHR — браузер блокирует; для таких страниц используйте `--serve`
|
|
280
|
+
(или не используйте модули в «открываемых двойным кликом» страницах).
|
|
281
|
+
- Очень длинные страницы при `--dpr 2` могут упираться в лимиты CDP — инструмент автоматически откатывается на
|
|
282
|
+
`scale: css`, затем на видимую часть (это фиксируется в `shots.json` → `note`).
|
|
283
|
+
- ZIP-валидатор поддерживает обычные ZIP (store/deflate). **ZIP64 и зашифрованные архивы не поддерживаются**
|
|
284
|
+
(для пакета DSH не нужны) — выдаётся понятная ошибка.
|
|
285
|
+
- Проверка секретов — эвристика по регулярным выражениям и может давать ложные срабатывания/пропуски;
|
|
286
|
+
она не заменяет нормальный secret-scanning в CI.
|
|
287
|
+
- `audit` эмулирует `prefers-reduced-motion: reduce` (стабильные скриншоты + проверка reduced-motion ветки).
|
|
288
|
+
Для проверки «как с анимациями» добавьте `--motion` (не документирован в help, но поддерживается).
|
|
289
|
+
- Инструменты рассчитаны на Chromium (Chrome/Edge). Firefox/WebKit не проверялись.
|
|
290
|
+
|
|
291
|
+
## Состав каталога
|
|
292
|
+
|
|
293
|
+
```
|
|
294
|
+
tools/design-qa/
|
|
295
|
+
capture.mjs # скриншоты
|
|
296
|
+
audit.mjs # axe + кастомные проверки
|
|
297
|
+
validate-package.mjs # валидатор портативного пакета DSH
|
|
298
|
+
lib/args.mjs # мини-парсер CLI
|
|
299
|
+
lib/browser.mjs # CDP/fallback, viewport/темы, подготовка страницы, статический сервер
|
|
300
|
+
lib/zip.mjs # ZIP-ридер (store/deflate + CRC32) без внешних зависимостей
|
|
301
|
+
fixtures/ # тестовые страницы и пакеты + make-fixtures.mjs
|
|
302
|
+
README.md # этот файл
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
## Петля WOW-дизайна (как встроить в работу)
|
|
306
|
+
|
|
307
|
+
1. Сверстал страницу → `capture.mjs` (desktop/tablet/mobile × light/dark).
|
|
308
|
+
2. Посмотрел PNG глазами (`read_image`) → критика по рубрике (`tmp/design-research/04-critique-rubric.md`).
|
|
309
|
+
3. Исправил → `capture.mjs` снова (минимум 2 итерации, зафиксировать, что исправлено).
|
|
310
|
+
4. `audit.mjs` перед сдачей: цель — `critical = 0`, `serious = 0`, нет overflow на 390, `fonts.status = loaded`,
|
|
311
|
+
нет ошибок консоли.
|
|
312
|
+
5. Валидатор пакета — после сборки архива: `OK` + сверка `sha256` с `SHA256SUMS.txt`.
|