Skip to content
This repository was archived by the owner on Sep 11, 2026. It is now read-only.

fix(storybook): хвиля 1.3 — фікси канону за результатами живого адопту components - #178

Merged
vitaliytv merged 9 commits into
mainfrom
claude/adr-implementation-plan-44411e
Jul 21, 2026
Merged

vitaliytv merged 9 commits into
mainfrom
claude/adr-implementation-plan-44411e

Conversation

@vitaliytv

Copy link
Copy Markdown
Member

Що змінено

Третя ітерація зворотного зв'язку: адопт на nitra/components доведено до робочого стану вживу (storybook build + dev smoke + 58/58 vitest-тестів + чистий лінт, PR nitra/components#19) — розбіжності між каноном 0.11.0 і робочим станом повернуто в канон.

  1. viteConfigPath-обхід тепер частина скафолда (найважливіше). Без core.builder.options.viteConfigPath на порожній empty-vite.config.js builder-vite сам знаходить vite.config.js пакета і домерджує нефільтровані плагіни ще до viteFinal — подвійна SFC-трансформація, яку ловить лише повний storybook build (dev smoke мовчить). Новий канонічний файл + маркер-перевірка + T0-фікс + adopt-секція.
  2. import { iconSet } from 'quasar' → підшляхові default-імпорти — quasar 2.18.x не має такого runtime-binding, js-transform @quasar/vite-plugin падає.
  3. Glob-и без **/-префікса (picomatch анкорить до повного шляху) не матчили пакети поза коренем монорепо — виправлено по всьому правилу: CI workflow paths, concern.json#lint.glob, main.json#auto, main.mdc#globs.
  4. Governance вирівняно до верифікованої реальності: storybook-піни ^10.5.3 (пілот реально працює на 10.x, не 9.1.10), root-allowlist доповнено @storybook/builder-vite/@vitejs/plugin-vue/@quasar/vite-plugin/@quasar/extras.
  5. Канонічний knip-сніпет для .storybook/-артефактів у main.mdc (docs-only — js/check свідомо не ревалідує knip.json після створення).
  6. mswLoader замість deprecated mswDecorator (msw-storybook-addon 2.x).

Рев'юеру

  • 152/152 vitest (storybook+npm-module+bun), rego 18/18 + 22/22, regal чистий, дельта-лінт чистий, доки регенеровані.
  • @storybook/vue3 ^10.5.3 у canon-мапі — узгоджено з лінійкою, але в пілоті це транзитивна залежність (не верифіковано прямим devDep).
  • Ground truth — фінальні .storybook/-файли nitra/components#19.

🤖 Generated with Claude Code

vitaliytv and others added 9 commits July 21, 2026 11:13
… + скіл n-storybook)

