Skip to content

refactor!: nitra/mt стає репозиторієм специфікації - #58

Merged
vitaliytv merged 3 commits into
mainfrom
claude/musing-borg-7c9f1c
Jul 22, 2026
Merged

refactor!: nitra/mt стає репозиторієм специфікації#58
vitaliytv merged 3 commits into
mainfrom
claude/musing-borg-7c9f1c

Conversation

@vitaliytv

@vitaliytv vitaliytv commented Jul 22, 2026

Copy link
Copy Markdown
Member

Що це

Фаза 3 розділення репозиторію nitra/mt на три:

Репозиторій Роль
nitra/mt-rust (daa1b22) Повна реалізація: crates/, relay/, packages/, docs/adr, mt/ dogfood-дані, CI збірки бінарників
nitra/mt-js (2f30f9c) npm-клієнт @7n/mt (колишній npm/ без docs), платформні пакети запінені на опублікованій 0.28.0
nitra/mt (цей репозиторій) Тільки специфікація: протокол (docs/) + рушій шарової документації (layers/), яким вона побудована

Фази 1-2 (винесення реалізації й npm-клієнта) вже завершені в цільових репозиторіях. Цей PR перетворює nitra/mt на spec-only репозиторій.

Зміни

  • Документація: стара docs/adr (124 файли, переїхала в mt-rust) видалена; npm/docs (колишня специфікація протоколу) стала top-level docs/ — вхід docs/index.md, вміст перенесено без змін (byte-exact, усі <!-- layers:... --> маркери й CRC збережено).
  • Реалізація видалена: crates/, relay/, packages/, mt/ (dogfood-дані), решта npm/ (bin/lib/types/index.js/package.json/…), Cargo.toml/Cargo.lock/.cargo/, deny.toml, .mt.json.
  • Тест специфікації врятовано: npm/lib/tests/docs.test.mjstests/docs.test.mjs, адаптовано під новий корінь корпусу (docs/), ADR-перевірку прибрано (ADR-и цього репозиторію тепер про специфікацію, а не про стару реалізацію).
  • У перенесеній docs/: layers.json $schema виправлено на новий відносний шлях; сирітські doc-files-доки (stryker.config.md, vitest.config.md, frontmatter docs/index.md), що документували видалені npm/-файли, прибрано.
  • Кореневий package.json: workspaces["layers"], прибрано start-скрипт і @7n/rules-lang-rust.
  • vitest.config.mjs: прибрано Rust globalSetup (збирав mt-scanner перед тестами).
  • CI: видалено .github/workflows/npm-publish.yml — публікація з цього репозиторію не ведеться (spec-пакети — окрема майбутня задача).
  • Конфіги: knip.json, eslint.config.js, .n-rules.json, .v8rignore, .cspell.json, hk.pkl, .gitignore підчищені від шляхів на видалені npm//crates//relay//packages//target/; .cursor/rules/n-rust.mdc видалено разом з @-include у CLAUDE.md/AGENTS.md.
  • Новий README.md: опис специфікації, вхід у docs/index.md, мапа трьох репозиторіїв.
  • docs/adr/ лишено порожнім (.gitkeep) — репозиторій продовжує вести власний ADR-журнал рішень щодо специфікації (правило adr активне).
  • Кореневий package.json стає публікованим пакетом @7n/mt (коміт ba9b2d4): знято private, додано publishConfig.access: "public", repository/homepage/bugs/license/author/keywords, files: ["docs", "README.md"]; відновлено .github/workflows/npm-publish.yml (checkoutsetup-bun-depssetup-nodebunx n-cursor releaseJS-DevTools/npm-publish); новий розділ у README.md про npm-пакет; новий кореневий CHANGELOG.md.
  • Прибрано workspaces із кореня (коміт 106a436): n-cursor release пропускав корінь, поки в package.json був непорожній workspaces (деталі — розділ нижче). layers/ лишається окремим пакетом без workspace-лінкування, встановлюється власним bun install --cwd layers; доданий scripts.pretest (bun install --cwd layers) автоматично тригериться перед bun run test. files доповнено CHANGELOG.md (вимога changelog/consistency-правила для публікованого пакета). knip.json і bun.lock/layers/bun.lock підлаштовані під non-workspace layout.

Test plan

  • bun install — воркспейси npm/relay/crates/mt-napi прибрані без помилок
  • bunx vitest run — 11 файлів, 97 тестів, усі зелені
  • bun ./layers/lib/cli.mjs status docs — корпус знайдено, усі шари fresh
  • bunx oxlint — чисто
  • bunx eslint . — чисто
  • bunx jscpd . — 0 дублікатів
  • npx @7n/rules lint doc-files --no-fix — чисто
  • git grep -l "npm/docs" — лише історичний запис у docs/log.md (журнал змін документації, посилається на видалений шлях тесту)

