Что такое rumdl?
rumdl — это линтер и форматтер Markdown, написанный на Rust. Он реализует тот самый набор правил, который все уже знают по markdownlint: проверки от MD001 до MD059 для уровней заголовков, отступов в списках, длины строк, стиля блоков кода, синтаксиса ссылок и висящих пробелов, — и прогоняет их по дереву документации за миллисекунды, а не за секунды. У большинства этих правил есть исправление, поэтому rumdl check --fix чинит то, о чём сообщает, а не оставляет вам список, а rumdl fmt переформатирует файл целиком. Конфигурация — это файл rumdl.toml или таблица [tool.rumdl] в pyproject.toml, уже существующий .markdownlint.json переводится командой rumdl import, а rumdl server говорит на Language Server Protocol, так что тот же самый бинарник подчёркивает проблемы прямо в редакторе. Считайте это тем же, чем Ruff стал для Python, только применительно к Markdown.
rumdl.toml, написанный по сегодняшней документации, может называть параметры, которые старая сборка молча игнорирует. Ни Debian, ни Ubuntu не пакуют rumdl вообще, так что свежая сборка здесь не роскошь: это единственный способ получить его через apt.
⚡ Ключевые возможности rumdl
🏎️ Правила markdownlint на скорости Rust
Знакомые проверки от MD001 до MD059, которые выполняет скомпилированный бинарник, и никакого интерпретатора запускать не надо. Дерево документации, ради которого в CI держали отдельный шаг, проверяется достаточно быстро, чтобы гонять проверку на каждом сохранении.
🔧 Исправления, а не только жалобы
rumdl check --fix чинит те нарушения, у которых есть безопасное исправление: пунктуацию заголовков, маркеры и отступы списков, пустые строки вокруг блоков, висящие пробелы, стиль ограждений — на месте и сразу по всему дереву.
🖊️ И ещё форматтер
rumdl fmt переформатирует Markdown так же, как это делает форматтер кода, и вид файла перестаёт быть замечанием на ревью. С --check он превращается в проверку CI, которая ничего не меняет.
🔌 Интеграция с редактором внутри
rumdl server — это Language Server, поэтому VS Code, Neovim, Helix и Zed получают ровно те же диагностики и те же исправления, что и командная строка, из того единственного бинарника, который вы поставили.
♻️ Сохраняет вашу конфигурацию markdownlint
rumdl import читает существующий .markdownlint.json или .markdownlintrc и пишет равнозначный rumdl.toml, так что перевод репозитория — это одна команда, а не ревизия всех правил.
📖 Правила, которые объясняют себя сами
rumdl rule перечисляет все проверки, а rumdl explain MD013 описывает одну: что она исправляет и как её настроить, — чтобы никому не приходилось гадать, что означал код в логе CI.
apt upgrade держит вас на последней версии.
📦 Установка из deb.griffo.io
Шаг 1: Добавить репозиторий
sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://deb.griffo.io/EA0F721D231FDD3A0A17B9AC7808B4DD62C41256.asc | sudo gpg --dearmor --yes -o /etc/apt/keyrings/deb.griffo.io.gpg
echo "deb [signed-by=/etc/apt/keyrings/deb.griffo.io.gpg] https://deb.griffo.io/apt $(lsb_release -sc 2>/dev/null) main" | sudo tee /etc/apt/sources.list.d/deb.griffo.io.list > /dev/null
sudo apt updateinstall -d -m 0755 /etc/apt/keyrings
curl -fsSL https://deb.griffo.io/EA0F721D231FDD3A0A17B9AC7808B4DD62C41256.asc | gpg --dearmor --yes -o /etc/apt/keyrings/deb.griffo.io.gpg
echo "deb [signed-by=/etc/apt/keyrings/deb.griffo.io.gpg] https://deb.griffo.io/apt $(lsb_release -sc 2>/dev/null) main" | tee /etc/apt/sources.list.d/deb.griffo.io.list > /dev/null
apt updatesudo apt install extrepo
sudo extrepo enable griffo
sudo apt update🆓 Есть вечно бесплатное зеркало. deb-free.griffo.io раздаёт пакеты бесплатно навсегда — без аккаунта, без подписки, не более 2 месяцев позади upstream, исправления безопасности сразу. Сейчас там cliamp, Ghostty, lazydocker, Oh My Posh и Zed; rumdl среди них нет, поэтому репозиторий выше — единственный способ установить его сегодня; попросите, и его можно добавить.
🧩 О варианте extrepo. extrepo — штатный инструмент Debian для внешних репозиториев: он создаёт файл sources и устанавливает ключ подписи, предварительно сверив его с подписанными метаданными. Этот репозиторий зарегистрирован в нём как griffo, а бесплатное навсегда зеркало — как griffo-free, поэтому в Debian (bookworm, trixie, forky и sid) команды выше и есть вся настройка.
extrepo настраивает только файл sources и ключ — учётные данные подписки по-прежнему прописываются в /etc/apt/auth.conf.d/deb.griffo.io.conf. Ubuntu не поддерживается, так как extrepo публикует метаданные только для выпусков Debian: там используйте команды с sudo или от root.
Шаг 2: Установить rumdl
# Установить последнюю версию rumdl — это один бинарник,
# которому не нужны ни Node, ни Python
sudo apt install rumdl
# Проверить установку
rumdl --version# Установить последнюю версию rumdl — это один бинарник,
# которому не нужны ни Node, ни Python
apt install rumdl
# Проверить установку
rumdl --versionШаг 3: Первый запуск
# Проверить все файлы Markdown в текущем каталоге и ниже
rumdl check .
# Исправить всё, для чего есть безопасное исправление
rumdl check --fix .
# Записать стартовый rumdl.toml, который можно править
rumdl init
# Посмотреть, что означает код правила
rumdl explain MD013
# Все подкоманды и флаги
rumdl --help🎯 Базовые примеры использования
Проверка и исправление:
# Один файл, каталог или шаблон
rumdl check README.md
rumdl check docs/
rumdl check "**/*.md"
# Исправить на месте, а потом показать то, что осталось
rumdl check --fix .
# Выключить одно шумное правило только для этого запуска
rumdl check --disable MD013 .
# Запустить только те правила, которые важны прямо сейчас
rumdl check --enable MD001,MD009,MD047 .
# Машиночитаемый вывод для того шага CI, который превращает
# нарушения в аннотации
rumdl check --output-format json .Форматирование:
# Переформатировать файлы на месте
rumdl fmt docs/
# Ничего не записывать и упасть при расхождении —
# это форма для CI
rumdl fmt --check docs/
# Посмотреть изменения до того, как их принять
rumdl fmt --diff docs/Конфигурация и правила:
# Создать rumdl.toml в этом репозитории
rumdl init
# Перевести конфигурацию markdownlint, которая у вас уже есть
rumdl import .markdownlint.json
# Какая конфигурация действует на самом деле и откуда взята
rumdl config
# Перечислить все правила, а потом прочитать одно целиком
rumdl rule
rumdl explain MD024
# Дополнения оболочки, записанные туда, откуда их читает
# сама оболочка
rumdl completions bash | sudo tee /etc/bash_completion.d/rumdl > /dev/null# Создать rumdl.toml в этом репозитории
rumdl init
# Перевести конфигурацию markdownlint, которая у вас уже есть
rumdl import .markdownlint.json
# Какая конфигурация действует на самом деле и откуда взята
rumdl config
# Перечислить все правила, а потом прочитать одно целиком
rumdl rule
rumdl explain MD024
# Дополнения оболочки, записанные туда, откуда их читает
# сама оболочка
rumdl completions bash | tee /etc/bash_completion.d/rumdl > /dev/null🔧 Интеграции
rumdl сделан так, чтобы вставать ровно на те места, где уже сидит markdownlint:
- Ваш редактор:
rumdl server— это Language Server, так что Neovim, Helix, VS Code и Zed показывают диагностики прямо в тексте и применяют исправления как действия над кодом - Конфигурации markdownlint:
rumdl importпревращает.markdownlint.jsonили.markdownlintrcвrumdl.toml, а коды правил остаются теми же, о которых ваша команда и так спорит - pyproject.toml: таблица
[tool.rumdl]держит настройки рядом с конфигурацией Ruff и pytest, вместо того чтобы добавлять ещё один файл с точкой в начале - CI и pre-commit:
rumdl check .завершается ненулевым кодом при нарушениях, аrumdl fmt --checkсторожит форматирование, и на агенте не надо сначала ставить рантайм Node или Python - Генераторы статических сайтов: исходники документации для MkDocs, Hugo, Docusaurus и mdBook — это обычный Markdown, поэтому та же проверка проходит по ним раньше, чем начнётся сборка
🚀 Почему стоит выбрать deb.griffo.io?
- Официальный Debian: не содержит rumdl —
apt install rumdlна стандартной системе не сработает - npm или pip: работает, но привязывает проверку Markdown к окружению Node или Python и переустанавливается в каждом проекте и в каждом образе CI
- Сборка из исходников: свежо, но требует тулчейн Rust на каждой машине и оставляет бинарник, о котором apt ничего не знает
- deb.griffo.io: последняя версия с автоматическими обновлениями
- ✅ Единственный источник apt: rumdl нет ни в архивах Debian, ни в архивах Ubuntu; этот репозиторий пакует официальный выпуск upstream
- ✅ На всю систему и без рантайма: один
/usr/bin/rumdlна все репозитории машины, без npm install и без виртуального окружения за спиной - ✅ Автоматические обновления: пакеты обновляются в течение нескольких часов после релиза upstream, так что новые правила и исправления приходят обычным
apt upgrade - ✅ Полный пакет: официальная сборка upstream для Linux, установленная как
/usr/bin/rumdl, ничего не добавлено и не пропатчено - ✅ Честные зависимости: статически слинкованный бинарник на Rust, которому не нужно ничего доустанавливать, чтобы проверять, исправлять, форматировать или работать сервером
- ✅ Две архитектуры: amd64 и arm64, так что один и тот же пакет закрывает и ноутбук, и серверы, и ваши arm64-агенты сборки
- ✅ Много дистрибутивов: работает на Bookworm, Trixie, Forky и Sid
- ✅ Простое обслуживание: обновления обычными командами apt
📦 Репозиторий сборки пакета
Пакеты для Debian собираются и поддерживаются автоматически в этом репозитории GitHub:
- 📐 rumdl-debian - Сборки последних выпусков
🔗 Похожие пакеты
Также доступны в deb.griffo.io:
- Ruff - Та же идея для исходников на Python: линтер и форматтер на Rust в одном бинарнике
- uv - Быстрая упаковка Python на Rust, для тех проектов, чью документацию вы проверяете
- Neovim - Редактор, который поговорит с
rumdl serverи покажет диагностики прямо при наборе - ripgrep - Для поиска по тому же дереву Markdown, на который линтер ответить не может
--fix и получать в редакторе ровно те же предупреждения, какие выдаст сборка.