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..635efc155e 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 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..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 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