From c25a72e469fd4e49cf849509f8e3028fc4817f6e Mon Sep 17 00:00:00 2001 From: Kyle Sexton <153232337+kyle-sexton@users.noreply.github.com> Date: Tue, 21 Jul 2026 12:23:41 -0400 Subject: [PATCH 1/4] feat(toolchain): add lychee-offline to cross-cutting ecosystem default MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On-disk link/anchor integrity check with no network dependency — --offline skips external URLs and only verifies local file/fragment targets, matching the other rung-4 cross-cutting tools' opt-in pattern. Per Brief item 3, docs/topics/lint-static-analysis-gaps/PLAN.md. Closes #833. Co-Authored-By: Claude Sonnet 5 Claude-Session: 0f69ae76-07e0-4aae-9c4a-11688fc0e8ea --- plugins/toolchain/.claude-plugin/plugin.json | 2 +- plugins/toolchain/CHANGELOG.md | 14 +++++++++++++- .../reference/ecosystems/cross-cutting.yaml | 5 ++++- plugins/toolchain/skills/lint/evals/evals.json | 2 +- plugins/toolchain/skills/setup/SKILL.md | 2 +- 5 files changed, 20 insertions(+), 5 deletions(-) diff --git a/plugins/toolchain/.claude-plugin/plugin.json b/plugins/toolchain/.claude-plugin/plugin.json index 95ba05c3f8..96df38e949 100644 --- a/plugins/toolchain/.claude-plugin/plugin.json +++ b/plugins/toolchain/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "toolchain", - "version": "0.8.0", + "version": "0.9.0", "description": "Repo-agnostic polyglot verification toolchain: build + test + lint for changed files across .NET, Python, TypeScript, Bash, PowerShell, Markdown, Go, YAML, and cross-cutting surfaces (`/toolchain:check`, `/toolchain:lint`), plus a re-runnable `/toolchain:setup` with check (report the configured ecosystems and their command surface) and apply (interview, infer, and write the tracked per-ecosystem command config those skills resolve first).", "author": { "name": "Melodic Software", diff --git a/plugins/toolchain/CHANGELOG.md b/plugins/toolchain/CHANGELOG.md index 2e371480c2..6b45c996c1 100644 --- a/plugins/toolchain/CHANGELOG.md +++ b/plugins/toolchain/CHANGELOG.md @@ -3,6 +3,19 @@ All notable changes to the `toolchain` plugin are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning. +## [0.9.0] + +### Added + +- **`lychee-offline` added to the `cross-cutting` ecosystem default.** The bundled + `reference/ecosystems/cross-cutting.yaml` `check-cmd` now runs `lychee --offline --no-progress + './**/*.md'` alongside `typos`/`gitleaks`/editorconfig-checker — on-disk link/anchor integrity, + network-free (`--offline` skips external URLs; only local file and fragment targets are verified). + Opt-in follows the same per-tool-config pattern as the existing cross-cutting tools: an optional + `lychee.toml` at repo root customizes the ruleset (exclusions, fragment-check mode), absent means + lychee's own defaults. `install-hint` gains the `lycheeverse.lychee` winget package / `lychee` + brew formula. Per Brief item 3, `docs/topics/lint-static-analysis-gaps/PLAN.md`. Closes #833. + ## [0.8.0] ### Added @@ -74,7 +87,6 @@ All notable changes to the `toolchain` plugin are documented here. Format follow - Skills with `!` dynamic-context injections now declare `shell: bash` explicitly, per the pinned precompute convention — bash-only pipelines must not fall through to a PowerShell host. - ## [0.5.1] ### Changed diff --git a/plugins/toolchain/reference/ecosystems/cross-cutting.yaml b/plugins/toolchain/reference/ecosystems/cross-cutting.yaml index bac093879c..d9b28df594 100644 --- a/plugins/toolchain/reference/ecosystems/cross-cutting.yaml +++ b/plugins/toolchain/reference/ecosystems/cross-cutting.yaml @@ -12,10 +12,13 @@ check-cmd: | gitleaks detect --source . --redact --no-banner --no-git # editorconfig-checker — binary name varies by install method (ec / editorconfig-checker / ec-windows-amd64) "$EC_BIN" + # lychee-offline — on-disk link/anchor integrity; --offline = no network (external URLs skipped) + lychee --offline --no-progress './**/*.md' fix-cmd: null -opt-in: "each tool's own config at repo root (_typos.toml, .gitleaks.toml, .editorconfig-checker.json / .editorconfig)" +opt-in: "each tool's own config at repo root (_typos.toml, .gitleaks.toml, .editorconfig-checker.json / .editorconfig, lychee.toml)" install-hint: | typos: winget install Crate-CI.Typos | brew install typos-cli gitleaks: winget install Gitleaks.Gitleaks | brew install gitleaks editorconfig-checker: winget install EditorConfig-Checker.EditorConfig-Checker | brew install editorconfig-checker + lychee: winget install lycheeverse.lychee | brew install lychee notes: "Lint-only — owned by /toolchain:lint. /toolchain:check does not run this ecosystem." diff --git a/plugins/toolchain/skills/lint/evals/evals.json b/plugins/toolchain/skills/lint/evals/evals.json index 696046a65c..7617de73f9 100644 --- a/plugins/toolchain/skills/lint/evals/evals.json +++ b/plugins/toolchain/skills/lint/evals/evals.json @@ -30,7 +30,7 @@ "id": 3, "name": "owns-yaml-and-cross-cutting-surfaces", "prompt": "/toolchain:lint all — the change set includes a GitHub Actions workflow YAML and touches several text files across the repo.", - "expected_output": "Runs the lint-only `yaml` and `cross-cutting` surfaces that /toolchain:check does not — yaml for the workflow file, and cross-cutting (typos/gitleaks/editorconfig-checker) when any text file changed and the repo opts into those tools — resolving the editorconfig-checker binary-name variant before substituting it in.", + "expected_output": "Runs the lint-only `yaml` and `cross-cutting` surfaces that /toolchain:check does not — yaml for the workflow file, and cross-cutting (typos/gitleaks/editorconfig-checker/lychee-offline) when any text file changed and the repo opts into those tools — resolving the editorconfig-checker binary-name variant before substituting it in.", "files": [], "expectations": [ "Runs the `yaml` surface for the workflow file (a `/toolchain:lint`-only surface not covered by `/toolchain:check`)", diff --git a/plugins/toolchain/skills/setup/SKILL.md b/plugins/toolchain/skills/setup/SKILL.md index 3cf2a868f9..db5d5613d4 100644 --- a/plugins/toolchain/skills/setup/SKILL.md +++ b/plugins/toolchain/skills/setup/SKILL.md @@ -81,7 +81,7 @@ then specialize it to the repo: - **markdown** — a markdownlint config present. - **yaml** — `.github/workflows/` present (lint-only surface — `/toolchain:lint` runs it, `/toolchain:check` does not). -- **cross-cutting** — repo-root config for `typos`/`gitleaks`/editorconfig-checker present (lint-only). +- **cross-cutting** — repo-root config for `typos`/`gitleaks`/editorconfig-checker/`lychee-offline` present (lint-only). Repo-specific CI-parity gates beyond plain build/test/lint (lockfile drift, generated-artifact freshness, schema regeneration) belong in the ecosystem file's `gates` array — draft one when the From 731b4874d6818926d7ff5504b5be0c7b7d842a3d Mon Sep 17 00:00:00 2001 From: Kyle Sexton <153232337+kyle-sexton@users.noreply.github.com> Date: Tue, 21 Jul 2026 12:50:38 -0400 Subject: [PATCH 2/4] chore: retrigger review CI (infra failure on prior run) The automated review check on the prior push failed with an infra error ("no execution file was produced") rather than a real review verdict; gh run rerun could not retry it directly. Empty commit to get a fresh review pass. Co-Authored-By: Claude Sonnet 5 Claude-Session: 0f69ae76-07e0-4aae-9c4a-11688fc0e8ea From 84a9aaf79d9587bbfdc0b003d2360457739ea9ef Mon Sep 17 00:00:00 2001 From: Kyle Sexton <153232337+kyle-sexton@users.noreply.github.com> Date: Tue, 21 Jul 2026 18:48:59 -0400 Subject: [PATCH 3/4] docs(toolchain): make cross-cutting tool backtick wrapping consistent Wrap gitleaks and editorconfig-checker in backticks to match typos and lychee-offline in the cross-cutting inference-candidate line. --- plugins/toolchain/skills/setup/SKILL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/toolchain/skills/setup/SKILL.md b/plugins/toolchain/skills/setup/SKILL.md index db5d5613d4..d218c0cb73 100644 --- a/plugins/toolchain/skills/setup/SKILL.md +++ b/plugins/toolchain/skills/setup/SKILL.md @@ -81,7 +81,7 @@ then specialize it to the repo: - **markdown** — a markdownlint config present. - **yaml** — `.github/workflows/` present (lint-only surface — `/toolchain:lint` runs it, `/toolchain:check` does not). -- **cross-cutting** — repo-root config for `typos`/`gitleaks`/editorconfig-checker/`lychee-offline` present (lint-only). +- **cross-cutting** — repo-root config for `typos`/`gitleaks`/`editorconfig-checker`/`lychee-offline` present (lint-only). Repo-specific CI-parity gates beyond plain build/test/lint (lockfile drift, generated-artifact freshness, schema regeneration) belong in the ecosystem file's `gates` array — draft one when the From 32d0ddcfc3de0b1aab56248d8b462f85fab95b1a Mon Sep 17 00:00:00 2001 From: Kyle Sexton <153232337+kyle-sexton@users.noreply.github.com> Date: Wed, 22 Jul 2026 09:52:27 -0400 Subject: [PATCH 4/4] fix(toolchain): restore missing blank line before CHANGELOG 0.5.1 heading markdownlint MD022/MD032: a heading and the list above it need a blank line between them. Lost during the 0.9.0 rebase conflict resolution. Co-authored-by: Claude Sonnet 5 --- plugins/toolchain/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/toolchain/CHANGELOG.md b/plugins/toolchain/CHANGELOG.md index 6b45c996c1..635efc155e 100644 --- a/plugins/toolchain/CHANGELOG.md +++ b/plugins/toolchain/CHANGELOG.md @@ -87,6 +87,7 @@ All notable changes to the `toolchain` plugin are documented here. Format follow - Skills with `!` dynamic-context injections now declare `shell: bash` explicitly, per the pinned precompute convention — bash-only pipelines must not fall through to a PowerShell host. + ## [0.5.1] ### Changed