Область проверки
Создайте CLI только для чтения для проверки ссылок в Markdown-документах. Команда принимает корневую директорию, необязательный --file для проверки одного документа внутри неё и --strict для ненулевого кода завершения при найденных проблемах. Автоматически обходите только файлы с расширением .md, не следуйте каталогам и файлам через символические ссылки и не выходите за пределы корня. Проверяйте только inline-ссылки вида текст и заголовки Markdown, из которых строятся локальные якоря. Не анализируйте reference-ссылки, изображения, HTML, автоссылки и кодовые блоки; внешние URL с http, https и mailto игнорируйте.
Для локального назначения отделите необязательный фрагмент после #, разрешите percent-encoding, затем разрешите путь относительно каталога исходного Markdown. Пустой путь с фрагментом означает текущий документ. Если путь не задан, цель документа — проверяемый Markdown-файл; если задан путь без расширения и соответствующий файл не найден, дополнительно попробуйте тот же путь с .md. Путь должен остаться внутри корня после очистки сегментов. Сначала диагностируйте отсутствующий файл, затем при наличии фрагмента проверьте якорь. Якорь заголовка формируется из текста заголовка: нижний регистр, удаление пунктуации, замена пробельных последовательностей дефисом; дублирующиеся якоря получают суффиксы -1, -2 по порядку.
Для каждой проблемы выведите относительный файл источника, номер строки, тип проблемы и цель; итоговый порядок — путь, строка, тип. Без --strict находки печатаются, но код возврата успешный; с --strict ошибки ссылок дают ненулевой код. Ошибка обхода или чтения всегда ненулевая. Ничего не исправляйте и не создавайте. Опишите пределы упрощённого парсинга и добавьте тесты с временной директорией.
Структура программы
Разделите запуск CLI, чтение документов и проверку ссылок. В отдельных файлах package main реализуйте разбор inline-ссылок и заголовков, нормализацию якоря, разрешение локальной цели и форматирование диагностики. Передавайте содержимое и корень явными аргументами; тесты этих функций не должны запускать CLI или изменять файлы.