feat(okr): okf_version emitteres i rot-indeksens frontmatter
This commit is contained in:
parent
049259d9a6
commit
1da9dd878d
4 changed files with 144 additions and 12 deletions
|
|
@ -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 });
|
||||
}
|
||||
});
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue