From 524bcfd05fdbec89cff482342d74c05b8ddac5af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Fri, 19 Jun 2026 04:35:14 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D1=80=D0=B0=D0=B7=D0=B2=D0=BE=D1=80?= =?UTF-8?q?=D0=B0=D1=87=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BC=D0=BA=D0=B0=20ui-ux-pro-max=20=E2=80=94=207=20=D0=BD?= =?UTF-8?q?=D0=B0=D0=B2=D1=8B=D0=BA=D0=BE=D0=B2=20(=D1=80=D0=BE=D1=83?= =?UTF-8?q?=D1=82=D0=B5=D1=80-=D1=80=D0=B5=D0=B5=D1=81=D1=82=D1=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Эпик роутер-реестр, спека v2 §2, этап 1. Решение владельца 19.06 (путь 2): зонтик ui-ux-pro-max развёрнут в 7 карточек-навыков + 7 под-узлов #31a..#31g. Роль сохранена в каждой карточке: материал/решение по UI → стек Vue+Vuetify (R6.0), финальный код — Frontend Design #30. - 7 карточек: banner-design, brand, design, design-system, slides, ui-styling, ui-ux-pro-max (master) - nodes.yaml: узел #31 → #31a..#31g; мастер #31g держит конфликт-треугольник (frontend-design ↔ 21st-magic); обратные ссылки у #30/#32 перенаправлены на ui-ux-pro-max:ui-ux-pro-max → симметрия конфликтов сохранена (m3e зелёный) - зонтик убран; registry-load.test: 153 узла / 145 active - hookify оставлен одной карточкой (решение владельца) Правка PSR (роль UPM: материал → решатель-с-ограничением) — отдельным шагом. Регрессия (без 5 pre-existing node:test файлов): 4365 passed, exit 0. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../contracts/ui-ux-pro-max.contract.json | 12 --- ...ui-ux-pro-max__banner-design.contract.json | 29 +++++ .../ui-ux-pro-max__brand.contract.json | 29 +++++ ...ui-ux-pro-max__design-system.contract.json | 29 +++++ .../ui-ux-pro-max__design.contract.json | 29 +++++ .../ui-ux-pro-max__slides.contract.json | 29 +++++ .../ui-ux-pro-max__ui-styling.contract.json | 29 +++++ ...ui-ux-pro-max__ui-ux-pro-max.contract.json | 29 +++++ docs/registry/nodes.yaml | 100 ++++++++++++++++-- docs/registry/splitting-inventory.md | 4 +- tools/registry-load.test.mjs | 10 +- 11 files changed, 302 insertions(+), 27 deletions(-) delete mode 100644 docs/registry/contracts/ui-ux-pro-max.contract.json create mode 100644 docs/registry/contracts/ui-ux-pro-max__banner-design.contract.json create mode 100644 docs/registry/contracts/ui-ux-pro-max__brand.contract.json create mode 100644 docs/registry/contracts/ui-ux-pro-max__design-system.contract.json create mode 100644 docs/registry/contracts/ui-ux-pro-max__design.contract.json create mode 100644 docs/registry/contracts/ui-ux-pro-max__slides.contract.json create mode 100644 docs/registry/contracts/ui-ux-pro-max__ui-styling.contract.json create mode 100644 docs/registry/contracts/ui-ux-pro-max__ui-ux-pro-max.contract.json diff --git a/docs/registry/contracts/ui-ux-pro-max.contract.json b/docs/registry/contracts/ui-ux-pro-max.contract.json deleted file mode 100644 index eaec46e..0000000 --- a/docs/registry/contracts/ui-ux-pro-max.contract.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "skill": "ui-ux-pro-max", - "kind": "external", - "needs": ["UI-задача, требующая материала (стиль / палитра / UX-гайд / график)"], - "produces": ["UI-материалы: стили, палитры, UX-гайдлайны, паттерны графиков"], - "constraints": ["материал, не решатель; только через PSR_v1 R14.3 pipeline", "не параллельно с Frontend Design (#30)"], - "preview-form": "none", - "defaults": ["активация только через R14.3 pipeline"], - "key-decisions": ["какой материал нужен под задачу"], - "acceptance-criteria": ["материал отобран, решение принимает Frontend Design"], - "source": { "version": "n/a", "hash": "0000000000000000000000000000000000000000000000000000000000000000", "path": "" } -} diff --git a/docs/registry/contracts/ui-ux-pro-max__banner-design.contract.json b/docs/registry/contracts/ui-ux-pro-max__banner-design.contract.json new file mode 100644 index 0000000..7d0676b --- /dev/null +++ b/docs/registry/contracts/ui-ux-pro-max__banner-design.contract.json @@ -0,0 +1,29 @@ +{ + "skill": "ui-ux-pro-max:banner-design", + "kind": "external", + "needs": [ + "задача дизайна баннера" + ], + "produces": [ + "дизайн баннера (стек → Vue+Vuetify; код — Frontend Design)" + ], + "constraints": [ + "UI-навык пула ui-ux-pro-max", + "стек приводить к Vue 3 + Vuetify 3 (PSR R6.0); финальный код — Frontend Design #30; не параллельно с FD" + ], + "preview-form": "outline", + "defaults": [ + "banner-design — баннеры из пула UPM" + ], + "key-decisions": [ + "формат и стиль баннера" + ], + "acceptance-criteria": [ + "баннер согласован, стек приведён к Vue" + ], + "source": { + "version": "n/a", + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "path": "" + } +} diff --git a/docs/registry/contracts/ui-ux-pro-max__brand.contract.json b/docs/registry/contracts/ui-ux-pro-max__brand.contract.json new file mode 100644 index 0000000..52a368a --- /dev/null +++ b/docs/registry/contracts/ui-ux-pro-max__brand.contract.json @@ -0,0 +1,29 @@ +{ + "skill": "ui-ux-pro-max:brand", + "kind": "external", + "needs": [ + "задача бренд-системы UI" + ], + "produces": [ + "бренд-система: палитра, типографика (приводится к нашему стеку)" + ], + "constraints": [ + "UI-навык пула ui-ux-pro-max", + "стек приводить к Vue 3 + Vuetify 3 (PSR R6.0); финальный код — Frontend Design #30; не параллельно с FD" + ], + "preview-form": "outline", + "defaults": [ + "brand — бренд-система из пула UPM" + ], + "key-decisions": [ + "палитра и типографика" + ], + "acceptance-criteria": [ + "бренд-система согласована" + ], + "source": { + "version": "n/a", + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "path": "" + } +} diff --git a/docs/registry/contracts/ui-ux-pro-max__design-system.contract.json b/docs/registry/contracts/ui-ux-pro-max__design-system.contract.json new file mode 100644 index 0000000..6d6ceab --- /dev/null +++ b/docs/registry/contracts/ui-ux-pro-max__design-system.contract.json @@ -0,0 +1,29 @@ +{ + "skill": "ui-ux-pro-max:design-system", + "kind": "external", + "needs": [ + "задача дизайн-системы (токены/компоненты)" + ], + "produces": [ + "токены и компоненты дизайн-системы (под Vue+Vuetify)" + ], + "constraints": [ + "UI-навык пула ui-ux-pro-max", + "стек приводить к Vue 3 + Vuetify 3 (PSR R6.0); финальный код — Frontend Design #30; не параллельно с FD" + ], + "preview-form": "outline", + "defaults": [ + "design-system — токены и компоненты из пула UPM" + ], + "key-decisions": [ + "токены и состав компонентов" + ], + "acceptance-criteria": [ + "дизайн-система под наш стек" + ], + "source": { + "version": "n/a", + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "path": "" + } +} diff --git a/docs/registry/contracts/ui-ux-pro-max__design.contract.json b/docs/registry/contracts/ui-ux-pro-max__design.contract.json new file mode 100644 index 0000000..d92087c --- /dev/null +++ b/docs/registry/contracts/ui-ux-pro-max__design.contract.json @@ -0,0 +1,29 @@ +{ + "skill": "ui-ux-pro-max:design", + "kind": "external", + "needs": [ + "унифицированная UI-дизайн-задача" + ], + "produces": [ + "UI-дизайн (50+ стилей; стек → Vue+Vuetify; код — Frontend Design)" + ], + "constraints": [ + "UI-навык пула ui-ux-pro-max", + "стек приводить к Vue 3 + Vuetify 3 (PSR R6.0); финальный код — Frontend Design #30; не параллельно с FD" + ], + "preview-form": "outline", + "defaults": [ + "design — унифицированный дизайн из пула UPM" + ], + "key-decisions": [ + "стиль и продукт-тип" + ], + "acceptance-criteria": [ + "дизайн согласован, стек приведён к Vue" + ], + "source": { + "version": "n/a", + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "path": "" + } +} diff --git a/docs/registry/contracts/ui-ux-pro-max__slides.contract.json b/docs/registry/contracts/ui-ux-pro-max__slides.contract.json new file mode 100644 index 0000000..70a7cd6 --- /dev/null +++ b/docs/registry/contracts/ui-ux-pro-max__slides.contract.json @@ -0,0 +1,29 @@ +{ + "skill": "ui-ux-pro-max:slides", + "kind": "external", + "needs": [ + "задача стратегической презентации" + ], + "produces": [ + "стратегические слайды/презентация" + ], + "constraints": [ + "UI-навык пула ui-ux-pro-max", + "стек приводить к Vue 3 + Vuetify 3 (PSR R6.0); финальный код — Frontend Design #30; не параллельно с FD" + ], + "preview-form": "outline", + "defaults": [ + "slides — презентации из пула UPM" + ], + "key-decisions": [ + "структура и нарратив слайдов" + ], + "acceptance-criteria": [ + "презентация согласована" + ], + "source": { + "version": "n/a", + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "path": "" + } +} diff --git a/docs/registry/contracts/ui-ux-pro-max__ui-styling.contract.json b/docs/registry/contracts/ui-ux-pro-max__ui-styling.contract.json new file mode 100644 index 0000000..e5aa4ca --- /dev/null +++ b/docs/registry/contracts/ui-ux-pro-max__ui-styling.contract.json @@ -0,0 +1,29 @@ +{ + "skill": "ui-ux-pro-max:ui-styling", + "kind": "external", + "needs": [ + "задача стилизации UI" + ], + "produces": [ + "стилизация UI (источник shadcn/Tailwind → ОБЯЗАТЕЛЬНО приводится к Vue+Vuetify)" + ], + "constraints": [ + "UI-навык пула ui-ux-pro-max", + "стек приводить к Vue 3 + Vuetify 3 (PSR R6.0); финальный код — Frontend Design #30; не параллельно с FD" + ], + "preview-form": "outline", + "defaults": [ + "ui-styling — стилизация из пула UPM, фильтр стека R6.0" + ], + "key-decisions": [ + "как срезать React/Tailwind в Vue+Vuetify" + ], + "acceptance-criteria": [ + "стилизация переведена в наш стек" + ], + "source": { + "version": "n/a", + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "path": "" + } +} diff --git a/docs/registry/contracts/ui-ux-pro-max__ui-ux-pro-max.contract.json b/docs/registry/contracts/ui-ux-pro-max__ui-ux-pro-max.contract.json new file mode 100644 index 0000000..cc70d68 --- /dev/null +++ b/docs/registry/contracts/ui-ux-pro-max__ui-ux-pro-max.contract.json @@ -0,0 +1,29 @@ +{ + "skill": "ui-ux-pro-max:ui-ux-pro-max", + "kind": "external", + "needs": [ + "широкая UI/UX-задача (выбор стиля/палитры/чарта)" + ], + "produces": [ + "UI/UX-решение: 50+ стилей, 161 палитра, 57 пар шрифтов, 25 типов чартов (стек → Vue+Vuetify)" + ], + "constraints": [ + "UI-навык пула ui-ux-pro-max", + "стек приводить к Vue 3 + Vuetify 3 (PSR R6.0); финальный код — Frontend Design #30; не параллельно с FD" + ], + "preview-form": "outline", + "defaults": [ + "ui-ux-pro-max — мастер-навык пула UPM" + ], + "key-decisions": [ + "какой стиль/палитра/чарт под задачу" + ], + "acceptance-criteria": [ + "решение согласовано, стек приведён к Vue, код — Frontend Design" + ], + "source": { + "version": "n/a", + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "path": "" + } +} diff --git a/docs/registry/nodes.yaml b/docs/registry/nodes.yaml index 562c0b3..91d3e3f 100644 --- a/docs/registry/nodes.yaml +++ b/docs/registry/nodes.yaml @@ -720,24 +720,108 @@ nodes: attributes: tooling_section: "§4.4 #30" install: "enabledPlugins.frontend-design@anthropics-claude-plugins в ~/.claude/settings.json" - conflicts_with: ["ui-ux-pro-max", "21st-magic"] + conflicts_with: ["ui-ux-pro-max:ui-ux-pro-max", "21st-magic"] - - id: "#31" - name: "UI UX Pro Max" - slug: "ui-ux-pro-max" + - id: "#31a" + name: "uiux-banner-design" + slug: "ui-ux-pro-max:banner-design" category: "off-phase" subcategory: "UI-pool" status: "active" dormancy_reason: null - capabilities: "Резервная библиотека UI-материалов: стили, цветовые палитры, UX-гайдлайны, паттерны графиков и визуализаций; активируется только через PSR_v1 R14.3 pipeline как материал, не решатель." + capabilities: "Дизайн баннеров из пула UPM (стек → Vue+Vuetify; финальный код — Frontend Design)." + triggers: [] + boundaries: [] + chain_membership: [] + attributes: + tooling_section: "§4.5 #31" + + - id: "#31b" + name: "uiux-brand" + slug: "ui-ux-pro-max:brand" + category: "off-phase" + subcategory: "UI-pool" + status: "active" + dormancy_reason: null + capabilities: "Бренд-система UI: палитра, типографика (приводится к нашему стеку)." + triggers: [] + boundaries: [] + chain_membership: [] + attributes: + tooling_section: "§4.5 #31" + + - id: "#31c" + name: "uiux-design" + slug: "ui-ux-pro-max:design" + category: "off-phase" + subcategory: "UI-pool" + status: "active" + dormancy_reason: null + capabilities: "Унифицированный UI-дизайн (50+ стилей; стек → Vue+Vuetify; код — Frontend Design)." + triggers: [] + boundaries: [] + chain_membership: [] + attributes: + tooling_section: "§4.5 #31" + + - id: "#31d" + name: "uiux-design-system" + slug: "ui-ux-pro-max:design-system" + category: "off-phase" + subcategory: "UI-pool" + status: "active" + dormancy_reason: null + capabilities: "Токены и компоненты дизайн-системы (под Vue+Vuetify)." + triggers: [] + boundaries: [] + chain_membership: [] + attributes: + tooling_section: "§4.5 #31" + + - id: "#31e" + name: "uiux-slides" + slug: "ui-ux-pro-max:slides" + category: "off-phase" + subcategory: "UI-pool" + status: "active" + dormancy_reason: null + capabilities: "Стратегические презентации/слайды из пула UPM." + triggers: [] + boundaries: [] + chain_membership: [] + attributes: + tooling_section: "§4.5 #31" + + - id: "#31f" + name: "uiux-ui-styling" + slug: "ui-ux-pro-max:ui-styling" + category: "off-phase" + subcategory: "UI-pool" + status: "active" + dormancy_reason: null + capabilities: "Стилизация UI (источник shadcn/Tailwind ОБЯЗАТЕЛЬНО приводится к Vue+Vuetify, фильтр стека R6.0)." + triggers: + - {keyword: "стили", weight: 1.0} + boundaries: [] + chain_membership: [] + attributes: + tooling_section: "§4.5 #31" + + - id: "#31g" + name: "ui-ux-pro-max-master" + slug: "ui-ux-pro-max:ui-ux-pro-max" + category: "off-phase" + subcategory: "UI-pool" + status: "active" + dormancy_reason: null + capabilities: "Мастер-навык пула UPM: 50+ стилей, 161 палитра, 57 пар шрифтов, 25 типов чартов; стек → Vue+Vuetify, финальный код — Frontend Design." triggers: - {keyword: "резерв ui", weight: 1.0} - - {keyword: "стили", weight: 1.0} - {keyword: "палитры", weight: 1.0} - {keyword: "графики", weight: 1.0} - {keyword: "ux-гайдлайны", weight: 1.0} boundaries: - - {relation: "PSR_v1 R14.3 pipeline"} + - {relation: "PSR_v1 R14.3 pipeline; стек R6.0; решатель кода — Frontend Design"} chain_membership: [] attributes: tooling_section: "§4.5 #31" @@ -758,7 +842,7 @@ nodes: chain_membership: [] attributes: tooling_section: "§4.6 #32" - conflicts_with: ["frontend-design", "ui-ux-pro-max"] + conflicts_with: ["frontend-design", "ui-ux-pro-max:ui-ux-pro-max"] - id: "#33a" name: "claude-md-improver" diff --git a/docs/registry/splitting-inventory.md b/docs/registry/splitting-inventory.md index f13fc7b..8a64801 100644 --- a/docs/registry/splitting-inventory.md +++ b/docs/registry/splitting-inventory.md @@ -121,8 +121,8 @@ | operations (9: +process-doc узел) | ✅ DONE | committed (push deferred) | | finance-plugin (8, journal ×2 оставлены) | ✅ DONE | committed (push deferred) | | brand-voice (3) | ✅ DONE | этот коммит (push deferred) | -| hookify (1–2) | ⏸ развилка владельцу | — | -| ui-ux-pro-max (7, +правка PSR) | ⏸ развилка владельцу | — | +| hookify (1–2) | ✅ оставлен одной карточкой (решение владельца 19.06 — slug hookify:hookify кривой) | — | +| ui-ux-pro-max (7) | ✅ реестр DONE (master #31g держит конфликт-треугольник; PSR-правка отдельным шагом) | этот коммит | ### Доп-каскады, выявленные на superpowers (учесть для крупных комков) diff --git a/tools/registry-load.test.mjs b/tools/registry-load.test.mjs index 7c6a5f2..0aaf73e 100644 --- a/tools/registry-load.test.mjs +++ b/tools/registry-load.test.mjs @@ -5,9 +5,9 @@ import { loadRegistry, clearCache, findByClassification, findByKeyword, findActi describe('registry-load', () => { beforeEach(() => clearCache()); - it('loads registry (147 nodes: разворачивание 9 комков #33/#19/#57/#36/#42/#46/#74/#51/#61/#76 18.06.2026)', () => { + it('loads registry (153 nodes: разворачивание 11 комков (+#31 ui-ux-pro-max) 18-19.06.2026)', () => { const r = loadRegistry(); - expect(r.nodes).toHaveLength(147); + expect(r.nodes).toHaveLength(153); 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); - // 147 nodes total; #1 historic, #17 dormant, #44/#50/#54/#67/#82/#83 deferred; - // развёрнуты: ...,#61→8,#76 brand-voice→3 (+2) → 139 active - expect(active).toHaveLength(139); + // 153 nodes total; #1 historic, #17 dormant, #44/#50/#54/#67/#82/#83 deferred; + // развёрнуты: ...,#76→3,#31 ui-ux-pro-max→7 (+6) → 145 active + expect(active).toHaveLength(145); 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');