name: Markdown link check # Verify every internal markdown link in the repo resolves to an existing # file (or anchor). # # Triggers: # - "/links" as a PR comment (manual, on the PR branch) # - Weekly cron Mon 05:00 UTC (catches link rot without any PR activity) # - workflow_dispatch (manual run on any branch) on: issue_comment: types: [created] schedule: - cron: "0 5 * * 1" # Monday 05:00 UTC weekly link-rot check workflow_dispatch: {} jobs: check: if: | github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' || (github.event_name == 'issue_comment' && github.event.issue.pull_request != null && contains(github.event.comment.body, '/links')) runs-on: eulernest container: image: git.eulernest.eu/conformallab/ci-cpp:latest steps: - uses: actions/checkout@v4 with: ref: ${{ github.event_name == 'issue_comment' && format('refs/pull/{0}/head', github.event.issue.number) || github.ref }} # ── Pure-python internal link check (no external network needed) ──── # We use the same logic that found the 2 broken links before the # reviewer meeting: parse every [text](path) link, check that the # target file exists relative to the source file's directory. Skips # http(s)://, mailto:, and pure-anchor (#fragment) links. - name: Internal link check (all *.md files) run: python3 scripts/check-markdown-links.py