Files
brain/tools/m3b-node-graph-invariants.test.mjs
T
Дмитрий f01f5b8bbc feat: разворачивание комка adr-kit — adr + judge (роутер-реестр)
Эпик роутер-реестр, спека v2 §2, этап 1. Зонтик adr-kit развёрнут в
2 содержательные карточки (служебные init/setup/upgrade/lint/migrate/
install-hooks в реестр не входят — решение владельца 18.06).

- 2 карточки: adr-kit__adr (ведение ADR) + adr-kit__judge (сверка vs Accepted ADR)
- nodes.yaml: узел #36 → #36a/#36b; триггеры (adr→#36a, enforcement→#36b);
  ссылки L4/L5 обновлены на adr-kit:adr
- зонтик adr-kit убран (карточка + узел)
- registry-load.test: 110 узлов / 102 active
- m3b-node-graph: резолв известного узла #36 → #36a

Регрессия (без 5 pre-existing node:test файлов): 4361 passed, exit 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 23:09:38 +03:00

37 lines
1.8 KiB
JavaScript

import { describe, it, expect } from 'vitest';
import { statSync } from 'node:fs';
import { fileURLToPath } from 'node:url';
import { dirname, join } from 'node:path';
import { loadRegistry, clearCache } from './registry-load.mjs';
import { buildNodeGraph, resolveNode, twinsOf, checkGraphFreshness } from './node-graph.mjs';
const here = dirname(fileURLToPath(import.meta.url));
const registryPath = join(here, '..', 'docs', 'registry', 'nodes.yaml');
describe('Машина 3-B — граф на реальном реестре', () => {
it('граф строится из nodes.yaml и резолвит известные узлы', () => {
clearCache();
const reg = loadRegistry({ registryPath, useCache: false });
const g = buildNodeGraph(reg);
expect(g.nodes.length).toBeGreaterThan(50);
expect(resolveNode(g, '#36a')).not.toBe(null); // adr-kit:adr by id (#36 развёрнут в #36a/#36b)
expect(resolveNode(g, 'mermaid')).not.toBe(null); // by slug
expect(resolveNode(g, 'totally-made-up-skill')).toBe(null); // выдумка
});
it('близнецы architecture-tooling включают друг друга', () => {
clearCache();
const reg = loadRegistry({ registryPath, useCache: false });
const g = buildNodeGraph(reg);
const adr = resolveNode(g, 'adr-kit');
if (adr && adr.subcategory) {
const twinSlugs = twinsOf(g, adr.id).map((n) => n.slug);
expect(twinSlugs.length).toBeGreaterThanOrEqual(1);
}
});
it('freshness против реальной mtime реестра работает', () => {
const mtime = statSync(registryPath).mtimeMs;
expect(checkGraphFreshness({ registryMtimeMs: mtime, builtAtMs: mtime + 1000 }).fresh).toBe(true);
expect(checkGraphFreshness({ registryMtimeMs: mtime, builtAtMs: mtime - 1000 }).stale).toBe(true);
});
});