feat: Markdown-Hook mit Custom-Rule "no-hr" #11

Merged
martin merged 1 commits from feat/markdown-no-hr-hook into main 2026-04-22 10:11:54 +02:00
Owner

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

  • 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.
martin added 1 commit 2026-04-22 10:11:13 +02:00
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 main 2026-04-22 10:11:54 +02:00
martin deleted branch feat/markdown-no-hr-hook 2026-04-22 10:11:54 +02:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: martin/claude-workflow#11