docs(konventionen): Hexwert-Ausnahmen und LDAP-Container festhalten
Zwei Saetze in CLAUDE.md beschrieben den Code nicht genau. "Nie auf rohe Hexwerte" hat sechs begruendete Ausnahmen, nicht null: Papier, ein QR-Decoder und das Web-App-Manifest entscheiden nicht nach unserem Farbschema. Sie stehen jetzt als Tabelle mit Begruendung je Zeile. Die Regel wurde ergaenzt, nicht der Code geaendert -- eine Konstante ueber drei unverwandte Dinge haette die Begruendung versteckt. Das Tor vor jedem Commit nennt den LDAP-Container. Ohne ihn ueberspringt die Suite 22 Tests -- nachgezaehlt, nicht geschaetzt: 81 mit Container, 59 ohne. Sie sagt es auf stderr, der Lauf sieht trotzdem gruen aus. Im README fehlte zusaetzlich format:pruefen, das CLAUDE.md seit #010 verlangt. Damit das haelt, auch wenn niemand hinsieht: pruefe:doku vergleicht die beiden Schranken-Bloecke und verlangt von beiden den Container. Gegenprobe gefahren. Der Review hatte vier Hexwerte genannt und src/lib/qr.ts uebersehen, und das Issue behauptete die Regel stehe auch in docs/architektur.md -- tut sie nicht. Beides im Issue-Text richtiggestellt, statt einen Haken ueber falschen Text zu setzen. Closes #40
This commit is contained in:
@@ -8,6 +8,7 @@
|
||||
* 3. Geschaetzte und tatsaechliche Zeiten stimmen zwischen Datei und Uebersicht.
|
||||
* 4. Alle in der Anleitung verlinkten Bilder sind vorhanden.
|
||||
* 5. Kein Markdown verweist auf eine Datei, die es nicht gibt.
|
||||
* 6. Die Schranken-Befehle in CLAUDE.md und README.md stimmen ueberein.
|
||||
*/
|
||||
import { readFileSync, existsSync, readdirSync } from "node:fs";
|
||||
import { join, dirname, resolve } from "node:path";
|
||||
@@ -134,6 +135,56 @@ function feld(text, name) {
|
||||
}
|
||||
}
|
||||
|
||||
// ---- 6. Die Schranken in CLAUDE.md und README.md -------------------------
|
||||
//
|
||||
// Zwei Dateien beschreiben dasselbe Tor, und sie sind auseinandergelaufen: im
|
||||
// README fehlte `format:pruefen`, und beide nannten den LDAP-Container nicht, ohne
|
||||
// den die Suite 22 Tests still ueberspringt. Beides fiel erst bei der Abnahme zu
|
||||
// #019 auf -- ein gruener Lauf sieht genauso aus. Geprueft wird deshalb der
|
||||
// Befehlsblock selbst, nicht seine Umgebung (#040).
|
||||
{
|
||||
/** Der erste eingezaeunte Block nach einer Ueberschrift. */
|
||||
const blockNach = (text, ueberschrift) => {
|
||||
const ab = text.indexOf(ueberschrift);
|
||||
if (ab < 0) return null;
|
||||
const treffer = text.slice(ab).match(/```(?:bash|sh)?\n([\s\S]*?)```/);
|
||||
return treffer?.[1] ?? null;
|
||||
};
|
||||
|
||||
const skripte = (block) => [...block.matchAll(/pnpm ([a-z:]+)/g)].map((m) => m[1]).sort();
|
||||
|
||||
const quellen = [
|
||||
["CLAUDE.md", "## Vor jedem Commit"],
|
||||
["README.md", "### Qualitätsschranken"],
|
||||
];
|
||||
|
||||
const bloecke = quellen.map(([datei, ueberschrift]) => {
|
||||
const block = blockNach(lies(datei), ueberschrift);
|
||||
if (block === null) melde(`${datei}: kein Befehlsblock unter "${ueberschrift}" gefunden.`);
|
||||
return [datei, block];
|
||||
});
|
||||
|
||||
if (bloecke.every(([, block]) => block !== null)) {
|
||||
const [[dateiA, blockA], [dateiB, blockB]] = bloecke;
|
||||
const a = skripte(blockA);
|
||||
const b = skripte(blockB);
|
||||
if (a.join(" ") !== b.join(" ")) {
|
||||
melde(
|
||||
`Die Schranken laufen auseinander: ${dateiA} nennt [${a.join(", ")}], ` +
|
||||
`${dateiB} nennt [${b.join(", ")}].`,
|
||||
);
|
||||
}
|
||||
for (const [datei, block] of bloecke) {
|
||||
if (!/docker compose -f docker-compose\.test\.yml up .*ldap/.test(block)) {
|
||||
melde(
|
||||
`${datei}: der Schranken-Block nennt den LDAP-Container nicht. ` +
|
||||
`Ohne ihn ueberspringt die Suite den Verzeichnis-Abgleich, und der Lauf sieht gruen aus.`,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ---- Ergebnis --------------------------------------------------------------
|
||||
if (befunde.length > 0) {
|
||||
console.error(`\nDokumentation und Code laufen auseinander (${befunde.length}):\n`);
|
||||
|
||||
Reference in New Issue
Block a user