npm takeover: @7n/mt стає специфікацією (0.29.0)

Коміт ba9b2d4 готує publish-канал: наступний реліз з цього репозиторію публікує @7n/mt@0.29.0, де вміст пакета — сама специфікація (docs/ + README.md + CHANGELOG.md), а не CLI. @7n/mt ≤ 0.28.0 (CLI) лишається в npm-історії як є; код CLI живе в nitra/mt-js і наразі не публікується.

Release-обмеження вирішено (коміт 106a436)

Емпірично було виявлено, що bunx n-cursor release пропускає корінь, поки в кореневому package.json лишається непорожній workspaces (fixture-прогін release() підтвердив: з workspaces: ["layers"] корінь ігнорується незалежно від наявних change-файлів).

Вирішено цим PR: корінь більше не оголошує workspaces; layers/ ставиться вкладеним пакетом через bun install --cwd layers (і автоматично — через pretest перед bun run test). Повторний fixture-прогін release() (ізольований git-репозиторій поза цим репо, package.json без workspaces + change-файл) підтвердив: корінь тепер розглядається, версія бампається 0.28.00.29.0 (minor, за .changes/-файлом), CHANGELOG.md оновлюється, коміт і тег @7n/mt@0.29.0 створюються; вкладений layers/package.json при цьому не зачіпається. Реліз @7n/mt@0.29.0 відбудеться автоматично в CI (npm-publish.ymlbunx n-cursor releaseJS-DevTools/npm-publish) після мерджу цього PR у main.

