CI Integration
Gate pull requests on Claude Code config quality with claude-launchpad doctor in GitHub Actions — plus a weekly canary that tests your generated config against the latest Claude Code release.
Add this GitHub Action to your repo. Every pull request that touches Claude Code config files will be checked automatically. Score below threshold = PR blocked.
name: Claude Code Config Quality
on:
pull_request:
paths: ['CLAUDE.md', '.claude/**', '.claudeignore']
jobs:
config-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: '22' }
- run: npx claude-launchpad@latest doctor --min-score 80 --jsonThe --min-score 80 flag returns exit code 1 if the score is below 80, which blocks the PR. The --json flag outputs structured JSON for programmatic consumption.
The canary pattern (how launchpad guards itself)
Generated configs can rot silently: Claude Code evolves, and a hook that was correct last quarter may no longer fire at all — with no error anywhere. Unit tests can't catch this because they validate what a tool emits, not what Claude Code executes.
Launchpad's own repo runs a weekly canary workflow that scaffolds a fresh project with init -y, installs the latest Claude Code release, and asserts real behavior in live headless sessions:
- the destructive-command hook actually blocks
rm -rf /... - the
.envguard actually fires (and the seeded secret stays out of the transcript) - the PostToolUse auto-format hook actually rewrites a just-written file
memory installactually registers the MCP server (claude mcp list)- SessionStart memory context injection actually produces output
Failures open a canary-failure issue automatically. It needs an ANTHROPIC_API_KEY secret and costs a few cents per run (short haiku sessions). If you maintain your own hook library, steal this pattern — it's in scripts/canary.sh.