Реалізація ADR «Канон Storybook для Vue-компонентних бібліотек» (#167, #169):
- scope: детекція за isVueComponentLibraryPkg + поріг ≥3 .vue, opt-out через
  .n-rules.json, app-детектор хвилі 2 за прапорцем (інертний)
- scaffold: канонічні template .storybook/main.js (фіксований порядок плагінів,
  viteFinal-фільтр pages/layouts), preview.js (Quasar full install +
  iconSet/iconMapFn, MSW init), mocks/gql-sse.js (sseSubscription), T0-автофікс
- vitest-config: projects [unit, storybook] поверх наявного test-блоку (AST,
  insert-only, fail-closed) + ізольований vitest.stryker.config
- hygiene: undeclared third-party imports у .vue, sassVariables auto-detect
- mocking: docs-only рецепти router/tfm/MSW/Pinia/pageDecorator
- adopt: посекційна діагностика для ручних впроваджень без сліпого перезапису,
  circuit breaker на пакет; скіл npm/skills/storybook + дзеркало .cursor/skills
- підключення concern-ів до lint-рушія (check:true без lint-блоку був мертвим),
  наскрізно верифіковано на синтетичному консюмер-репо

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…l version pin

Кластер 7 ADR канону Storybook:
- npm-module/npm_package_json: allowlist Storybook-devDeps у npm/package.json
  (обґрунтування — isStorybookRoot() у @7n/test читає саме цей файл) +
  version pin static map у Rego (НЕ template — T0 deep-merge інжектив би
  канонічні devDeps у кожен пакет)
- bun/package_json: @vitest/browser, playwright, @storybook/addon-vitest у
  allowed_root_test_deps (test-tooling для vitest-проєкту storybook);
  Storybook-identity пакети в корінь свідомо не пущені, межа задокументована

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ollo subscription + Pinia) (#169)

* docs(adr): brainstorm session — розширення канону Storybook на сторінки (route.params + Apollo subscription + Pinia)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(adr): прототип-верифікація розширення Storybook для сторінок на gt

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…ий PR-прогін (Кластер 5)

Дослідження: ci-shared — не хаб actions (звичайний консюмер); канонічний
механізм — вендоринг composite actions з npm-tarball @7n/rules. Крос-плагінний
імпорт скоуп-детекції в ci-github нелегальний, тому concern живе в правилі
storybook з requires.capability: ci:github (перше реальне використання
capability-гейтингу — спить без плагіна @7n/rules-ci-github).

- .github/actions/setup-playwright-chromium: кеш ms-playwright за версією
  playwright з bun.lock, install лише chromium --with-deps при cache miss
- .github/workflows/lint-storybook.yml: матриця по пакетах у скоупі →
  vitest run --project=storybook
- nightly mutation coverage свідомо поза concern-ом (test/stryker_config)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…a/components

Пілот на одному з двох ручних впроваджень-джерел ADR знайшов 2 баги і 3 прогалини:

- viteFinal-фільтр стійкий до VueMacros-стека: resolve/flatten Promise/масивів
  плагінів, фільтр vue-трансформерів за сімейством (vite:vue*, vue-macros),
  + vite-plugin-vue-layouts-next / unplugin-vue-router у несумісних
- vitest v4 API: provider: playwright() factory з @vitest/browser-playwright
  замість рядка 'playwright' (templates, маркери, fix, тести);
  @vitest/browser-playwright доданий у кореневий governance-allowlist
- flat-root layout у detectStoriesGlob: .vue у корені пакета →
  '../*.stories.@(js|ts)' (реальний layout components/npm)
- mocking.mdc: рецепт точкового alias-мока одного модуля з критерієм вибору
  проти MSW (розмежування скоупів, без суперечності рішенню розширення ADR)
- hasStoriesMarker: storybookTest({ configDir }) без явного include —
  легітимний патерн, не порушення

75/75 vitest, 21/21 rego, дельта-лінт чистий.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…mponents вживу

Другa порція зворотного зв'язку пілота (storybook build + 58/58 тестів як ground truth):
- viteConfigPath-обхід ОБОВ'ЯЗКОВИЙ: без core.builder.options.viteConfigPath на
  канонічний empty-vite.config.js builder-vite автодискаверить vite.config пакета
  і домерджує нефільтровані плагіни ДО viteFinal (подвійна SFC-трансформація,
  ловиться лише повним build) — новий файл скафолда + секція adopt
- preview.js: підшляховий default-імпорт icon-set (named export iconSet відсутній
  у quasar 2.18.x, ламає js-transform); mswLoader замість deprecated mswDecorator;
  setup з @storybook/vue3-vite
- glob-и без **/-префікса не матчили пакети поза коренем монорепо — виправлено
  repo-wide по правилу (ci workflow paths, concern.json lint.glob, main.json auto)
- governance: піни вирівняні до фактично верифікованих версій (storybook ^10.5.3);
  root-allowlist доповнений builder-vite/@vitejs/plugin-vue/@quasar/*
- канонічний knip-сніпет для .storybook-артефактів у main.mdc (docs-only)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vitaliytv
vitaliytv merged commit 0daad03 into main Jul 21, 2026
4 of 7 checks passed
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant