Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .cargo/mutants.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# .cargo/mutants.toml — universal cargo-mutants baseline (test.mdc).
# Цей baseline нейтральний: він не робить припущень про framework/app shell,
# не виключає platform glue, generated wrappers або binary entrypoints.
# Framework-specific tuning (Tauri, Capacitor тощо) належить відповідним
# правилам — вони без дублювання доповнюють цей файл, не перетирають його.
# cargo-mutants має робочі defaults; цей файл — стартова точка для customization.
# Документація: https://mutants.rs/
2 changes: 1 addition & 1 deletion .claude/commands/n-doc-files.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
description: >-
Обовʼязковий крок задачі (як lint): для кожного зміненого/нового кодового файлу (js/mjs/ts/vue/py) JS-оркестрована генерація лаконічної поведінкової української md-документації у теку docs/ поряд із кодом, зі звіркою застарілості за CRC у frontmatter
Обовʼязковий крок задачі (як lint): для кожного зміненого/нового кодового файлу (розширення декларують lang-плагіни: js/mjs/ts/vue — lang-js, rs/py — lang-rust/lang-python) JS-оркестрована генерація лаконічної поведінкової української md-документації у теку docs/ поряд із кодом, зі звіркою застарілості за CRC у frontmatter
---

# n-doc-files
Expand Down
8 changes: 8 additions & 0 deletions .claude/commands/n-storybook.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
description: >-
Канон Storybook для Vue-компонентних бібліотек — прогін lint-поверхонь правила storybook (scope/scaffold/vitest-config/hygiene) по поточному репо, і окремий --adopt режим для пакетів із уже наявним ручним Storybook (діагностика diff проти канону без сліпого перезапису)
---

# n-storybook

Виконай інструкції зі скілу `.cursor/skills/n-storybook/SKILL.md`.
2 changes: 1 addition & 1 deletion .claude/commands/n-taze.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
description: >-
Оновлення версій модулів проекту (bun/npm; якщо є Cargo.toml — Rust-крейти через cargo-edit; якщо є pyproject.toml — Python-пакети через uv) з аналізом major-змін і автоматичним рефакторингом несумісного коду
Оновлення версій модулів проекту до останніх (усі екосистемиJS/npm, Rust, Python тощо — через активні lang-плагіни) з аналізом major-змін і автоматичним рефакторингом несумісного коду
---

# n-taze
Expand Down
20 changes: 18 additions & 2 deletions .cspell.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,14 @@
"cdylib",
"chrono",
"codesign",
"genai",
"instrumenter",
"journaled",
"journaling",
"kfse",
"lipo",
"mgmt",
"mikrotik",
"millis",
"mktree",
"mlmail",
Expand Down Expand Up @@ -79,15 +81,16 @@
"брифу",
"вебвʼю",
"воркспейсом",
"гейтованою",
"гейтом",
"дашбордом",
"дедлайнових",
"таймзони",
"дебаунс",
"дебаунсить",
"дедлайнових",
"декомпозує",
"деплой",
"деривується",
"дефолта",
"джоба",
"джоби",
"джобів",
Expand All @@ -96,6 +99,7 @@
"екшн",
"еміт",
"еміти",
"ендпоінти",
"ескальовано",
"ескалювати",
"залогінений",
Expand All @@ -110,8 +114,13 @@
"комітиться",
"Композабл",
"конфігурованих",
"конфігурованого",
"краш",
"крейт",
"крейта",
"крейтом",
"леджер",
"лейбл",
"лендинг",
"логується",
"макроса",
Expand Down Expand Up @@ -143,6 +152,7 @@
"пейлоад",
"Перегенеровано",
"перезбірка",
"перезбірки",
"перезісканувати",
"перескановує",
"пересканування",
Expand All @@ -165,18 +175,24 @@
"рендер",
"рендериться",
"рендером",
"рунги",
"рунгів",
"самозатиралися",
"сконфігуровазованого",
"скоуп",
"скоупи",
"скоупом",
"скоупу",
"спавнені",
"спавнячи",
"таймаут",
"таймзони",
"таймлайну",
"таски",
"тега",
"тернарник",
"тірів",
"тріпа",
"тулбарі",
"Увімкнює",
"уточнюючі",
Expand Down
4 changes: 2 additions & 2 deletions .cursor/rules/n-adr.mdc
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ ADR живуть у єдиному каталозі **`docs/adr/`**. Clean ADR-

