feat(okr): okf_version emitteres i rot-indeksens frontmatter

This commit is contained in:
Kjell Tore Guttormsen 2026-08-02 21:15:50 +02:00
commit 1da9dd878d
4 changed files with 144 additions and 12 deletions

View file

@ -17,6 +17,7 @@ import { join, dirname } from 'node:path';
import { fileURLToPath } from 'node:url';
import { generateIndexes } from '../scripts/okf-index.mjs';
import { checkBundle } from '../scripts/okf-check.mjs';
import { parseFrontmatter } from '../lib/frontmatter.mjs';
const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..');
const CHECK = join(ROOT, 'scripts', 'okf-check.mjs');
@ -1015,3 +1016,95 @@ test('(20f) okf-check: frontmatter-markoer tolkes som YAML -- trailing kommentar
}
});
// --- D8 steg 21: okf_version emitteres i rot-indeksens frontmatter ---
// Laast arkitektur-beslutning 6: `okf_version` -> frontmatter, `okf_layout` ->
// broedtekst. De to markoerene har ulike eiere (Google vs. oss) og ulik
// livssyklus; frontmatter er den maskinlesbare flaten konsumenter utenfor
// pluginen leser, broedteksten er vaar egen. Gjelder KUN rot-indeksen --
// underkatalog-indekser forblir uten frontmatter.
//
// PRESENCE haandheves fortsatt IKKE: `okf_version` er MAY i specen, og dette
// steget flytter plassering, det innfoerer ikke et krav.
//
// Emisjon og lesing testes HVER FOR SEG (S38-S40-laerdommen: samme fil, samme
// markoer, to lesninger). (21e) er den ene bevisste integrasjonen: den beviser
// at steg 20s toleranse faktisk moeter det steg 21 skriver.
test('(21a) okf-index: rot-index baerer okf_version i FRONTMATTER, okf_layout i broedteksten', () => {
const dir = tmpRoot();
try {
cpSync(REALISTIC, dir, { recursive: true });
generateIndexes(dir);
const root = readFileSync(join(dir, 'index.md'), 'utf8');
assert.ok(root.startsWith('---\n'), 'rot-index skal aapne med en frontmatter-blokk');
const { get } = parseFrontmatter(root);
assert.equal(get('okf_version'), '0.1', 'okf_version skal ligge i frontmatter');
assert.equal(get('okf_layout'), null, 'okf_layout skal IKKE ligge i frontmatter');
const body = root.slice(root.indexOf('\n---', 3) + 4);
assert.match(body, /^okf_layout: kb-layout-2026-06$/m, 'okf_layout skal staa i broedteksten');
assert.ok(!/^okf_version:/m.test(body), 'okf_version skal ikke ogsaa staa i broedteksten');
assert.match(body, /^# /m, 'overskriften skal fortsatt finnes, under frontmatteren');
} finally {
rmSync(dir, { recursive: true, force: true });
}
});
test('(21b) okf-index: underkatalog-index faar ALDRI frontmatter', () => {
const dir = tmpRoot();
try {
cpSync(REALISTIC, dir, { recursive: true });
generateIndexes(dir);
const sub = readFileSync(join(dir, 'strategisk-kontekst', 'index.md'), 'utf8');
assert.ok(!sub.startsWith('---'), 'undernivaa skal IKKE ha frontmatter');
assert.equal(sub.split('\n')[0].slice(0, 2), '# ', 'undernivaa starter fortsatt paa overskriften');
} finally {
rmSync(dir, { recursive: true, force: true });
}
});
test('(21c) okf-index: to kjoeringer gir BYTE-IDENTISK rot-index (idempotens over ny plassering)', () => {
const dir = tmpRoot();
try {
cpSync(REALISTIC, dir, { recursive: true });
generateIndexes(dir);
const first = readFileSync(join(dir, 'index.md'), 'utf8');
generateIndexes(dir);
const second = readFileSync(join(dir, 'index.md'), 'utf8');
// Fanger at parseExistingIndex ikke forstaar den nye plasseringen:
// duplisert markoer, forskjoevet overskrift, eller markoer re-utledet til default.
assert.equal(second, first, 'andre kjoering skal ikke endre en byte');
} finally {
rmSync(dir, { recursive: true, force: true });
}
});
test('(21d) okf-index: umigrert broedtekst-form loeftes til frontmatter, verdiene bevart', () => {
const dir = tmpRoot();
try {
// Bundle skrevet av en eldre okf-index: begge markoerene i broedteksten.
writeRootIndex(dir, ['okf_version: 0.3', 'okf_layout: kb-layout-2099-12']);
generateIndexes(dir);
const root = readFileSync(join(dir, 'index.md'), 'utf8');
assert.equal(parseFrontmatter(root).get('okf_version'), '0.3', 'den FUNNE versjonen skal loeftes, ikke erstattes av konstanten');
const body = root.slice(root.indexOf('\n---', 3) + 4);
assert.match(body, /^okf_layout: kb-layout-2099-12$/m, 'layout skal bli staaende i broedteksten, verbatim');
assert.ok(!/^okf_version:/m.test(body), 'den gamle broedtekst-linja skal ikke bli liggende igjen');
} finally {
rmSync(dir, { recursive: true, force: true });
}
});
test('(21e) okf-index -> okf-check: det emitteren skriver, leser checkeren', () => {
const dir = tmpRoot();
try {
buildCleanIngest(dir);
generateIndexes(dir);
const r = checkBundle(dir);
assert.equal(r.okfVersion, '0.1', 'checkeren skal finne den frontmatter-plasserte versjonen');
assert.equal(r.okfLayout, 'kb-layout-2026-06', 'og den broedtekst-plasserte layouten');
assert.equal(runCheck(dir).status, 0);
} finally {
rmSync(dir, { recursive: true, force: true });
}
});