This is an automated email from the ASF dual-hosted git repository.
shahar1 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new 5936cf8b71a Add lychee prek hook (offline mode) and fix internal
markdown links (#66356)
5936cf8b71a is described below
commit 5936cf8b71a6c131baf7886abc992e93ffa67556
Author: Jarek Potiuk <[email protected]>
AuthorDate: Tue May 5 17:47:17 2026 +0200
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.
---
.github/skills/airflow-translations/locales/ar.md | 9 +++++++
.github/skills/airflow-translations/locales/it.md | 9 +++++++
.github/skills/airflow-translations/locales/tr.md | 9 +++++++
.github/skills/pr-triage/actions.md | 4 +++
.pre-commit-config.yaml | 29 ++++++++++++++++++++++
airflow-core/src/airflow/_shared/AGENTS.md | 2 +-
airflow-core/src/airflow/_shared/README.md | 2 +-
.../airflow/api_fastapi/execution_api/AGENTS.md | 2 +-
airflow-core/src/airflow/ui/tests/e2e/README.md | 2 +-
dev/README_RELEASE_AIRFLOW.md | 2 +-
dev/README_RELEASE_HELM_CHART.md | 2 +-
dev/breeze/doc/ci/02_images.md | 2 +-
dev/system_tests/README.md | 9 +++----
13 files changed, 71 insertions(+), 12 deletions(-)
diff --git a/.github/skills/airflow-translations/locales/ar.md
b/.github/skills/airflow-translations/locales/ar.md
new file mode 100644
index 00000000000..ce006214506
--- /dev/null
+++ b/.github/skills/airflow-translations/locales/ar.md
@@ -0,0 +1,9 @@
+<!-- SPDX-License-Identifier: Apache-2.0
+ https://www.apache.org/licenses/LICENSE-2.0 -->
+
+# Arabic (`ar`) translation guidelines
+
+No locale-specific guidance has been authored yet for Arabic. Until this file
+is filled in, follow the global rules in the parent
+[airflow-translations SKILL.md](../SKILL.md). Contributions to this guide are
+welcome.
diff --git a/.github/skills/airflow-translations/locales/it.md
b/.github/skills/airflow-translations/locales/it.md
new file mode 100644
index 00000000000..4fb8a351e6b
--- /dev/null
+++ b/.github/skills/airflow-translations/locales/it.md
@@ -0,0 +1,9 @@
+<!-- SPDX-License-Identifier: Apache-2.0
+ https://www.apache.org/licenses/LICENSE-2.0 -->
+
+# Italian (`it`) translation guidelines
+
+No locale-specific guidance has been authored yet for Italian. Until this file
+is filled in, follow the global rules in the parent
+[airflow-translations SKILL.md](../SKILL.md). Contributions to this guide are
+welcome.
diff --git a/.github/skills/airflow-translations/locales/tr.md
b/.github/skills/airflow-translations/locales/tr.md
new file mode 100644
index 00000000000..5a93679c674
--- /dev/null
+++ b/.github/skills/airflow-translations/locales/tr.md
@@ -0,0 +1,9 @@
+<!-- SPDX-License-Identifier: Apache-2.0
+ https://www.apache.org/licenses/LICENSE-2.0 -->
+
+# Turkish (`tr`) translation guidelines
+
+No locale-specific guidance has been authored yet for Turkish. Until this file
+is filled in, follow the global rules in the parent
+[airflow-translations SKILL.md](../SKILL.md). Contributions to this guide are
+welcome.
diff --git a/.github/skills/pr-triage/actions.md
b/.github/skills/pr-triage/actions.md
index f03ed686a47..b030365958f 100644
--- a/.github/skills/pr-triage/actions.md
+++ b/.github/skills/pr-triage/actions.md
@@ -112,6 +112,8 @@ recover from.
---
+<a id="mark-ready"></a>
+
## `mark-ready` — add `ready for maintainer review` label
**Mandatory pre-mutation check.** Before adding the label, the
@@ -160,6 +162,8 @@ error; this is the only action of the skill whose sole
purpose
---
+<a id="mark-ready-with-ping"></a>
+
## `mark-ready-with-ping` — promote a likely-addressed PR + ping reviewers
A composite of `mark-ready` plus a `ping` comment. Used when
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 295688d115f..6c0a97b801c 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -400,6 +400,35 @@ repos:
files: ^\.github/workflows/.*$|^\.github/actions/.*$
require_serial: true
entry: zizmor
+ - repo: https://github.com/lycheeverse/lychee
+ rev: e85aaf5524b2f808e63bae55e594c843220f10f2 # frozen: lychee-v0.24.2
+ hooks:
+ # Use the upstream `lychee-docker` variant rather than the script-based
+ # `lychee` hook because the prebuilt lychee binaries that the script
+ # downloads are linked against newer glibc than ubuntu-22.04 runners
+ # ship with (`GLIBC_2.38` / `GLIBC_2.39` not found at runtime). The
+ # docker variant runs the official `lycheeverse/lychee` image, which
+ # bundles its own libc and is portable across runners.
+ - id: lychee-docker
+ name: Check internal Markdown links with lychee (offline mode)
+ description: >-
+ Validate intra-repo links in Markdown files (relative paths, anchors,
+ and fragments) without making any HTTP requests. Auto-generated
client
+ docs are excluded because they are regenerated from OpenAPI specs.
+ types: [markdown]
+ args:
+ - --offline
+ - --no-progress
+ - --root-dir
+ - .
+ - --include-fragments
+ exclude: |
+ (?x)
+ ^clients/python/|
+ ^.*/openapi-gen/|
+ ^.*/node_modules/|
+ ^\.build/|
+ ^generated/
- repo: local
# Note that this is the 2nd "local" repo group in the
.pre-commit-config.yaml file. This is because
# we try to minimize the number of passes that must happen to apply some
of the changes
diff --git a/airflow-core/src/airflow/_shared/AGENTS.md
b/airflow-core/src/airflow/_shared/AGENTS.md
index 1947c43f88f..3b99217a566 100644
--- a/airflow-core/src/airflow/_shared/AGENTS.md
+++ b/airflow-core/src/airflow/_shared/AGENTS.md
@@ -5,7 +5,7 @@
# The `_shared` package — Agent Instructions
Each shared library is a symbolic link to the library package sources from the
shared library
-located in the [shared folder](../../shared). In the shared folder each
library is a separate
+located in the [shared folder](../../../../shared). In the shared folder each
library is a separate
distribution that has it's own tests and dependencies. Those dependencies and
links to those
libraries are maintained by `prek` hook automatically.
diff --git a/airflow-core/src/airflow/_shared/README.md
b/airflow-core/src/airflow/_shared/README.md
index 658af6b5d97..e00b1dc6234 100644
--- a/airflow-core/src/airflow/_shared/README.md
+++ b/airflow-core/src/airflow/_shared/README.md
@@ -32,4 +32,4 @@ library code is stored in "shared" folder) - and at the same
time we can have di
same shared library in different packages when for example `airflow-core` and
`task-sdk` package are
installed together in different version.
-You can read about it in [the shared README.md](../../shared/README.md)
document.
+You can read about it in [the shared README.md](../../../../shared/README.md)
document.
diff --git a/airflow-core/src/airflow/api_fastapi/execution_api/AGENTS.md
b/airflow-core/src/airflow/api_fastapi/execution_api/AGENTS.md
index c72bd3aaafc..aff91c070d9 100644
--- a/airflow-core/src/airflow/api_fastapi/execution_api/AGENTS.md
+++ b/airflow-core/src/airflow/api_fastapi/execution_api/AGENTS.md
@@ -62,7 +62,7 @@ Adding a new Execution API feature touches multiple packages.
All of these must
- Dag processor handler: `airflow-core/src/airflow/dag_processing/processor.py`
- Triggerer handler: `airflow-core/src/airflow/jobs/triggerer_job_runner.py`
- Task SDK generated models:
`task-sdk/src/airflow/sdk/api/datamodels/_generated.py`
-- Full versioning guide:
[`contributing-docs/19_execution_api_versioning.rst`](../../../../contributing-docs/19_execution_api_versioning.rst)
+- Full versioning guide:
[`contributing-docs/19_execution_api_versioning.rst`](../../../../../contributing-docs/19_execution_api_versioning.rst)
## Token Scope Infrastructure
diff --git a/airflow-core/src/airflow/ui/tests/e2e/README.md
b/airflow-core/src/airflow/ui/tests/e2e/README.md
index 9e6eb1db94f..4c62116b1df 100644
--- a/airflow-core/src/airflow/ui/tests/e2e/README.md
+++ b/airflow-core/src/airflow/ui/tests/e2e/README.md
@@ -161,7 +161,7 @@ When submitting a PR that adds new E2E coverage, briefly
explain in the PR descr
2. **Create a spec file** in `specs/`
- Import page objects and write test steps
- - See existing test: [dag-trigger.spec.ts](specs/dag-trigger.spec.ts)
+ - See existing test: [dag-runs.spec.ts](specs/dag-runs.spec.ts)
3. **Run tests locally**
diff --git a/dev/README_RELEASE_AIRFLOW.md b/dev/README_RELEASE_AIRFLOW.md
index 02a8715f8dc..2f4c3020fb2 100644
--- a/dev/README_RELEASE_AIRFLOW.md
+++ b/dev/README_RELEASE_AIRFLOW.md
@@ -202,7 +202,7 @@ EOF
When it is time to cut the RC, you should:
1. Generate an additional completeness output:
- a. If there are incomplete locales that were also incomplete in the previous
major/minor release, please contact the code owner and ask them to act
according to the [removing or replacing ownership
procedure](../airflow-core/src/airflow/ui/public/i18n/README.md#removing-or-replacing-ownership)
in the i18n policy.
+ a. If there are incomplete locales that were also incomplete in the previous
major/minor release, please contact the code owner and ask them to act
according to the [Relinquishing translation/code ownership
procedure](../airflow-core/src/airflow/ui/public/i18n/README.md#relinquishing-translationcode-ownership)
in the i18n policy.
b. If there are other incomplete locales, please write it as a reminder for
the next major/minor release.
2. Post the final completeness output on the same thread.
diff --git a/dev/README_RELEASE_HELM_CHART.md b/dev/README_RELEASE_HELM_CHART.md
index 3ac3aea7112..2f733e91a7d 100644
--- a/dev/README_RELEASE_HELM_CHART.md
+++ b/dev/README_RELEASE_HELM_CHART.md
@@ -204,7 +204,7 @@ The minimum version of Kubernetes should be updated
according to
https://github.com/apache/airflow/blob/main/README.md#requirements in two
places:
* [../../helm-chart/README.md](../chart/README.md)
-* [../docs/helm-chart/index.rst](../docs/helm-chart/index.rst)
+* [../chart/docs/index.rst](../chart/docs/index.rst)
## Build RC artifacts
diff --git a/dev/breeze/doc/ci/02_images.md b/dev/breeze/doc/ci/02_images.md
index f5d85fba8b2..7182b205b20 100644
--- a/dev/breeze/doc/ci/02_images.md
+++ b/dev/breeze/doc/ci/02_images.md
@@ -108,7 +108,7 @@ it uses the latest installed version of airflow and
providers. However,
you can choose different installation methods as described in [Building
PROD docker images from released PIP
packages](#building-prod-docker-images-from-released-pip-packages). Detailed
reference for building production image from different sources can be
-found in: [Build Args
reference](../../../../docs/docker-stack/build-arg-ref.rst#installing-airflow-using-different-methods)
+found in: [Build Args
reference](../../../../docker-stack-docs/build-arg-ref.rst#installing-airflow-using-different-methods)
You can build the CI image using current sources this command:
diff --git a/dev/system_tests/README.md b/dev/system_tests/README.md
index 00cd02a7e98..4dcd3d6af67 100644
--- a/dev/system_tests/README.md
+++ b/dev/system_tests/README.md
@@ -25,14 +25,13 @@ Small tool to update status of all AIP-47 issues.
Simply:
-1) Activate dev environment based on [requirements](../../dev/requirements.txt)
+1) Set `GITHUB_TOKEN` to a repo-writeable token.
-2) Set GITHUB_TOKEN to repo-writeable token
-
-3) Run this:
+2) Run the script via `uv` (it pulls in the few third-party deps it
+ needs — `PyGithub`, `rich-click`, `rich`):
```bash
-python dev/system_tests/update_issue_status.py
+uv run --with PyGithub --with rich-click --with rich python
dev/system_tests/update_issue_status.py
```