## Фаза 1 — Capture

Stop-hook `capture-decisions.sh` зчитує JSONL-транскрипт сесії (через `jq`), витягає текст, `thinking`-блоки та назви `tool_use`-викликів, передає компактний дайджест у LLM-бекенд з evidence-bound промптом і записує результат у **`docs/adr/<timestamp>-<slug-або-sid>.md`**, якщо модель повернула MADR-блок з шапкою `## ...`. Якщо модель повернула `NONE` (тривіальна сесія) або відповідь порожня — нічого не пишеться. Slug для імені файлу виводиться локально (без додаткового LLM-виклику) з першого `## `-заголовка відповіді. Рекурсію з внутрішнього виклику моделі блокує env-var `CAPTURE_DECISIONS_RUNNING=1`.
Stop-hook `capture-decisions.sh` зчитує JSONL-транскрипт сесії (через `jq`), витягає текст, `thinking`-блоки та назви `tool_use`-викликів, передає компактний дайджест у LLM-бекенд з evidence-bound промптом і записує результат у **`docs/adr/<timestamp>-<slug-або-sid>.md`**, якщо модель повернула MADR-блок з шапкою `## ...`. Якщо модель повернула `NONE` (тривіальна сесія) або відповідь порожня — нічого не пишеться. Slug для імені файлу виводиться локально (без додаткового LLM-виклику) з першого `##`-заголовка відповіді. Рекурсію з внутрішнього виклику моделі блокує env-var `CAPTURE_DECISIONS_RUNNING=1`.

Для Cursor payload скрипт бере `transcript_path`, `conversation_id` / `generation_id` і `workspace_roots[0]`; для Claude Code — `transcript_path`, `session_id` і `CLAUDE_PROJECT_DIR`.

Expand All @@ -173,7 +173,7 @@ LLM повертає масив операцій:
| `op` | Семантика | Поля |
| --- | --- | --- |
| `delete` | Чернетка тривіальна / повністю покрита іншим clean-ADR-ом. | `file`, `reason` |
| `rewrite` | Чернетка стає окремим clean-файлом MADR v4 minimal: draft-frontmatter (`session:`/`captured:`/`transcript:`) заміняється на OKF v0.1 (`type: ADR`, `title:`), ім'я → `<timestamp>-<slug>.md` (timestamp-префікс чернетки збережено), додаються `**Status:** Accepted`, `**Date:**` з `captured` і canonical MADR headings. Якщо LLM не повернула OKF frontmatter, скрипт сам дописує мінімальне (`type: ADR`, `title:` з першого `# `-рядка або зі `slug`). | `file`, `slug`, `content` |
| `rewrite` | Чернетка стає окремим clean-файлом MADR v4 minimal: draft-frontmatter (`session:`/`captured:`/`transcript:`) заміняється на OKF v0.1 (`type: ADR`, `title:`), ім'я → `<timestamp>-<slug>.md` (timestamp-префікс чернетки збережено), додаються `**Status:** Accepted`, `**Date:**` з `captured` і canonical MADR headings. Якщо LLM не повернула OKF frontmatter, скрипт сам дописує мінімальне (`type: ADR`, `title:` з першого `#`-рядка або зі `slug`). | `file`, `slug`, `content` |
| `merge-into` | Чернетка повторює тему вже існуючого clean-файлу; дописуємо `## Update YYYY-MM-DD` у кінець `target`. Скрипт резолвить `target` у три кроки: точна назва в `docs/adr/`, slug свіжо створеного `rewrite` цього ж батчу, або унікальний існуючий файл, що закінчується на `-<slug>.md`. | `file`, `target`, `additions` |

