Skip to content

CI/CD Integration ​

Automate MRSF validation and re-anchoring in your CI pipeline to catch broken sidecars, stale anchors, and schema violations before they land in your main branch.

GitHub Actions ​

Validate on every pull request ​

Add this workflow to .github/workflows/mrsf-validate.yml:

yaml
name: MRSF Validate

on:
  pull_request:
    paths:
      - "**/*.md"
      - "**/*.review.yaml"
      - "**/*.review.json"

jobs:
  validate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-node@v4
        with:
          node-version: 20

      - name: Validate sidecars
        run: npx -y @mrsf/cli validate --strict

The --strict flag treats warnings as errors, so the job fails on any schema warning or stale anchor.

Re-anchor after document changes ​

You can also re-anchor comments automatically and commit the updated sidecars:

yaml
name: MRSF Re-anchor

on:
  push:
    branches: [main]
    paths:
      - "docs/**/*.md"

jobs:
  reanchor:
    runs-on: ubuntu-latest
    permissions:
      contents: write
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0  # full history for git diff analysis

      - uses: actions/setup-node@v4
        with:
          node-version: 20

      - name: Re-anchor all sidecars
        run: npx -y @mrsf/cli reanchor

      - name: Commit updated sidecars
        run: |
          git config user.name "github-actions[bot]"
          git config user.email "github-actions[bot]@users.noreply.github.com"
          git add "**/*.review.yaml" "**/*.review.json"
          git diff --cached --quiet || git commit -m "chore: re-anchor MRSF sidecars"
          git push

TIP

Use fetch-depth: 0 so the CLI can access git history for diff-based re-anchoring. Without full history, only exact and fuzzy matching are available.

Combined workflow ​

For a single workflow that validates on PRs and re-anchors on push to main:

yaml
name: MRSF

on:
  pull_request:
    paths: ["**/*.md", "**/*.review.yaml", "**/*.review.json"]
  push:
    branches: [main]
    paths: ["docs/**/*.md"]

jobs:
  validate:
    if: github.event_name == 'pull_request'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: 20 }
      - run: npx -y @mrsf/cli validate --strict

  reanchor:
    if: github.event_name == 'push'
    runs-on: ubuntu-latest
    permissions:
      contents: write
    steps:
      - uses: actions/checkout@v4
        with: { fetch-depth: 0 }
      - uses: actions/setup-node@v4
        with: { node-version: 20 }
      - run: npx -y @mrsf/cli reanchor
      - run: |
          git config user.name "github-actions[bot]"
          git config user.email "github-actions[bot]@users.noreply.github.com"
          git add "**/*.review.yaml" "**/*.review.json"
          git diff --cached --quiet || git commit -m "chore: re-anchor MRSF sidecars"
          git push

Azure DevOps Pipelines ​

yaml
trigger:
  paths:
    include:
      - "**/*.md"
      - "**/*.review.yaml"

pool:
  vmImage: "ubuntu-latest"

steps:
  - task: NodeTool@0
    inputs:
      versionSpec: "20.x"

  - script: npx -y @mrsf/cli validate --strict
    displayName: "Validate MRSF sidecars"

Generic CI ​

For any CI system that supports Node.js:

bash
# Install globally (or use npx)
npm install -g @mrsf/cli

# Validate all sidecars in the repo
mrsf validate --strict

# Or validate a specific file
mrsf validate docs/architecture.md

# Check comment health (stale anchors, orphans)
mrsf status

The validate command exits with a non-zero code when errors are found, making it suitable for any CI gate.

What gets checked ​

Checkvalidatevalidate --strict
Schema compliance✅ Error✅ Error
Missing required fields✅ Error✅ Error
Stale anchors (selected_text mismatch)⚠️ Warning✅ Error
Orphaned comments⚠️ Warning✅ Error
Hash inconsistencies⚠️ Warning✅ Error
Document file missing✅ Error✅ Error

Released under the MIT License.