Files
airflow/dev/system_tests
Jarek Potiuk 5936cf8b71 Add lychee prek hook (offline mode) and fix internal markdown links (#66356)
* Add lychee prek hook (offline mode) and fix internal markdown links

* Add the lychee link checker as a prek hook in offline mode
  (`--offline --no-progress --root-dir .`) so we catch broken
  intra-repo links in Markdown files before they land. The hook
  excludes auto-generated content (the Python OpenAPI client docs
  under `clients/python/`, JS `node_modules`, build output) and runs
  on every Markdown file otherwise. The lychee binary version is
  pinned via `LYCHEE_VERSION=0.24.2` as the first arg, alongside the
  SHA-pinned `rev`, so we keep the airflow SHA-pinning convention
  while satisfying lychee's pre-commit script which expects a
  version tag.

* Fix the 13 broken links the hook surfaced on `main`:

  - Add minimum-stub locale guideline files for active locales that
    were referenced from the airflow-translations skill table but had
    no file yet (`ar`, `it`, `tr`). The stub points the reader at the
    parent SKILL.md so the global rules apply until a real guide is
    written.
  - `airflow-core/src/airflow/_shared/{AGENTS,README}.md`: correct the
    `../../shared` path (which resolved inside `airflow-core/`) to
    `../../../../shared` so it lands on the repo-root `shared/` dir.
  - `airflow-core/src/airflow/api_fastapi/execution_api/AGENTS.md`:
    add the missing `../` so the `contributing-docs/...` link resolves
    to repo root instead of `airflow-core/contributing-docs/`.
  - `airflow-core/src/airflow/ui/tests/e2e/README.md`: replace the
    reference to a no-longer-existing `dag-trigger.spec.ts` example
    with the existing `dag-runs.spec.ts`.
  - `dev/breeze/doc/ci/02_images.md`: docs were moved from
    `docs/docker-stack/` to `docker-stack-docs/`; update the link.
  - `dev/README_RELEASE_HELM_CHART.md`: helm-chart docs moved from
    `docs/helm-chart/` to `chart/docs/`; update the link.
  - `dev/system_tests/README.md`: drop the dangling reference to a
    `dev/requirements.txt` that no longer exists; replace with a
    `uv run --with PyGithub --with rich-click --with rich` invocation
    that picks up the script's actual dependencies.

* Switch lychee hook to docker variant; check anchor fragments too

Two follow-ups for #66356:

* CI failure: the `lychee` script-based hook auto-installs the
  pre-built `lychee` binary via cargo-binstall, but lychee 0.24.x
  binaries are linked against `GLIBC_2.38` / `GLIBC_2.39`, which
  the ubuntu-22.04 CI runners do not ship (they have glibc 2.35).
  Switch to the upstream `lychee-docker` variant — it runs the
  official `lycheeverse/lychee` Docker image and bundles its own
  libc, so it is portable across runners.

* Reviewer feedback (@parkhojeong): pass `--include-fragments` so
  lychee also reports broken Markdown anchor fragments. That
  surfaced three real broken fragments which are also fixed here:

  - `.github/skills/pr-triage/actions.md`: add explicit
    `<a id="mark-ready"></a>` and `<a id="mark-ready-with-ping"></a>`
    anchors before the `## ` headings, since GitHub's auto-generated
    anchors include the full descriptive heading (e.g.
    `mark-ready--add-ready-for-maintainer-review-label`) rather than
    the short action name that the existing cross-references expect.
  - `dev/README_RELEASE_AIRFLOW.md`: the link was pointing at
    `#removing-or-replacing-ownership` but the section is called
    "Relinquishing translation/code ownership" — fix to
    `#relinquishing-translationcode-ownership`.

The `LYCHEE_VERSION=0.24.2` arg used by the script-based hook is
no longer needed for the docker variant; the docker entry pins the
version itself.
2026-05-05 18:47:17 +03:00
..

Small tool to update status of all AIP-47 issues.

Simply:

  1. Set GITHUB_TOKEN to a repo-writeable token.

  2. Run the script via uv (it pulls in the few third-party deps it needs — PyGithub, rich-click, rich):

uv run --with PyGithub --with rich-click --with rich python dev/system_tests/update_issue_status.py

It will automatically update status of all the AIP-47 issues based on the presence of files in the repo.

You can also run it with --dry-run mode - useful when you have no write permission to the repository. You can generate a read-only token (or hope you will not hit rate limits if you do not have one) In this case it will only show what would have happened if you had the access and print stats.