In Markdown-Dateien sollen horizontale Trennlinien (---, ***, ___) nicht als optische Sektionstrenner verwendet werden — Struktur trägt allein die Überschriftenhierarchie. Die Vereinbarung war bisher nur als Memory persistiert; dieser PR setzt sie maschinell durch.
Änderungen
Datei
Zweck
hooks/markdownlint-rules/no-hr.js
Custom Rule: erkennt jedes hr-Token (markdown-it) und liefert fixInfo zum Entfernen
.markdownlint-cli2.jsonc
aktiviert no-hr, deaktiviert MD013 (Zeilenlänge), MD040 (Sprache im Code-Block), MD041 (erste Zeile H1), MD060 (Tabellen-Style) — jeweils inline begründet
hooks/auto-format.sh
neuer md|markdown-Zweig; ruft markdownlint-cli2 --fix zweimal auf (zweiter Pass räumt MD012-Doppel-Leerzeilen auf, die nach HR-Entfernung entstehen)
bootstrap.sh
installiert markdownlint-cli2 idempotent via npm -g (npm wird bei Bedarf vorab über apt nachgezogen)
Akzeptanzkriterien
Custom Rule erkennt alle drei HR-Stile — verifiziert mit Test-Markdown, das --- und *** enthält: beide werden gemeldet, jeweils mit no-hr/no-horizontal-rules und der dt. Detail-Message.
--fix entfernt die Trennlinien — nach Hook-Lauf (zwei --fix-Pässe) im Test-Markdown 0 Fehler, Doppel-Leerzeilen sind aufgeräumt.
Bestehende ~/Darktable/README.md bleibt sauber — nach Konfig-Anpassung (MD040/MD060 aus) lintet sie mit 0 Fehlern; --fix produziert keinen Diff.
Hook ist robust — wenn markdownlint-cli2 nicht installiert ist, wird der Schritt übersprungen (command -v-Check); Lint-Output wird verworfen, Exit-Code geschluckt.
bootstrap idempotent — bei vorhandenem Tool nur Versions-Echo, sonst sudo npm install -g markdownlint-cli2 (nimmt npm via apt nach, falls nötig).
Kein sed — die HR-Entfernung läuft ausschließlich über die Custom Rule mit fixInfo.
Verifikation
# Test-Datei erzeugt mit gemischten HR-Stilen, danach:for _ in 1 2;do
npx --yes markdownlint-cli2 \
--config /mnt/projekte/claude-workflow/.markdownlint-cli2.jsonc \
--fix /tmp/test_full.md
done# Ergebnis: 0 errors, alle --- und *** entfernt, einfache Leerzeilen zwischen Abschnitten.
Nicht enthalten
dotfiles/settings.json enthält lokal eine nicht-committete Änderung ("model": "opus") — bewusst nicht in diesen PR aufgenommen.
Keine Anpassung der globalen dotfiles/CLAUDE.md; falls die Regel auch dort dokumentiert werden soll, in einem Folge-PR.
## Kontext
In Markdown-Dateien sollen horizontale Trennlinien (`---`, `***`, `___`) nicht als optische Sektionstrenner verwendet werden — Struktur trägt allein die Überschriftenhierarchie. Die Vereinbarung war bisher nur als Memory persistiert; dieser PR setzt sie maschinell durch.
## Änderungen
| Datei | Zweck |
|---|---|
| `hooks/markdownlint-rules/no-hr.js` | Custom Rule: erkennt jedes `hr`-Token (markdown-it) und liefert `fixInfo` zum Entfernen |
| `.markdownlint-cli2.jsonc` | aktiviert `no-hr`, deaktiviert `MD013` (Zeilenlänge), `MD040` (Sprache im Code-Block), `MD041` (erste Zeile H1), `MD060` (Tabellen-Style) — jeweils inline begründet |
| `hooks/auto-format.sh` | neuer `md\|markdown`-Zweig; ruft `markdownlint-cli2 --fix` zweimal auf (zweiter Pass räumt MD012-Doppel-Leerzeilen auf, die nach HR-Entfernung entstehen) |
| `bootstrap.sh` | installiert `markdownlint-cli2` idempotent via `npm -g` (npm wird bei Bedarf vorab über apt nachgezogen) |
## Akzeptanzkriterien
- [x] **Custom Rule erkennt alle drei HR-Stile** — verifiziert mit Test-Markdown, das `---` und `***` enthält: beide werden gemeldet, jeweils mit `no-hr/no-horizontal-rules` und der dt. Detail-Message.
- [x] **`--fix` entfernt die Trennlinien** — nach Hook-Lauf (zwei `--fix`-Pässe) im Test-Markdown 0 Fehler, Doppel-Leerzeilen sind aufgeräumt.
- [x] **Bestehende `~/Darktable/README.md` bleibt sauber** — nach Konfig-Anpassung (MD040/MD060 aus) lintet sie mit 0 Fehlern; `--fix` produziert keinen Diff.
- [x] **Hook ist robust** — wenn `markdownlint-cli2` nicht installiert ist, wird der Schritt übersprungen (`command -v`-Check); Lint-Output wird verworfen, Exit-Code geschluckt.
- [x] **bootstrap idempotent** — bei vorhandenem Tool nur Versions-Echo, sonst `sudo npm install -g markdownlint-cli2` (nimmt npm via apt nach, falls nötig).
- [x] **Kein `sed`** — die HR-Entfernung läuft ausschließlich über die Custom Rule mit `fixInfo`.
## Verifikation
```bash
# Test-Datei erzeugt mit gemischten HR-Stilen, danach:
for _ in 1 2; do
npx --yes markdownlint-cli2 \
--config /mnt/projekte/claude-workflow/.markdownlint-cli2.jsonc \
--fix /tmp/test_full.md
done
# Ergebnis: 0 errors, alle --- und *** entfernt, einfache Leerzeilen zwischen Abschnitten.
```
## Nicht enthalten
- `dotfiles/settings.json` enthält lokal eine nicht-committete Änderung (`"model": "opus"`) — bewusst nicht in diesen PR aufgenommen.
- Keine Anpassung der globalen `dotfiles/CLAUDE.md`; falls die Regel auch dort dokumentiert werden soll, in einem Folge-PR.
Erzwingt Struktur über Überschriften statt horizontaler Trennlinien.
- Custom Rule hooks/markdownlint-rules/no-hr.js erkennt --- / *** / ___
über das markdown-it-Token "hr" und liefert fixInfo zum Entfernen.
- .markdownlint-cli2.jsonc aktiviert no-hr und deaktiviert MD013/MD040/MD041/MD060
(Begründung jeweils inline kommentiert).
- hooks/auto-format.sh erweitert um md|markdown-Zweig mit zwei --fix-Pässen
(zweiter Pass räumt MD012-Doppel-Leerzeilen auf, die nach HR-Entfernung entstehen).
- bootstrap.sh installiert markdownlint-cli2 idempotent via npm -g.
Verifiziert:
- Custom Rule meldet --- und *** als Verstoß.
- Zwei --fix-Pässe entfernen Trennlinien und überflüssige Leerzeilen, Endzustand 0 Fehler.
- Bestehende README in /home/martin/Darktable/README.md ist nach Konfig-Anpassung 0 Fehler.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
martin
merged commit 8839d8f83e into main2026-04-22 10:11:54 +02:00
martin
deleted branch feat/markdown-no-hr-hook2026-04-22 10:11:54 +02:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Kontext
In Markdown-Dateien sollen horizontale Trennlinien (
---,***,___) nicht als optische Sektionstrenner verwendet werden — Struktur trägt allein die Überschriftenhierarchie. Die Vereinbarung war bisher nur als Memory persistiert; dieser PR setzt sie maschinell durch.Änderungen
hooks/markdownlint-rules/no-hr.jshr-Token (markdown-it) und liefertfixInfozum Entfernen.markdownlint-cli2.jsoncno-hr, deaktiviertMD013(Zeilenlänge),MD040(Sprache im Code-Block),MD041(erste Zeile H1),MD060(Tabellen-Style) — jeweils inline begründethooks/auto-format.shmd|markdown-Zweig; ruftmarkdownlint-cli2 --fixzweimal auf (zweiter Pass räumt MD012-Doppel-Leerzeilen auf, die nach HR-Entfernung entstehen)bootstrap.shmarkdownlint-cli2idempotent vianpm -g(npm wird bei Bedarf vorab über apt nachgezogen)Akzeptanzkriterien
---und***enthält: beide werden gemeldet, jeweils mitno-hr/no-horizontal-rulesund der dt. Detail-Message.--fixentfernt die Trennlinien — nach Hook-Lauf (zwei--fix-Pässe) im Test-Markdown 0 Fehler, Doppel-Leerzeilen sind aufgeräumt.~/Darktable/README.mdbleibt sauber — nach Konfig-Anpassung (MD040/MD060 aus) lintet sie mit 0 Fehlern;--fixproduziert keinen Diff.markdownlint-cli2nicht installiert ist, wird der Schritt übersprungen (command -v-Check); Lint-Output wird verworfen, Exit-Code geschluckt.sudo npm install -g markdownlint-cli2(nimmt npm via apt nach, falls nötig).sed— die HR-Entfernung läuft ausschließlich über die Custom Rule mitfixInfo.Verifikation
Nicht enthalten
dotfiles/settings.jsonenthält lokal eine nicht-committete Änderung ("model": "opus") — bewusst nicht in diesen PR aufgenommen.dotfiles/CLAUDE.md; falls die Regel auch dort dokumentiert werden soll, in einem Folge-PR.