feat: разворачивание комка design-plugin — 7 навыков (роутер-реестр)

Эпик роутер-реестр, спека v2 §2, этап 1. Зонтик design-plugin развёрнут
в 7 карточек-навыков + 7 под-узлов #46a..#46g. Контракт раньше описывал
лишь 3 из 7 реальных навыков — теперь покрыты все.

- 7 карточек: accessibility-review, design-critique, design-handoff,
  design-system, research-synthesis, user-research, ux-copy
- nodes.yaml: узел #46 → #46a..#46g; триггеры (дизайн-критика→critique,
  ux-копирайт→ux-copy, research synthesis→research-synthesis)
- зонтик убран; registry-load.test: 123 узла / 115 active

Регрессия (без 5 pre-existing node:test файлов): 4365 passed, exit 0.
(askuser-cosmetic-escape-exempt флакает под параллелизмом — изолированно зелёный, не связан.)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Дмитрий
2026-06-18 23:18:20 +03:00
parent 0258b9d2a7
commit bf3d557cce
11 changed files with 302 additions and 27 deletions
@@ -1,12 +0,0 @@
{
"skill": "design-plugin",
"kind": "external",
"needs": ["дизайн-вопрос pre-code (критика / UX-копирайт / research synthesis)"],
"produces": ["дизайн-критика / UX-копирайт / research synthesis"],
"constraints": ["pre-code; a11y-принципы дизайн-уровня", "технический a11y SoT — Pa11y (#9)"],
"preview-form": "none",
"defaults": ["до написания кода"],
"key-decisions": ["критика, копирайт или synthesis"],
"acceptance-criteria": ["дизайн-замечания/копирайт учтены до кода"],
"source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" }
}
@@ -0,0 +1,29 @@
{
"skill": "design-plugin:accessibility-review",
"kind": "external",
"needs": [
"дизайн/страница для аудита доступности"
],
"produces": [
"WCAG 2.1 AA аудит: контраст, клавиатура, тач-таргеты, screen reader"
],
"constraints": [
"под-навык зонтика design-plugin (дизайн до кода)",
"a11y-принципы дизайн-уровня; технический a11y SoT — Pa11y #9"
],
"preview-form": "outline",
"defaults": [
"accessibility-review — дизайн-уровень a11y (не Pa11y)"
],
"key-decisions": [
"какие WCAG-критерии под риском"
],
"acceptance-criteria": [
"аудит a11y покрывает ключевые критерии"
],
"source": {
"version": "n/a",
"hash": "0000000000000000000000000000000000000000000000000000000000000000",
"path": ""
}
}
@@ -0,0 +1,29 @@
{
"skill": "design-plugin:design-critique",
"kind": "external",
"needs": [
"макет/экран для структурной обратной связи"
],
"produces": [
"критика: usability, иерархия, консистентность"
],
"constraints": [
"под-навык зонтика design-plugin (дизайн до кода)",
"a11y-принципы дизайн-уровня; технический a11y SoT — Pa11y #9"
],
"preview-form": "outline",
"defaults": [
"design-critique — структурный разбор дизайна"
],
"key-decisions": [
"главные проблемы юзабилити"
],
"acceptance-criteria": [
"критика структурна и actionable"
],
"source": {
"version": "n/a",
"hash": "0000000000000000000000000000000000000000000000000000000000000000",
"path": ""
}
}
@@ -0,0 +1,29 @@
{
"skill": "design-plugin:design-handoff",
"kind": "external",
"needs": [
"готовый дизайн для передачи в разработку"
],
"produces": [
"спека хэндоффа: токены, props, состояния, breakpoints, edge-cases"
],
"constraints": [
"под-навык зонтика design-plugin (дизайн до кода)",
"a11y-принципы дизайн-уровня; технический a11y SoT — Pa11y #9"
],
"preview-form": "outline",
"defaults": [
"design-handoff — dev-спека из дизайна"
],
"key-decisions": [
"какие состояния и edge-cases"
],
"acceptance-criteria": [
"хэндофф покрывает layout/токены/состояния"
],
"source": {
"version": "n/a",
"hash": "0000000000000000000000000000000000000000000000000000000000000000",
"path": ""
}
}
@@ -0,0 +1,29 @@
{
"skill": "design-plugin:design-system",
"kind": "external",
"needs": [
"дизайн-система для аудита/документации/расширения"
],
"produces": [
"аудит консистентности / документация компонента / новый паттерн"
],
"constraints": [
"под-навык зонтика design-plugin (дизайн до кода)",
"a11y-принципы дизайн-уровня; технический a11y SoT — Pa11y #9"
],
"preview-form": "outline",
"defaults": [
"design-system — ведение дизайн-системы"
],
"key-decisions": [
"naming и hardcoded-значения"
],
"acceptance-criteria": [
"система консистентна и задокументирована"
],
"source": {
"version": "n/a",
"hash": "0000000000000000000000000000000000000000000000000000000000000000",
"path": ""
}
}
@@ -0,0 +1,29 @@
{
"skill": "design-plugin:research-synthesis",
"kind": "external",
"needs": [
"сырой research (интервью/тесты/тикеты/NPS)"
],
"produces": [
"темы, инсайты, сегменты, приоритеты"
],
"constraints": [
"под-навык зонтика design-plugin (дизайн до кода)",
"a11y-принципы дизайн-уровня; технический a11y SoT — Pa11y #9"
],
"preview-form": "outline",
"defaults": [
"research-synthesis — дистилляция research в паттерны"
],
"key-decisions": [
"доминирующие темы и сегменты"
],
"acceptance-criteria": [
"research сведён в приоритезированные инсайты"
],
"source": {
"version": "n/a",
"hash": "0000000000000000000000000000000000000000000000000000000000000000",
"path": ""
}
}
@@ -0,0 +1,29 @@
{
"skill": "design-plugin:user-research",
"kind": "external",
"needs": [
"потребность понять пользователей"
],
"produces": [
"план/гайд интервью, юзабилити-тест, опрос"
],
"constraints": [
"под-навык зонтика design-plugin (дизайн до кода)",
"a11y-принципы дизайн-уровня; технический a11y SoT — Pa11y #9"
],
"preview-form": "outline",
"defaults": [
"user-research — планирование и проведение исследований"
],
"key-decisions": [
"метод и вопросы исследования"
],
"acceptance-criteria": [
"research спланирован и синтезируем"
],
"source": {
"version": "n/a",
"hash": "0000000000000000000000000000000000000000000000000000000000000000",
"path": ""
}
}
@@ -0,0 +1,29 @@
{
"skill": "design-plugin:ux-copy",
"kind": "external",
"needs": [
"элемент интерфейса, требующий текста"
],
"produces": [
"UX-копирайт: microcopy, ошибки, пустые состояния, CTA"
],
"constraints": [
"под-навык зонтика design-plugin (дизайн до кода)",
"a11y-принципы дизайн-уровня; технический a11y SoT — Pa11y #9"
],
"preview-form": "outline",
"defaults": [
"ux-copy — микротексты интерфейса"
],
"key-decisions": [
"тон и формулировка под контекст"
],
"acceptance-criteria": [
"копирайт ясен и соответствует тону"
],
"source": {
"version": "n/a",
"hash": "0000000000000000000000000000000000000000000000000000000000000000",
"path": ""
}
}
+92 -8
View File
@@ -1147,18 +1147,15 @@ nodes:
tooling_section: "§4.20 #45"
install: "npx -y mcp-universal-icons (в .mcp.json)"
- id: "#46"
name: "Design plugin"
slug: "design-plugin"
- id: "#46a"
name: "accessibility-review"
slug: "design-plugin:accessibility-review"
category: "off-phase"
subcategory: "design-tooling"
status: "active"
dormancy_reason: null
capabilities: "Плагин для дизайн-критики, UX-копирайтинга и research synthesis на стадии до написания кода; a11y-принципы дизайн-уровня (технический SoT остаётся за Pa11y #9)."
triggers:
- {keyword: "дизайн-критика", weight: 1.0}
- {keyword: "ux-копирайт", weight: 1.0}
- {keyword: "research synthesis", weight: 1.0}
capabilities: "WCAG 2.1 AA аудит дизайна (контраст, клавиатура, тач-таргеты, screen reader). Дизайн-уровень; технический a11y SoT — Pa11y #9."
triggers: []
boundaries:
- {relation: "pre-code; Pa11y остаётся a11y SoT"}
chain_membership: []
@@ -1166,6 +1163,93 @@ nodes:
tooling_section: "§4.21 #46"
install: "claude plugin install design@knowledge-work-plugins"
- id: "#46b"
name: "design-critique"
slug: "design-plugin:design-critique"
category: "off-phase"
subcategory: "design-tooling"
status: "active"
dormancy_reason: null
capabilities: "Структурная критика дизайна: usability, иерархия, консистентность."
triggers:
- {keyword: "дизайн-критика", weight: 1.0}
boundaries: []
chain_membership: []
attributes:
tooling_section: "§4.21 #46"
- id: "#46c"
name: "design-handoff"
slug: "design-plugin:design-handoff"
category: "off-phase"
subcategory: "design-tooling"
status: "active"
dormancy_reason: null
capabilities: "Dev-спека из дизайна: токены, props, состояния, breakpoints, edge-cases, анимация."
triggers: []
boundaries: []
chain_membership: []
attributes:
tooling_section: "§4.21 #46"
- id: "#46d"
name: "design-system"
slug: "design-plugin:design-system"
category: "off-phase"
subcategory: "design-tooling"
status: "active"
dormancy_reason: null
capabilities: "Аудит/документация/расширение дизайн-системы (naming, hardcoded-значения, новый паттерн)."
triggers: []
boundaries: []
chain_membership: []
attributes:
tooling_section: "§4.21 #46"
- id: "#46e"
name: "design-research-synthesis"
slug: "design-plugin:research-synthesis"
category: "off-phase"
subcategory: "design-tooling"
status: "active"
dormancy_reason: null
capabilities: "Синтез research (интервью/тесты/тикеты/NPS) в темы, инсайты, сегменты, приоритеты."
triggers:
- {keyword: "research synthesis", weight: 1.0}
boundaries: []
chain_membership: []
attributes:
tooling_section: "§4.21 #46"
- id: "#46f"
name: "user-research"
slug: "design-plugin:user-research"
category: "off-phase"
subcategory: "design-tooling"
status: "active"
dormancy_reason: null
capabilities: "Планирование и проведение user research: гайд интервью, юзабилити-тест, опрос."
triggers: []
boundaries: []
chain_membership: []
attributes:
tooling_section: "§4.21 #46"
- id: "#46g"
name: "ux-copy"
slug: "design-plugin:ux-copy"
category: "off-phase"
subcategory: "design-tooling"
status: "active"
dormancy_reason: null
capabilities: "UX-копирайт: microcopy, ошибки, пустые состояния, CTA."
triggers:
- {keyword: "ux-копирайт", weight: 1.0}
boundaries: []
chain_membership: []
attributes:
tooling_section: "§4.21 #46"
- id: "#47"
name: "openapi-mcp-server"
slug: "openapi-mcp"
+2 -2
View File
@@ -115,8 +115,8 @@
| plugin-dev (7) | ✅ DONE | ded5372 (pushed) |
| adr-kit (2: adr, judge) | ✅ DONE | f01f5b8 (pushed) |
| hookify (1–2) | ⏸ развилка владельцу (slug hookify:hookify кривой) | |
| product-management (8) | ✅ DONE | этот коммит |
| design-plugin (7) | ⬜ | |
| product-management (8) | ✅ DONE | 0258b9d (pushed) |
| design-plugin (7) | ✅ DONE | этот коммит |
| marketing-plugin (8) | ⬜ | |
| operations (8) | ⬜ | |
| finance-plugin (78) | ⬜ | |
+5 -5
View File
@@ -5,9 +5,9 @@ import { loadRegistry, clearCache, findByClassification, findByKeyword, findActi
describe('registry-load', () => {
beforeEach(() => clearCache());
it('loads registry (117 nodes: разворачивание #33/#19/#57/#36/#42 комков 18.06.2026)', () => {
it('loads registry (123 nodes: разворачивание #33/#19/#57/#36/#42/#46 комков 18.06.2026)', () => {
const r = loadRegistry();
expect(r.nodes).toHaveLength(117);
expect(r.nodes).toHaveLength(123);
expect(r.version).toBe('0.1.0');
});
@@ -46,9 +46,9 @@ describe('registry-load', () => {
it('findActiveNodes excludes non-active (nodes.yaml registry)', () => {
const r = loadRegistry();
const active = findActiveNodes(r);
// 117 nodes total; #1 historic, #17 dormant, #44/#50/#54/#67/#82/#83 deferred;
// развёрнуты комки: #33→2, #19→14, #57→7, #36→2, #42 pm→8 (active +1+13+6+1+7) → 109 active
expect(active).toHaveLength(109);
// 123 nodes total; #1 historic, #17 dormant, #44/#50/#54/#67/#82/#83 deferred;
// развёрнуты: #33→2, #19→14, #57→7, #36→2, #42→8, #46 design→7 (active +...+6) → 115 active
expect(active).toHaveLength(115);
expect(active.map(n => n.id)).toContain('#18');
expect(active.map(n => n.id)).toContain('#19a');
expect(active.map(n => n.id)).not.toContain('#1');