"""Simple Markdown link checker for local docs/ files. Checks only local file links (relative paths) and reports missing targets. Run from the repository root using the project's Python environment. """ import re from pathlib import Path ROOT = Path(__file__).resolve().parent.parent DOCS = ROOT / 'docs' MD_LINK_RE = re.compile(r"\[([^\]]+)\]\(([^)]+)\)") errors = [] for md in DOCS.rglob('*.md'): text = md.read_text(encoding='utf-8') for m in MD_LINK_RE.finditer(text): label, target = m.groups() # skip URLs if target.startswith('http://') or target.startswith('https://') or target.startswith('#'): continue # strip anchors target_path = target.split('#')[0] # if link is to a directory index, allow candidate = (md.parent / target_path).resolve() if candidate.exists(): continue # check common implicit index: target/ -> target/README.md or target/index.md candidate_dir = md.parent / target_path if candidate_dir.is_dir(): if (candidate_dir / 'README.md').exists() or (candidate_dir / 'index.md').exists(): continue errors.append((str(md.relative_to(ROOT)), target, label)) if errors: print('Broken local links found:') for src, tgt, label in errors: print(f'- {src} -> {tgt} ({label})') exit(2) print('No broken local links detected.')