Верифікація (коміт ba9b2d4)

  • bun pm pack --dry-run / npm pack --dry-run — тарбол 7n-mt-0.28.0.tgz, 44 файли: увесь docs/** (включно з docs/adr/.gitkeep) + README.md + package.json, нічого зайвого (без layers/, без конфігів)
  • bunx vitest run — 11 файлів, 97 тестів, усі зелені
  • bunx oxlint — чисто (exit 0)
  • npx @7n/rules lint --no-fix — exit 1, але всі 11 cspell + 3 markdownlint порушення в НЕзмінених файлах docs/architecture/*, docs/overview/*, docs/roadmap.en.md (передіснуючий борг, обумовлений у задачі як прийнятний); у 4 змінених файлах (package.json, README.md, CHANGELOG.md, .github/workflows/npm-publish.yml) порушень нема

Верифікація (коміт 106a436)

  • bunx vitest run — 11 файлів, 97 тестів, усі зелені (layers-тести резолвлять залежності з layers/node_modules, встановленого окремим bun install --cwd layers)
  • bun run test (без попереднього bun install --cwd layers) — pretest автоматично встановлює залежності layers/, далі vitest run зелений
  • bun ./layers/lib/cli.mjs status docs — корпус знайдено, усі шари fresh
  • bunx oxlint, bunx eslint . — чисто
  • bunx jscpd . — 0 дублікатів
  • bunx knip --no-config-hints — ідентично baseline (3 pre-existing unused devDependencies + 2 unused exports), без нових знахідок; перевірено і без layers/node_modules (CI-подібний стан) — теж чисто
  • npx @7n/rules lint --no-fix — той самий передіснуючий docs/-контент-борг (11 cspell + 3 markdownlint), без нових порушень
  • npm pack --dry-run — тарбол docs/** + README.md + CHANGELOG.md + package.json (45 файлів; CHANGELOG.md додався у files через вимогу changelog/consistency-правила для публікованого кореневого пакета)
  • Fixture-прогін release() (@nitra/cursor rules/release/release.mjs, ізольований git-репозиторій поза цим репо) — див. розділ вище

Мердж у main тригерить npm-publish.yml, який зробить реліз @7n/mt@0.29.0.

🤖 Generated with Claude Code

vitaliytv and others added 3 commits July 22, 2026 13:49
…ла в mt-rust і mt-js

Фаза 3 розділення репозиторію (фази 1-2 завершені раніше):

- Реалізація (crates/, relay/, packages/, docs/adr, mt/ dogfood-дані,
  CI збірки бінарників) переїхала в github.com/nitra/mt-rust (daa1b22).
- npm-клієнт @7n/mt (колишній npm/, без docs) переїхав у
  github.com/nitra/mt-js (2f30f9c).
- nitra/mt лишається чистою специфікацією: колишній npm/docs став
  top-level docs/ (index.md — точка входу), layers/ (рушій шарової
  документації) без змін.

Що зроблено в цьому репозиторії:
- git rm стара docs/adr (124 файли, переїхала в mt-rust) + git mv
  npm/docs → docs.
- git rm crates/, relay/, packages/, mt/, npm/, Cargo.toml/.lock,
  .cargo/, deny.toml, .mt.json — від реалізації тут нічого не лишилось.
- Врятовано тест канонічної специфікації: npm/lib/tests/docs.test.mjs
  → tests/docs.test.mjs, ADR-перевірку прибрано (ADR більше не тут),
  корінь корпусу — docs/.
- У перенесеній docs/: виправлено $schema-шлях у layers.json, прибрано
  сирітські doc-files-доки (index.md-frontmatter на npm/index.js,
  stryker.config.md, vitest.config.md) — джерела виїхали разом із npm/.
- Кореневий package.json: workspaces → ["layers"], прибрано start-скрипт
  і @7n/rules-lang-rust.
- vitest.config.mjs: прибрано Rust globalSetup.
- CI: видалено .github/workflows/npm-publish.yml (публікація —
  окрема майбутня задача в mt-js/mt-rust).
- Конфіги (knip.json, eslint.config.js, .n-rules.json, .v8rignore,
  .cspell.json, hk.pkl, .gitignore) підчищені від шляхів на видалені
  npm/crates/relay/packages/target; .cursor/rules/n-rust.mdc видалено
  разом із @-include у CLAUDE.md/AGENTS.md.
- Новий README.md: вхід у специфікацію (docs/index.md) і мапа трьох
  репозиторіїв (mt / mt-rust / mt-js).
- docs/adr/ лишено порожнім (.gitkeep) — цей репозиторій продовжує
  вести власний ADR-журнал рішень щодо специфікації.

Перевірено: bun install, bunx vitest run (11 файлів, 97 тестів),
bun ./layers/lib/cli.mjs status docs (корпус знайдено, шари fresh),
bunx oxlint / bunx eslint . / bunx jscpd . чисто.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ісля мерджу)

Корінь монорепо лишається workspace-роутом (workspaces: ["layers"]), але
package.json тепер публікується сам як @7n/mt: name/description/publishConfig,
files: ["docs", "README.md"] — тарбол містить лише специфікацію + README.
Відновлено .github/workflows/npm-publish.yml (release-publish job, модельований
на історичному) — тригери push на main по docs/**+package.json, bunx n-cursor
release + JS-DevTools/npm-publish з OIDC/provenance, без Rust/платформних
підпакетів. README і CHANGELOG.md пояснюють перехід (≤0.28.0 — CLI, історія в
nitra/mt-js; ≥0.29.0 — специфікація).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…rs як вкладений пакет

n-cursor release визначає isMonorepoRoot за наявністю workspaces у кореневому
package.json і завжди пропускає корінь, якщо цей список непорожній — з
workspaces: ["layers"] @7n/mt ніколи б не отримав bump/tag/release. Прибрано
поле workspaces; layers/ лишається окремим пакетом (npm/bun-семантика без
workspace-лінкування), встановлюється власним bun install --cwd layers.
Доданий pretest-скрипт запускає це перед vitest (bun run test автоматично
тригерить pretest), тож layers/lib/*.mjs резолвить свої залежності
(@7n/llm-lib тощо) з layers/node_modules.

- package.json: видалено workspaces; files доповнено CHANGELOG.md (вимога
  changelog/consistency-правила для публікованого пакета); scripts.pretest.
- knip.json: додано stryker.config.mjs (новий канонічний baseline для кореня,
  test-правило більше не пропускає корінь) до entry воркспейсу ".".
- stryker.config.mjs (корінь): канонічний baseline, згенерований
  npx @7n/rules lint test.
- bun.lock / layers/bun.lock: перегенеровано без workspace-лінку; layers
  отримав власний lockfile.

Rego-фікстура поза репо (release.mjs, isolated git repo) підтвердила: без
workspaces getMonorepoPackageRootDirs повертає лише ['.'], isMonorepoRoot
стає false, release() бампає корінь 0.28.0 → 0.29.0 (minor, за .changes/
файлом), оновлює CHANGELOG.md, комітить і тегує @7n/mt@0.29.0 — вкладений
layers/package.json (0.2.0) при цьому не зачіпається.

Верифіковано: bunx vitest run (11 файлів, 97 тестів), bun ./layers/lib/cli.mjs
status docs, bunx oxlint, bunx eslint ., bunx jscpd ., bunx knip
--no-config-hints (без нових порушень vs baseline), npx @7n/rules lint --no-fix
(лише передіснуючий docs/-контент-борг), npm pack --dry-run (docs/** +
README.md + CHANGELOG.md + package.json).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vitaliytv
vitaliytv merged commit 37f7d68 into main Jul 22, 2026
1 of 4 checks passed
vitaliytv added a commit that referenced this pull request Jul 23, 2026
…ії (#60)

Продовження #58/#59: репо вже spec-only, тепер прибрано інфраструктурні
хвости, що лишилися неузгодженими після переїзду.

Видалення:
- .n-rules.json: rules worktree/image-compress → disable-rules (обидва
  безпечно вимикаються — `lint --no-fix`/`lint ga --no-fix` пройшли чисто
  без них; підтверджено офіційним полем схеми `disable-rules`, а не просто
  вилученням з `rules`). Причина: `n-worktree.mdc` документує
  `npx @7n/mt worktree create/list/remove/prune` — цієї команди в
  spec-пакеті `@7n/mt` більше нема (CLI переїхав у nitra/mt-js,
  непублікований); `image-compress` — у docs/ немає жодного растрового
  чи SVG-файлу, канон з нульовим застосуванням.
- .cursor/rules/n-worktree.mdc, .cursor/rules/n-image-compress.mdc —
  видалені як канонічні файли вимкнених правил (орфановані, ніде більше
  не застосовуються).
- CLAUDE.md, AGENTS.md — прибрано `@`-імпорти/пункти на видалені
  n-worktree.mdc/n-image-compress.mdc (обидва файли позначені
  "генерується автоматично через npx @7n/rules, не редагуй вручну";
  bare-sync навмисно не запускався за умовами задачі — без нього
  ці два файли не самосинхронізуються, тож ручна правка тут єдиний спосіб
  уникнути dangling-імпорту на видалений файл; наступний реальний sync
  дасть еквівалентний результат).
- .agents/skills/source-command-{n-coverage-fix,n-fix-tests,n-fix,
  n-start-check,n-worktree}/SKILL.md — застарілі дзеркала, що вказували
  на неіснуючі `.cursor/skills/n-*/SKILL.md` (ці скіли ніколи не існували
  в .cursor/skills/, .claude/commands/, .pi/skills/ цього репо; n-worktree
  теж вказував на неіснуючий `.cursor/skills/n-worktree/SKILL.md` —
  окремо від рішення про правило "worktree", сам скіл-мірор був мертвий).
  Додано source-command-n-brainstorming/SKILL.md — єдиний скіл, якого
  бракувало в .agents-дзеркалі порівняно з .claude/commands, .cursor/skills,
  .pi/skills (тепер усі чотири локації симетричні: adr-normalize,
  brainstorming, lint, llm-patch, publish-telegram, taze).
- .codex/hooks/capture-decisions.log, normalize-decisions.log,
  .normalize-state — рантайм лог/стейт-файли, помилково закомічені;
  вміст логів посилається на шляхи іншого локального проекту
  (/Users/vitaliytv/www/vitaliytv/7n/...), що підтверджує випадковість
  коміту. Додано .gitignore-записи для .codex/hooks/*.log,
  .normalize-state, .normalize.lock (за аналогією з уже наявними
  .claude/hooks/-записами).

Залишено:
- Скіл `taze` — оновлює npm/bun-залежності репо (включно з @7n/rules,
  на якому тримається сам лінт), тобто підтримує інструмент лінтування,
  а не є "функціональністю коду" поза межами документації. Опційна
  Rust/cargo-гілка в n-taze/SKILL.md — узагальнена, умовна ("якщо є
  Cargo.toml"), не прив'язана до конкретного видаленого коду цього репо.

Невирішена невідповідність (звіт, без правки):
- .cursor/skills/{n-adr-normalize,n-lint,n-taze}/SKILL.md досі містять
  у preflight-блоці `<!-- n-rules:worktree:start/end -->` команду
  `npx @7n/mt worktree create ...`. Це package-шаблонований контент
  (worktree-only skills, main.json → worktree: true, поза контролем
  .n-rules.json цього репо) — регенерується лише bare `npx @7n/rules`,
  який заборонено запускати за умовами задачі. Ручна правка цього блоку
  ризикована: наступний реальний sync або перезапише її назад, або дасть
  непередбачуваний результат — тому лишено як є з explicit флагом
  тут і в PR.

Верифікація: `npx @7n/rules lint --no-fix`, `lint ga --no-fix`,
`lint --full --no-fix` — усі exit 0.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant