CI Drift Detection
Add agentsmesh check and agentsmesh lint to your CI pipeline to catch config drift and validation errors in every pull request.
What drift is
Drift happens when:
- Someone edits
.agentsmesh/but forgets to runagentsmesh generate - Someone edits a generated file (
.claude/,.cursor/, etc.) directly - Someone adds an unexpected file under a managed generated-output location
- A PR merges canonical changes without regenerating
- An
extendssource changes and the project hasn’t refreshed
agentsmesh check detects all of these. It verifies two things against the stored lock: canonical-source drift (the .agentsmesh/ sources vs. the recorded checksums) and generated-output drift (recorded files are re-hashed to catch hand-edits or deletions, and managed output locations are scanned for stale files absent from the lock). Either kind of drift exits with code 1.
Basic CI setup
name: CI
on: [push, pull_request]
jobs: agentsmesh: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4
- uses: actions/setup-node@v4 with: node-version: '20'
- run: npm ci
- name: Lint AgentsMesh config run: agentsmesh lint
- name: Check AgentsMesh sync run: agentsmesh checkWhat each step catches
agentsmesh lint
Validates canonical config files:
- Invalid YAML frontmatter
- Missing required fields
- Unknown target names
- Invalid hook event types
- MCP server schema errors
- Duplicate rule/command/agent names
Fails with exit code 1 if any lint errors are found.
agentsmesh check
Verifies that both canonical sources and generated tool directories match the lock:
- Re-hashes
.agentsmesh/sources against the lock’schecksums(canonical drift) - Re-hashes each generated file recorded in the lock’s
outputsmap (generated-output drift) - Scans configured targets’ managed output locations for stale files absent from the lock
- Fails with exit code 1 if either has drifted
Locks written before generated-output tracking existed have no outputs map; check skips output verification and prints a note until you run agentsmesh generate once to upgrade the lock. Pass --no-outputs to skip output verification deliberately — for example, in CI setups that gitignore generated outputs, where every output would otherwise report as removed after checkout.
Automated fix comment
Add a comment to failing PRs explaining how to fix drift:
- name: Check AgentsMesh sync run: agentsmesh check id: check
- name: Comment on drift if: failure() && steps.check.outcome == 'failure' uses: actions/github-script@v7 with: script: | github.rest.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, body: '**AgentsMesh drift detected.**\n\nRun `agentsmesh generate` and commit the updated files.' })Full example with caching
name: CI
on: [push, pull_request]
jobs: quality: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4
- uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm'
- run: npm ci
- name: Lint AgentsMesh config run: agentsmesh lint
- name: Verify AI config is in sync run: agentsmesh checkManual fix workflow
When CI fails with drift:
# 1. Pull the branchgit checkout feature/my-changesgit pull
# 2. Regenerateagentsmesh generate
# 3. Review what changedgit diff
# 4. Commitgit add .agentsmesh/ .claude/ .cursor/git commit -m "chore: sync generated AI config"git push