kitcode 0.1.13

KitCode Agent is an AI agent built in Rust.
# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json

name: CI

on:
  pull_request:
    types: [opened, synchronize, reopened, ready_for_review]
  push:
    branches:
      - main

permissions: {}

concurrency:
  group: ci-${{ github.event.pull_request.head.sha || github.ref }}
  cancel-in-progress: true

jobs:
  plan:
    name: Path Filter
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: read
    outputs:
      docs: ${{ steps.filter.outputs.docs }}
      code: ${{ steps.filter.outputs.code }}
    steps:
      - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
        with:
          persist-credentials: false
      - uses: dorny/paths-filter@ceb8a2b8f2d89434be7ff52d3de7ec3738c5cc9d # v4.0.3
        id: filter
        with:
          filters: |
            docs:
              - '**/*.md'
              - 'docs/**'
              - '.config/rumdl.toml'
              - '.config/autocorrectrc'
              - '.config/lychee.toml'
            code:
              - '**'
              - '!**/*.md'
              - '!docs/**'
              - '!LICENSE'
              - '!.config/rumdl.toml'
              - '!.config/autocorrectrc'
              - '!.config/lychee.toml'

  docs:
    name: Docs Checks
    needs: plan
    if: ${{ needs.plan.outputs.docs == 'true' || needs.plan.outputs.code == 'true' }}
    runs-on: ubuntu-latest
    permissions:
      contents: read
    steps:
      - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
        with:
          persist-credentials: false
      - uses: jdx/mise-action@b44d12e7d0d8ee7461bb893e1b1993500433185b # v5.2.7
        with:
          install: true
      - name: Run docs checks
        run: mise x -- hk check --all -q --step autocorrect --step rumdl --step mmdr --step lychee --step typos

  checks:
    name: Checks
    needs: plan
    if: ${{ needs.plan.outputs.code == 'true' }}
    runs-on: ubuntu-latest
    permissions:
      contents: read
    steps:
      - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
        with:
          persist-credentials: false
      - uses: dtolnay/rust-toolchain@683b588c487a69d01f6c6ddf40f036ff682cc2c8 # v1
        with:
          toolchain: stable
          components: rustfmt, clippy
      - uses: Swatinem/rust-cache@d1527c8f67ef9af357290475d4af4b0fab8f12e0 # v2.9.3
      - uses: jdx/mise-action@b44d12e7d0d8ee7461bb893e1b1993500433185b # v5.2.7
        with:
          install: true
      - name: Run code checks
        run: mise x -- hk check --all -q --step cargo_fmt --step cargo_clippy --step cargo_test

  security:
    name: Security
    needs: plan
    if: ${{ needs.plan.outputs.code == 'true' }}
    runs-on: ubuntu-latest
    permissions:
      contents: read
    steps:
      - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
        with:
          fetch-depth: 0
          persist-credentials: false
      - uses: jdx/mise-action@b44d12e7d0d8ee7461bb893e1b1993500433185b # v5.2.7
        with:
          install: true
      - name: Scan for leaked secrets
        run: mise x -- gitleaks git --verbose --redact .
      - name: Audit dependencies with cargo-deny
        run: mise x -- cargo deny check

  gate:
    name: Merge Gate
    needs: [plan, docs, checks, security]
    if: always()
    runs-on: ubuntu-latest
    steps:
      - name: Verify required checks
        env:
          PLAN_RESULT: ${{ needs.plan.result }}
          DOCS_RESULT: ${{ needs.docs.result }}
          CHECKS_RESULT: ${{ needs.checks.result }}
          SECURITY_RESULT: ${{ needs.security.result }}
        run: |
          if [ "$PLAN_RESULT" != "success" ]; then
            exit 1
          fi
          for r in "$DOCS_RESULT" "$CHECKS_RESULT" "$SECURITY_RESULT"; do
            if [ "$r" != "success" ] && [ "$r" != "skipped" ]; then
              exit 1
            fi
          done