From 546da85a681eb221d64bc2f8a22bb7398300dcb4 Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Thu, 3 Sep 2026 16:30:04 -0400 Subject: [PATCH 01/11] Bump link-cache to 0.5.0 --- package-lock.json | 11 ++++++----- package.json | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3275b8ffc51..fca6df9cd08 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "autoprefixer": "10.5.4", "cross-env": "10.1.0", "hugo-extended": "0.164.0", - "link-cache": "0.3.0", + "link-cache": "0.5.0", "postcss-cli": "11.0.1", "rtlcss": "4.3.0", "sass-embedded": "1.103.1" @@ -972,14 +972,15 @@ } }, "node_modules/link-cache": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/link-cache/-/link-cache-0.3.0.tgz", - "integrity": "sha512-JhIryBEtbmrNxeI4TPL4EaXB+7JYn9dMZ6P7fXL87Zo8lZN7QWEntE8ZB017poJCSJ3h7ku3LISlVwHOIJyNVg==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/link-cache/-/link-cache-0.5.0.tgz", + "integrity": "sha512-ILnhzuH3zTtT0nx9Ei7pKoQynHBCQ2dsXbWcm4+nTt/BLBgJZ+VyscrVGV5WmBIF1DmhmWBkXc+7a0HWKYaqUg==", "dev": true, "license": "Apache-2.0", "bin": { + "link-cache": "link-cache/index.mjs", "lychee-norm-cache": "check/index.mjs", - "refcache": "refcache/index.mjs" + "refcache": "link-cache/refcache.mjs" }, "engines": { "node": ">=24" diff --git a/package.json b/package.json index 0870f28f2e4..d762f02a0bb 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "autoprefixer": "10.5.4", "cross-env": "10.1.0", "hugo-extended": "0.164.0", - "link-cache": "0.3.0", + "link-cache": "0.5.0", "postcss-cli": "11.0.1", "rtlcss": "4.3.0", "sass-embedded": "1.103.1" From e95daa52b6e8442774972192d3f7c1eb2d1889ec Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Thu, 3 Sep 2026 16:31:05 -0400 Subject: [PATCH 02/11] Migrate .lycheecache to owned link-cache.jsonc --- .github/workflows/links.yaml | 2 +- .gitignore | 3 + .lycheecache | 89 ------- link-cache.jsonc | 447 +++++++++++++++++++++++++++++++++++ 4 files changed, 451 insertions(+), 90 deletions(-) delete mode 100644 .lycheecache create mode 100644 link-cache.jsonc diff --git a/.github/workflows/links.yaml b/.github/workflows/links.yaml index af73c642ffb..d175e5cce75 100644 --- a/.github/workflows/links.yaml +++ b/.github/workflows/links.yaml @@ -57,7 +57,7 @@ jobs: npm run -s _is:clean || { echo echo 'ERROR: generated files changed; regenerate locally and commit:' - echo ' .lycheecache -> npm run check:links' + echo ' link-cache.jsonc -> npm run check:links' echo ' package-lock, hugoautogen -> npm run update:docsy:pack' echo exit 1 diff --git a/.gitignore b/.gitignore index fc97599016c..3e24101d541 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,6 @@ resources/ node_modules/ .hugo_build.lock packages/hugoautogen/hugo_packagemeta.json + +# Lychee link-check cache: derived from link-cache.jsonc by lychee-norm-cache +.lycheecache diff --git a/.lycheecache b/.lycheecache deleted file mode 100644 index e4d3794fa82..00000000000 --- a/.lycheecache +++ /dev/null @@ -1,89 +0,0 @@ -https://creativecommons.org/licenses/by/4.0,200,1782763743 -https://docsy.dev/,200,1782763743 -https://docsy.dev/docs/,200,1782763743 -https://docsy.dev/docs/best-practices/organizing-content/,200,1782763743 -https://example.docsy.dev/,200,1782763743 -https://example.docsy.dev/_print/,200,1782763744 -https://example.docsy.dev/_print/blog/,200,1782763745 -https://example.docsy.dev/_print/blog/news/,200,1782763745 -https://example.docsy.dev/_print/blog/releases/,200,1782763746 -https://example.docsy.dev/_print/community/,200,1782763746 -https://example.docsy.dev/_print/docs/,200,1782763745 -https://example.docsy.dev/_print/docs/getting-started/,200,1782763745 -https://example.docsy.dev/_print/docs/reference/,200,1782763745 -https://example.docsy.dev/_print/docs/tasks/,200,1782763745 -https://example.docsy.dev/_print/docs/tasks/ponycopters/,200,1782763745 -https://example.docsy.dev/_print/docs/tutorials/,200,1782763745 -https://example.docsy.dev/blog/,200,1782763743 -https://example.docsy.dev/blog/news/,200,1782763743 -https://example.docsy.dev/blog/releases/,200,1782763744 -https://example.docsy.dev/community/,200,1782763743 -https://example.docsy.dev/docs/,200,1782926753 -https://example.docsy.dev/docs/getting-started/,200,1782763743 -https://example.docsy.dev/docs/reference/,200,1782763744 -https://example.docsy.dev/docs/tasks/,200,1782763744 -https://example.docsy.dev/docs/tasks/ponycopters/,200,1782763744 -https://example.docsy.dev/docs/tutorials/,200,1782763743 -https://example.docsy.dev/fa/,200,1782763745 -https://example.docsy.dev/fa/_print/,200,1782763746 -https://example.docsy.dev/fa/_print/blog/,200,1782763746 -https://example.docsy.dev/fa/_print/blog/news/,200,1782763746 -https://example.docsy.dev/fa/_print/blog/releases/,200,1782763746 -https://example.docsy.dev/fa/_print/community/,200,1782763746 -https://example.docsy.dev/fa/_print/docs/,200,1782763746 -https://example.docsy.dev/fa/blog/,200,1782763746 -https://example.docsy.dev/fa/blog/news/,200,1782763746 -https://example.docsy.dev/fa/blog/releases/,200,1782763746 -https://example.docsy.dev/fa/community/,200,1782763746 -https://example.docsy.dev/fa/docs/,200,1782763746 -https://example.docsy.dev/no/,200,1782763743 -https://example.docsy.dev/no/_print/,200,1782763744 -https://example.docsy.dev/no/_print/docs/,200,1782763744 -https://example.docsy.dev/no/_print/docs/big-data/,200,1782763746 -https://example.docsy.dev/no/_print/docs/big-data/examples/,200,1782763745 -https://example.docsy.dev/no/_print/docs/big-data/tutorials/,200,1782763745 -https://example.docsy.dev/no/_print/docs/cloud-computing/,200,1782763744 -https://example.docsy.dev/no/_print/docs/cloud-computing/examples/,200,1782763745 -https://example.docsy.dev/no/_print/docs/cloud-computing/tutorials/,200,1782763746 -https://example.docsy.dev/no/_print/docs/content-management/,200,1782763746 -https://example.docsy.dev/no/_print/docs/content-management/tutorials/,200,1782763745 -https://example.docsy.dev/no/_print/docs/cross-platform/,200,1782763745 -https://example.docsy.dev/no/_print/docs/cross-platform/examples/,200,1782763745 -https://example.docsy.dev/no/_print/docs/cross-platform/tutorials/,200,1782763746 -https://example.docsy.dev/no/_print/docs/reference/,200,1782763746 -https://example.docsy.dev/no/_print/docs/reference/examples/,200,1782763745 -https://example.docsy.dev/no/docs/,200,1782763745 -https://example.docsy.dev/no/docs/big-data/,200,1782763744 -https://example.docsy.dev/no/docs/big-data/examples/,200,1782763744 -https://example.docsy.dev/no/docs/big-data/tutorials/,200,1782763744 -https://example.docsy.dev/no/docs/cloud-computing/,200,1782763744 -https://example.docsy.dev/no/docs/cloud-computing/examples/,200,1782763744 -https://example.docsy.dev/no/docs/cloud-computing/tutorials/,200,1782763744 -https://example.docsy.dev/no/docs/content-management/,200,1782763744 -https://example.docsy.dev/no/docs/content-management/tutorials/,200,1782763744 -https://example.docsy.dev/no/docs/cross-platform/,200,1782763743 -https://example.docsy.dev/no/docs/cross-platform/examples/,200,1782763744 -https://example.docsy.dev/no/docs/cross-platform/tutorials/,200,1782763744 -https://example.docsy.dev/no/docs/reference/,200,1782763744 -https://example.docsy.dev/no/docs/reference/examples/,200,1782763745 -https://github.com/,200,1782766677 -https://github.com/chalin,200,1782766677 -https://github.com/google/docsy,200,1782766676 -https://github.com/google/docsy-example,200,1782766676 -https://github.com/google/docsy-example/issues,200,1782766676 -https://github.com/google/docsy-example/pulls,200,1782766676 -https://github.com/google/docsy/releases/v0.16.0,200,1785357023 -https://github.com/google/docsy/releases/v0.17.0,200,1788122269 -https://github.com/google/docsy/tree/main/docsy.dev,200,1782766676 -https://github.com/kubeflow/website/blob/master/README.md,200,1782766676 -https://gohugo.io/,200,1782763743 -https://gohugo.io/documentation/,200,1782763743 -https://guides.github.com/activities/hello-world/,200,1782766676 -https://help.github.com/articles/about-pull-requests/,200,1782766676 -https://policies.google.com/privacy,200,1782763743 -https://swagger.io/tools/swagger-ui/,200,1782763743 -https://www.docsy.dev/docs/,200,1782763743 -https://www.docsy.dev/docs/content/adding-content/#adding-static-content,200,1782763743 -https://www.docsy.dev/docs/content/shortcodes/#swaggerui,200,1782763743 -https://www.netlify.com/,200,1782763743 -https://x.com/docsydocs,200,1782763743 diff --git a/link-cache.jsonc b/link-cache.jsonc new file mode 100644 index 00000000000..c98908566a7 --- /dev/null +++ b/link-cache.jsonc @@ -0,0 +1,447 @@ +{ + "https://creativecommons.org/licenses/by/4.0": { + "result": 200, + "when": "2026-06-29T20:09:03Z", + "via": "lychee", + }, + "https://docsy.dev/": { + "result": 200, + "when": "2026-06-29T20:09:03Z", + "via": "lychee", + }, + "https://docsy.dev/docs/": { + "result": 200, + "when": "2026-06-29T20:09:03Z", + "via": "lychee", + }, + "https://docsy.dev/docs/best-practices/organizing-content/": { + "result": 200, + "when": "2026-06-29T20:09:03Z", + "via": "lychee", + }, + "https://example.docsy.dev/": { + "result": 200, + "when": "2026-06-29T20:09:03Z", + "via": "lychee", + }, + "https://example.docsy.dev/_print/": { + "result": 200, + "when": "2026-06-29T20:09:04Z", + "via": "lychee", + }, + "https://example.docsy.dev/_print/blog/": { + "result": 200, + "when": "2026-06-29T20:09:05Z", + "via": "lychee", + }, + "https://example.docsy.dev/_print/blog/news/": { + "result": 200, + "when": "2026-06-29T20:09:05Z", + "via": "lychee", + }, + "https://example.docsy.dev/_print/blog/releases/": { + "result": 200, + "when": "2026-06-29T20:09:06Z", + "via": "lychee", + }, + "https://example.docsy.dev/_print/community/": { + "result": 200, + "when": "2026-06-29T20:09:06Z", + "via": "lychee", + }, + "https://example.docsy.dev/_print/docs/": { + "result": 200, + "when": "2026-06-29T20:09:05Z", + "via": "lychee", + }, + "https://example.docsy.dev/_print/docs/getting-started/": { + "result": 200, + "when": "2026-06-29T20:09:05Z", + "via": "lychee", + }, + "https://example.docsy.dev/_print/docs/reference/": { + "result": 200, + "when": "2026-06-29T20:09:05Z", + "via": "lychee", + }, + "https://example.docsy.dev/_print/docs/tasks/": { + "result": 200, + "when": "2026-06-29T20:09:05Z", + "via": "lychee", + }, + "https://example.docsy.dev/_print/docs/tasks/ponycopters/": { + "result": 200, + "when": "2026-06-29T20:09:05Z", + "via": "lychee", + }, + "https://example.docsy.dev/_print/docs/tutorials/": { + "result": 200, + "when": "2026-06-29T20:09:05Z", + "via": "lychee", + }, + "https://example.docsy.dev/blog/": { + "result": 200, + "when": "2026-06-29T20:09:03Z", + "via": "lychee", + }, + "https://example.docsy.dev/blog/news/": { + "result": 200, + "when": "2026-06-29T20:09:03Z", + "via": "lychee", + }, + "https://example.docsy.dev/blog/releases/": { + "result": 200, + "when": "2026-06-29T20:09:04Z", + "via": "lychee", + }, + "https://example.docsy.dev/community/": { + "result": 200, + "when": "2026-06-29T20:09:03Z", + "via": "lychee", + }, + "https://example.docsy.dev/docs/": { + "result": 200, + "when": "2026-07-01T17:25:53Z", + "via": "lychee", + }, + "https://example.docsy.dev/docs/getting-started/": { + "result": 200, + "when": "2026-06-29T20:09:03Z", + "via": "lychee", + }, + "https://example.docsy.dev/docs/reference/": { + "result": 200, + "when": "2026-06-29T20:09:04Z", + "via": "lychee", + }, + "https://example.docsy.dev/docs/tasks/": { + "result": 200, + "when": "2026-06-29T20:09:04Z", + "via": "lychee", + }, + "https://example.docsy.dev/docs/tasks/ponycopters/": { + "result": 200, + "when": "2026-06-29T20:09:04Z", + "via": "lychee", + }, + "https://example.docsy.dev/docs/tutorials/": { + "result": 200, + "when": "2026-06-29T20:09:03Z", + "via": "lychee", + }, + "https://example.docsy.dev/fa/": { + "result": 200, + "when": "2026-06-29T20:09:05Z", + "via": "lychee", + }, + "https://example.docsy.dev/fa/_print/": { + "result": 200, + "when": "2026-06-29T20:09:06Z", + "via": "lychee", + }, + "https://example.docsy.dev/fa/_print/blog/": { + "result": 200, + "when": "2026-06-29T20:09:06Z", + "via": "lychee", + }, + "https://example.docsy.dev/fa/_print/blog/news/": { + "result": 200, + "when": "2026-06-29T20:09:06Z", + "via": "lychee", + }, + "https://example.docsy.dev/fa/_print/blog/releases/": { + "result": 200, + "when": "2026-06-29T20:09:06Z", + "via": "lychee", + }, + "https://example.docsy.dev/fa/_print/community/": { + "result": 200, + "when": "2026-06-29T20:09:06Z", + "via": "lychee", + }, + "https://example.docsy.dev/fa/_print/docs/": { + "result": 200, + "when": "2026-06-29T20:09:06Z", + "via": "lychee", + }, + "https://example.docsy.dev/fa/blog/": { + "result": 200, + "when": "2026-06-29T20:09:06Z", + "via": "lychee", + }, + "https://example.docsy.dev/fa/blog/news/": { + "result": 200, + "when": "2026-06-29T20:09:06Z", + "via": "lychee", + }, + "https://example.docsy.dev/fa/blog/releases/": { + "result": 200, + "when": "2026-06-29T20:09:06Z", + "via": "lychee", + }, + "https://example.docsy.dev/fa/community/": { + "result": 200, + "when": "2026-06-29T20:09:06Z", + "via": "lychee", + }, + "https://example.docsy.dev/fa/docs/": { + "result": 200, + "when": "2026-06-29T20:09:06Z", + "via": "lychee", + }, + "https://example.docsy.dev/no/": { + "result": 200, + "when": "2026-06-29T20:09:03Z", + "via": "lychee", + }, + "https://example.docsy.dev/no/_print/": { + "result": 200, + "when": "2026-06-29T20:09:04Z", + "via": "lychee", + }, + "https://example.docsy.dev/no/_print/docs/": { + "result": 200, + "when": "2026-06-29T20:09:04Z", + "via": "lychee", + }, + "https://example.docsy.dev/no/_print/docs/big-data/": { + "result": 200, + "when": "2026-06-29T20:09:06Z", + "via": "lychee", + }, + "https://example.docsy.dev/no/_print/docs/big-data/examples/": { + "result": 200, + "when": "2026-06-29T20:09:05Z", + "via": "lychee", + }, + "https://example.docsy.dev/no/_print/docs/big-data/tutorials/": { + "result": 200, + "when": "2026-06-29T20:09:05Z", + "via": "lychee", + }, + "https://example.docsy.dev/no/_print/docs/cloud-computing/": { + "result": 200, + "when": "2026-06-29T20:09:04Z", + "via": "lychee", + }, + "https://example.docsy.dev/no/_print/docs/cloud-computing/examples/": { + "result": 200, + "when": "2026-06-29T20:09:05Z", + "via": "lychee", + }, + "https://example.docsy.dev/no/_print/docs/cloud-computing/tutorials/": { + "result": 200, + "when": "2026-06-29T20:09:06Z", + "via": "lychee", + }, + "https://example.docsy.dev/no/_print/docs/content-management/": { + "result": 200, + "when": "2026-06-29T20:09:06Z", + "via": "lychee", + }, + "https://example.docsy.dev/no/_print/docs/content-management/tutorials/": { + "result": 200, + "when": "2026-06-29T20:09:05Z", + "via": "lychee", + }, + "https://example.docsy.dev/no/_print/docs/cross-platform/": { + "result": 200, + "when": "2026-06-29T20:09:05Z", + "via": "lychee", + }, + "https://example.docsy.dev/no/_print/docs/cross-platform/examples/": { + "result": 200, + "when": "2026-06-29T20:09:05Z", + "via": "lychee", + }, + "https://example.docsy.dev/no/_print/docs/cross-platform/tutorials/": { + "result": 200, + "when": "2026-06-29T20:09:06Z", + "via": "lychee", + }, + "https://example.docsy.dev/no/_print/docs/reference/": { + "result": 200, + "when": "2026-06-29T20:09:06Z", + "via": "lychee", + }, + "https://example.docsy.dev/no/_print/docs/reference/examples/": { + "result": 200, + "when": "2026-06-29T20:09:05Z", + "via": "lychee", + }, + "https://example.docsy.dev/no/docs/": { + "result": 200, + "when": "2026-06-29T20:09:05Z", + "via": "lychee", + }, + "https://example.docsy.dev/no/docs/big-data/": { + "result": 200, + "when": "2026-06-29T20:09:04Z", + "via": "lychee", + }, + "https://example.docsy.dev/no/docs/big-data/examples/": { + "result": 200, + "when": "2026-06-29T20:09:04Z", + "via": "lychee", + }, + "https://example.docsy.dev/no/docs/big-data/tutorials/": { + "result": 200, + "when": "2026-06-29T20:09:04Z", + "via": "lychee", + }, + "https://example.docsy.dev/no/docs/cloud-computing/": { + "result": 200, + "when": "2026-06-29T20:09:04Z", + "via": "lychee", + }, + "https://example.docsy.dev/no/docs/cloud-computing/examples/": { + "result": 200, + "when": "2026-06-29T20:09:04Z", + "via": "lychee", + }, + "https://example.docsy.dev/no/docs/cloud-computing/tutorials/": { + "result": 200, + "when": "2026-06-29T20:09:04Z", + "via": "lychee", + }, + "https://example.docsy.dev/no/docs/content-management/": { + "result": 200, + "when": "2026-06-29T20:09:04Z", + "via": "lychee", + }, + "https://example.docsy.dev/no/docs/content-management/tutorials/": { + "result": 200, + "when": "2026-06-29T20:09:04Z", + "via": "lychee", + }, + "https://example.docsy.dev/no/docs/cross-platform/": { + "result": 200, + "when": "2026-06-29T20:09:03Z", + "via": "lychee", + }, + "https://example.docsy.dev/no/docs/cross-platform/examples/": { + "result": 200, + "when": "2026-06-29T20:09:04Z", + "via": "lychee", + }, + "https://example.docsy.dev/no/docs/cross-platform/tutorials/": { + "result": 200, + "when": "2026-06-29T20:09:04Z", + "via": "lychee", + }, + "https://example.docsy.dev/no/docs/reference/": { + "result": 200, + "when": "2026-06-29T20:09:04Z", + "via": "lychee", + }, + "https://example.docsy.dev/no/docs/reference/examples/": { + "result": 200, + "when": "2026-06-29T20:09:05Z", + "via": "lychee", + }, + "https://github.com/": { + "result": 200, + "when": "2026-06-29T20:57:57Z", + "via": "lychee", + }, + "https://github.com/chalin": { + "result": 200, + "when": "2026-06-29T20:57:57Z", + "via": "lychee", + }, + "https://github.com/google/docsy": { + "result": 200, + "when": "2026-06-29T20:57:56Z", + "via": "lychee", + }, + "https://github.com/google/docsy-example": { + "result": 200, + "when": "2026-06-29T20:57:56Z", + "via": "lychee", + }, + "https://github.com/google/docsy-example/issues": { + "result": 200, + "when": "2026-06-29T20:57:56Z", + "via": "lychee", + }, + "https://github.com/google/docsy-example/pulls": { + "result": 200, + "when": "2026-06-29T20:57:56Z", + "via": "lychee", + }, + "https://github.com/google/docsy/releases/v0.16.0": { + "result": 200, + "when": "2026-07-29T20:30:23Z", + "via": "lychee", + }, + "https://github.com/google/docsy/releases/v0.17.0": { + "result": 200, + "when": "2026-08-30T20:37:49Z", + "via": "lychee", + }, + "https://github.com/google/docsy/tree/main/docsy.dev": { + "result": 200, + "when": "2026-06-29T20:57:56Z", + "via": "lychee", + }, + "https://github.com/kubeflow/website/blob/master/README.md": { + "result": 200, + "when": "2026-06-29T20:57:56Z", + "via": "lychee", + }, + "https://gohugo.io/": { + "result": 200, + "when": "2026-06-29T20:09:03Z", + "via": "lychee", + }, + "https://gohugo.io/documentation/": { + "result": 200, + "when": "2026-06-29T20:09:03Z", + "via": "lychee", + }, + "https://guides.github.com/activities/hello-world/": { + "result": 200, + "when": "2026-06-29T20:57:56Z", + "via": "lychee", + }, + "https://help.github.com/articles/about-pull-requests/": { + "result": 200, + "when": "2026-06-29T20:57:56Z", + "via": "lychee", + }, + "https://policies.google.com/privacy": { + "result": 200, + "when": "2026-06-29T20:09:03Z", + "via": "lychee", + }, + "https://swagger.io/tools/swagger-ui/": { + "result": 200, + "when": "2026-06-29T20:09:03Z", + "via": "lychee", + }, + "https://www.docsy.dev/docs/": { + "result": 200, + "when": "2026-06-29T20:09:03Z", + "via": "lychee", + }, + "https://www.docsy.dev/docs/content/adding-content/#adding-static-content": { + "result": 200, + "when": "2026-06-29T20:09:03Z", + "via": "lychee", + }, + "https://www.docsy.dev/docs/content/shortcodes/#swaggerui": { + "result": 200, + "when": "2026-06-29T20:09:03Z", + "via": "lychee", + }, + "https://www.netlify.com/": { + "result": 200, + "when": "2026-06-29T20:09:03Z", + "via": "lychee", + }, + "https://x.com/docsydocs": { + "result": 200, + "when": "2026-06-29T20:09:03Z", + "via": "lychee", + }, +} From c245209116b61249db2b2be6e4863c065317a779 Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Thu, 3 Sep 2026 16:34:17 -0400 Subject: [PATCH 03/11] lychee.toml: scope max_cache_age to --check-stale runs --- lychee.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lychee.toml b/lychee.toml index ba90f3ab86b..5ecf2f5c6ac 100644 --- a/lychee.toml +++ b/lychee.toml @@ -2,7 +2,8 @@ # `npm run check:links`. cache = true -max_cache_age = "375d" +# Expiry applies only under `lychee-norm-cache --check-stale`. +max_cache_age = "365d" no_progress = true extensions = ["html"] # built HTML only include_fragments = "full" # check in-page anchors From 4fd35f31b3714641ed40a04f2f90549e1b32dc50 Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Thu, 3 Sep 2026 18:18:45 -0400 Subject: [PATCH 04/11] lychee.toml: drop the wrapper-mode comment - Documents wrapper behavior, not this site's config; keeps lychee.toml wrapper-agnostic. --- lychee.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/lychee.toml b/lychee.toml index 5ecf2f5c6ac..f6d0d301774 100644 --- a/lychee.toml +++ b/lychee.toml @@ -2,7 +2,6 @@ # `npm run check:links`. cache = true -# Expiry applies only under `lychee-norm-cache --check-stale`. max_cache_age = "365d" no_progress = true extensions = ["html"] # built HTML only From ca2536dd06eb6f395f37bed88cacfb68b700a49b Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Tue, 6 Oct 2026 09:37:42 -0400 Subject: [PATCH 05/11] Bump link-cache to 0.6.0; add a link-cache script - Exact registry pin; lock delta is link-cache alone. - `npm run link-cache` exposes the cache inspect/prune CLI, as in Docsy. --- package-lock.json | 8 ++++---- package.json | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index fca6df9cd08..f908dd943d4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "autoprefixer": "10.5.4", "cross-env": "10.1.0", "hugo-extended": "0.164.0", - "link-cache": "0.5.0", + "link-cache": "0.6.0", "postcss-cli": "11.0.1", "rtlcss": "4.3.0", "sass-embedded": "1.103.1" @@ -972,9 +972,9 @@ } }, "node_modules/link-cache": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/link-cache/-/link-cache-0.5.0.tgz", - "integrity": "sha512-ILnhzuH3zTtT0nx9Ei7pKoQynHBCQ2dsXbWcm4+nTt/BLBgJZ+VyscrVGV5WmBIF1DmhmWBkXc+7a0HWKYaqUg==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/link-cache/-/link-cache-0.6.0.tgz", + "integrity": "sha512-npaJusaVCwrHcGZgo+AjbiVVwBDpPjysmWby7owJiQsD/Co85pBv87vPIKHhQxGs1fGwbFI+j5GLkNn/65rC9w==", "dev": true, "license": "Apache-2.0", "bin": { diff --git a/package.json b/package.json index d762f02a0bb..4afe61a6008 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,7 @@ "fix:format": "npm run _check:format -- --write", "fix": "npm run fix:format", "install:safe": "npm ci --ignore-scripts", + "link-cache": "link-cache", "local": "npm run _local -- npm run", "make:public": "git init -b main public", "seq": "bash -c 'for cmd in \"$@\"; do npm run $cmd || exit 1; done' - ", @@ -57,7 +58,7 @@ "autoprefixer": "10.5.4", "cross-env": "10.1.0", "hugo-extended": "0.164.0", - "link-cache": "0.5.0", + "link-cache": "0.6.0", "postcss-cli": "11.0.1", "rtlcss": "4.3.0", "sass-embedded": "1.103.1" From b7599a73efc76b4751ec3bbe07ea4bd6ec756411 Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Tue, 6 Oct 2026 09:39:04 -0400 Subject: [PATCH 06/11] CONTRIBUTING: link checking notes as a delta on Docsy's - Points at Docsy's link-cache notes; lists what differs here: root-level scripts, check:links as the refresh, the CI drift check, and no refresh workflow, with the manual prune recipe. --- CONTRIBUTING.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 44b35d6bd7a..1f78663d1ec 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -114,6 +114,22 @@ npm run local -- serve The `local` prefix runs the script against the sibling Docsy, and the server watches it, so theme edits hot-reload. +### Link checking + +For the link cache (the committed `link-cache.jsonc`, its fields, and the seed +and prune recipes), see Docsy's [Link checking and the link cache][]. What +differs here: + +- The cache, `lychee.toml`, and the scripts are at the repo root. + `npm run check:links` builds the site, checks links, and updates the cache + (Docsy's `fix:link-cache`); the `links.yaml` workflow fails if that changes + the committed cache. +- No refresh workflow: cached results are re-verified only once older than + `max_cache_age`, and lapsed seeds stay until pruned. To prune by hand, run + `npm run link-cache -- -p 0` (drops only lapsed entries; `-p N` also drops the + N oldest of the rest), then `npm run check:links` to re-verify those URLs, and + commit the cache. + [alternate dashboard]: https://app.netlify.com/sites/goldydocs/deploys [contribution guidelines]: https://main--docsydocs.netlify.app/docs/contributing/ @@ -121,6 +137,7 @@ watches it, so theme edits hot-reload. [deploys]: https://app.netlify.com/sites/docsy-example/deploys [Docsy]: https://github.com/docsy/docsy [Hugo workspace]: https://gohugo.io/configuration/module/#top-level-settings +[Link checking and the link cache]: https://main--docsydocs.netlify.app/project/about/maintainer-notes/#link-checking-and-the-link-cache [Lockfile and generated manifest]: #lockfile-and-generated-manifest [main ruleset]: https://github.com/docsy/docsy-example/rules/23697395 [Merge requirements]: https://main--docsydocs.netlify.app/project/about/maintainer-notes/#merge-requirements From fb87c7bc321034b52653dd48aa73cff5c85717e7 Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Tue, 6 Oct 2026 09:46:35 -0400 Subject: [PATCH 07/11] lychee.toml: restore main's max_cache_age - Keeps this PR adoption-only; 375d matches Docsy. --- lychee.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lychee.toml b/lychee.toml index f6d0d301774..ba90f3ab86b 100644 --- a/lychee.toml +++ b/lychee.toml @@ -2,7 +2,7 @@ # `npm run check:links`. cache = true -max_cache_age = "365d" +max_cache_age = "375d" no_progress = true extensions = ["html"] # built HTML only include_fragments = "full" # check in-page anchors From 08cc99221ab9795a611c1eb037be550f783548f0 Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Tue, 6 Oct 2026 10:18:43 -0400 Subject: [PATCH 08/11] Link checking notes: correct the serving and prune rules; add fix:link-cache - Entries with expires serve until pruned; -p N drops the N oldest without expires. - fix:link-cache mirrors Docsy's script, so its linked recipes apply as written. --- CONTRIBUTING.md | 16 +++++++--------- package.json | 1 + 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1f78663d1ec..c9fcdc5cc1b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -120,15 +120,13 @@ For the link cache (the committed `link-cache.jsonc`, its fields, and the seed and prune recipes), see Docsy's [Link checking and the link cache][]. What differs here: -- The cache, `lychee.toml`, and the scripts are at the repo root. - `npm run check:links` builds the site, checks links, and updates the cache - (Docsy's `fix:link-cache`); the `links.yaml` workflow fails if that changes - the committed cache. -- No refresh workflow: cached results are re-verified only once older than - `max_cache_age`, and lapsed seeds stay until pruned. To prune by hand, run - `npm run link-cache -- -p 0` (drops only lapsed entries; `-p N` also drops the - N oldest of the rest), then `npm run check:links` to re-verify those URLs, and - commit the cache. +- The cache and `lychee.toml` are at the repo root; the `links.yaml` workflow + fails if a check changes the committed cache. +- No refresh workflow: a 2xx entry without `expires` is re-verified once older + than `max_cache_age`, but an entry with `expires` keeps serving until pruned, + even after it lapses. To prune by hand, run `npm run link-cache -- -p 0` + (drops only lapsed entries; `-p N` also drops the N oldest without `expires`), + then `npm run fix:link-cache` to re-verify those URLs, and commit the cache. [alternate dashboard]: https://app.netlify.com/sites/goldydocs/deploys diff --git a/package.json b/package.json index 4afe61a6008..c1e488efc91 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "clean": "rm -Rf public/* resources", "fix:format:diff": "npm run fix:format", "fix:format": "npm run _check:format -- --write", + "fix:link-cache": "npm run check:links", "fix": "npm run fix:format", "install:safe": "npm ci --ignore-scripts", "link-cache": "link-cache", From 2c0eec521d549ddc84131b3f6e07ed86e966a053 Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Tue, 6 Oct 2026 10:30:44 -0400 Subject: [PATCH 09/11] Forward link-check arguments; trim the no-refresh note to the recipe - check:links and fix:link-cache end in -- so flags reach lychee-norm-cache, as Docsy's check:links does. - The serving rules stay with Docsy's notes and the package help. --- CONTRIBUTING.md | 9 ++++----- package.json | 4 ++-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c9fcdc5cc1b..1d4d1aa5c80 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -122,11 +122,10 @@ differs here: - The cache and `lychee.toml` are at the repo root; the `links.yaml` workflow fails if a check changes the committed cache. -- No refresh workflow: a 2xx entry without `expires` is re-verified once older - than `max_cache_age`, but an entry with `expires` keeps serving until pruned, - even after it lapses. To prune by hand, run `npm run link-cache -- -p 0` - (drops only lapsed entries; `-p N` also drops the N oldest without `expires`), - then `npm run fix:link-cache` to re-verify those URLs, and commit the cache. +- No refresh workflow, so nothing prunes on a schedule. To prune by hand, run + `npm run link-cache -- -p 0` (drops only lapsed entries; `-p N` also drops the + N oldest without `expires`), then `npm run fix:link-cache` to re-verify those + URLs, and commit the cache. [alternate dashboard]: https://app.netlify.com/sites/goldydocs/deploys diff --git a/package.json b/package.json index c1e488efc91..210a49f15b1 100644 --- a/package.json +++ b/package.json @@ -30,13 +30,13 @@ "build:production": "npm run _hugo -- --minify", "build": "npm run _build -- ", "check:links:internal": "npm run build && npm run _check:links -- --offline", - "check:links": "npm run build && npm run _check:links", + "check:links": "npm run build && npm run _check:links --", "ci:prepare": "npm run _get:docsy && hugo mod graph && hugo mod tidy", "ci:test": "npm run ci:prepare && npm run fix:format && npm run test && npm run _diff:check", "clean": "rm -Rf public/* resources", "fix:format:diff": "npm run fix:format", "fix:format": "npm run _check:format -- --write", - "fix:link-cache": "npm run check:links", + "fix:link-cache": "npm run check:links --", "fix": "npm run fix:format", "install:safe": "npm ci --ignore-scripts", "link-cache": "link-cache", From 29b16f1eed1fcacc7ee0bd65778a591780bd4d7d Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Tue, 6 Oct 2026 10:53:56 -0400 Subject: [PATCH 10/11] Link checking notes: name the real deltas; point the CI hint at fix:link-cache - The drift failure is shared with Docsy; the delta is which workflow runs the check. - Without a refresh workflow, a lapsed seed serves until a manual prune. --- .github/workflows/links.yaml | 2 +- CONTRIBUTING.md | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/links.yaml b/.github/workflows/links.yaml index d175e5cce75..c631a72cd7b 100644 --- a/.github/workflows/links.yaml +++ b/.github/workflows/links.yaml @@ -57,7 +57,7 @@ jobs: npm run -s _is:clean || { echo echo 'ERROR: generated files changed; regenerate locally and commit:' - echo ' link-cache.jsonc -> npm run check:links' + echo ' link-cache.jsonc -> npm run fix:link-cache' echo ' package-lock, hugoautogen -> npm run update:docsy:pack' echo exit 1 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1d4d1aa5c80..7e1b690b6c2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -120,12 +120,12 @@ For the link cache (the committed `link-cache.jsonc`, its fields, and the seed and prune recipes), see Docsy's [Link checking and the link cache][]. What differs here: -- The cache and `lychee.toml` are at the repo root; the `links.yaml` workflow - fails if a check changes the committed cache. -- No refresh workflow, so nothing prunes on a schedule. To prune by hand, run - `npm run link-cache -- -p 0` (drops only lapsed entries; `-p N` also drops the - N oldest without `expires`), then `npm run fix:link-cache` to re-verify those - URLs, and commit the cache. +- The cache and `lychee.toml` are at the repo root, and CI runs the check in + `links.yaml`. +- No refresh workflow, so a lapsed seed keeps serving until you prune by hand: + run `npm run link-cache -- -p 0` (drops only lapsed entries; `-p N` also drops + the N oldest without `expires`), then `npm run fix:link-cache` to re-verify + those URLs, and commit the cache. [alternate dashboard]: https://app.netlify.com/sites/goldydocs/deploys From 011593b725739146b9b3de200e8fd083a619c346 Mon Sep 17 00:00:00 2001 From: Patrice Chalin Date: Tue, 6 Oct 2026 11:59:47 -0400 Subject: [PATCH 11/11] Link checking notes: copyedits - Names Docsy's refresh recipe, the full workflow path, and the file's 'No X:' bullet form. --- CONTRIBUTING.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7e1b690b6c2..1d71f08752f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -116,16 +116,16 @@ watches it, so theme edits hot-reload. ### Link checking -For the link cache (the committed `link-cache.jsonc`, its fields, and the seed -and prune recipes), see Docsy's [Link checking and the link cache][]. What -differs here: +For the link cache (the committed `link-cache.jsonc`, its fields, and the +refresh, prune, and seed recipes), see Docsy's [Link checking and the link +cache][]. What differs here: - The cache and `lychee.toml` are at the repo root, and CI runs the check in - `links.yaml`. -- No refresh workflow, so a lapsed seed keeps serving until you prune by hand: - run `npm run link-cache -- -p 0` (drops only lapsed entries; `-p N` also drops - the N oldest without `expires`), then `npm run fix:link-cache` to re-verify - those URLs, and commit the cache. + `.github/workflows/links.yaml`. +- No refresh workflow: a lapsed seed keeps serving until you prune by hand. Run + `npm run link-cache -- -p 0` (drops only lapsed entries; `-p N` also drops the + N oldest without `expires`), then `npm run fix:link-cache` to re-verify those + URLs, and commit the cache. [alternate dashboard]: https://app.netlify.com/sites/goldydocs/deploys