`slug` — kebab-case українською (`ланцюжок-запуску-abie`, `npm-publish-flow`); англійські технічні терміни лишаються англійською без транслітерації. До імені clean-файлу скрипт додає `YYMMDD-HHMM-` чернетки, тож запис лишається прив'язаним до часу capture, а `docs/adr/` сортується хронологічно. Колізія імен обробляється детермінованим суфіксом `-2`, `-3`. Старі чернетки з `YYYYMMDD-HHMMSS-` prefix нормалізатор також розпізнає, щоб не ламати наявний inbox.
Expand Down
5 changes: 4 additions & 1 deletion .cursor/rules/n-bun.mdc
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ version: '2.1'
"dependencies": "кореневий package.json не повинен містити dependencies — додай у workspace-пакети (bun.mdc)"
}
```

- `bunfig.toml`:

```toml
Expand Down Expand Up @@ -126,6 +127,8 @@ Rego-пакет: `bun.package_json`
Gate виносить два класи deny:

1. **Заборонені top-level поля** — будь-яке поле з `package.json.deny.json` присутнє у файлі (навіть із порожнім значенням `{}`).
2. **devDependencies не з білого списку** — дозволені лише `@nitra/*`/`@7n/*` та root-only тестові peer/tools (`vitest`, `@vitest/coverage-v8`, `@stryker-mutator/vitest-runner`, `@playwright/test`). Будь-який інший пакет → deny. CLI-тули, які `n-rules lint` спавнить через `bunx` (oxlint, jscpd, v8r, github-actionlint тощо), у root не пінуються — вони приїжджають як `dependencies` пакета `@7n/rules` (npm-module.mdc).
2. **devDependencies не з білого списку** — дозволені лише `@nitra/*`/`@7n/*` та root-only тестові peer/tools (`vitest`, `@vitest/coverage-v8`, `@vitest/browser`, `@vitest/browser-playwright`, `@stryker-mutator/vitest-runner`, `@stryker-mutator/core`, `@playwright/test`, `playwright`, `@storybook/addon-vitest`, `@7n/test`). Будь-який інший пакет → deny. CLI-тули, які `n-rules lint` спавнить через `bunx` (oxlint, jscpd, v8r, github-actionlint тощо), у root не пінуються — вони приїжджають як `dependencies` пакета `@7n/rules` (npm-module.mdc).

`@vitest/browser`/`@vitest/browser-playwright`/`playwright`/`@storybook/addon-vitest` — додані для named vitest project "storybook" (канон Storybook, кластер 5: browser-mode, лише chromium) — той самий root vitest.config, що й `unit`-проект; `@storybook/addon-vitest` постачає `storybookTest`-плагін для цього vitest-конфіга (канонічний template правила `storybook`). `@vitest/browser-playwright` — окремий npm-пакет: vitest@^4 прибрав рядкове API browser-провайдера (`provider: 'playwright'`), потрібна factory `import { playwright } from '@vitest/browser-playwright'` → `provider: playwright()` (звірено з реальним `bun.lock` пілотного консюмера — усі три `@vitest/*`/`playwright`-пакети встановлені поруч). **Межа з `npm-module.mdc`**: Storybook-специфічні identity-пакети (`storybook`, `@storybook/vue3-vite`, `@storybook/vue3`, `msw`, `msw-storybook-addon`) у цей allowlist **не** додаються — вони живуть у `npm/package.json` консюмер-пакета (канон Storybook, кластер 7 Governance), бо `isStorybookRoot()` у `@7n/test` детектує Storybook-скоуп саме за тим файлом, не кореневим. `@storybook/addon-vitest` — виняток із цієї межі: він test-tooling (vitest-плагін), а не identity-маркер, тож root, як і решта vitest-peer'ів.

Перевірки, що потребують FS або cross-file контексту (наприклад наявність `yarn.lock`), лишаються у JS-шарі.
Loading
Loading