Thanks for helping keep SEO regressions out of production. Issues and PRs are welcome.
- One sharp theme. Every action is an SEO deploy gate — nothing else. If a change broadens the scope beyond "catch a technical-SEO regression before it ships," it probably belongs in a different tool.
- A gate must be able to fail. Every gate ships with a
goodfixture it passes and abrokenfixture it fails, exercised by the negative integration job. No exceptions. - Self-contained. No proprietary credentials to build, test, or demo.
npm ci
npm run verify # typecheck + lint + test + buildnpm run serve-fixtures serves the fixtures at http://127.0.0.1:8099 for
manual URL-mode testing.
src/lib/— the shared, dependency-light library (report model, fetch, HTML, robots, XML, URL helpers, and the GitHub Actions wiring). Keep it pure and unit-tested; it is bundled into every action.actions/<name>/— one gate each:action.yml,src/(with the pure check logic factored out ofindex.tsso it is testable without the Actions runtime), tests, a focusedREADME.md, and the committeddist/index.js.fixtures/good+fixtures/broken— the proof the gates work.
- Scaffold
actions/<name>/mirroring an existing action (e.g.validate-robots). Entry point isvoid runAction(async () => …)— never top-levelawait(the CJS bundle forbids it). - Put the decision logic in a pure module and the I/O in
index.ts. - Add a
goodand abrokenfixture and wire both into.github/workflows/test.yml(positive + negative jobs). - Write unit tests (and URL-mode tests via
tests/helpers/fixture-server.mjs). npm run buildand commit thedist/— CI fails if it drifts from source.npm run verifymust be green before you open the PR.
- TypeScript strict; ESM source, CJS bundles.
- Findings use stable, grep-able UPPER_SNAKE codes prefixed by the gate
(
ROBOTS_*,SITEMAP_*,CANONICAL_*,REDIRECT_*,JSONLD_*,LH_*,SMOKE_*). - Severity:
errorfails the gate;warningfails only instrictmode;noticeis informational.
By contributing you agree your work is licensed under the repository's MIT license.