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
 ```
 
 

Reply via email to