mirror-log 0.1.9

Append-only event log for personal knowledge management with semantic chunking using SQLite.
Documentation
name: Rust CI

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main, develop]

env:
  CARGO_TERM_COLOR: always

jobs:
  lint:
    name: Lint (clippy)
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@stable
        with:
          components: clippy, rustfmt

      - name: Cache dependencies
        uses: Swatinem/rust-cache@v2
        with:
          cache-on-failure: true

      - name: Install cargo-honey (dependency hygiene)
        run: |
          curl -L https://github.com/cromwellian/cargo-honey/releases/latest/download/cargo-honey-x86_64-unknown-linux-gnu.tar.gz \
            | tar xzf - -C ~/.cargo/bin/ 2>/dev/null || true

      - name: Run clippy on all targets (lib)
        run: cargo clippy --lib --all-targets --all-features -- -D warnings

      - name: Run clippy on binary target
        run: cargo clippy --bin mirror-log --all-features -- -D warnings

      - name: Check formatting
        run: cargo fmt --check

      - name: Run cargo-honey dependency check
        if: hashFiles('Cargo.lock') != ''
        run: |
          cargo honey check || echo "cargo-honey not available, skipping"

  test:
    name: Test Suite
    runs-on: ubuntu-latest
    strategy:
      matrix:
        rust: [stable, beta]
        feature-set: ["", "--features embedding,inference"]
      fail-fast: false

    steps:
      - uses: actions/checkout@v4

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@${{ matrix.rust }}

      - name: Cache dependencies
        uses: Swatinem/rust-cache@v2
        with:
          cache-on-failure: true

      - name: Build and test (default features)
        if: ${{ matrix.feature-set == '' }}
        run: cargo test --verbose

      - name: Build and test (with optional features)
        if: ${{ matrix.feature-set != '' }}
        run: cargo test --verbose ${{ matrix.feature-set }}

  security:
    name: Security Audit
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@stable

      - name: Cache dependencies
        uses: Swatinem/rust-cache@v2
        with:
          cache-on-failure: true

      - name: Install cargo-audit
        run: |
          curl -L https://github.com/RustSec/cargo-audit/releases/latest/download/cargo-audit-x86_64-unknown-linux-musl.tar.gz \
            | tar xzf - -C ~/.cargo/bin/

      - name: Run cargo audit (advisories)
        run: cargo audit --deny warnings

      - name: Check for unmaintained dependencies
        run: cargo metadata --format-version=1 | jq '.packages[] | select(.yanked == true)' || echo "No yanked packages"

  deps:
    name: Dependency Hygiene
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@stable

      - name: Cache dependencies
        uses: Swatinem/rust-cache@v2
        with:
          cache-on-failure: true

      - name: Check for outdated dependencies
        run: cargo update --workspace --dry-run || echo "No updates available"

      - name: Verify dependency tree
        run: cargo tree --depth 1

      - name: Check multiple versions (cargo-audit-style check)
        run: |
          if grep -q 'multiple-versions' ~/.cargo/config.toml 2>/dev/null; then
            echo "Multiple version checks configured"
          else
            echo "No strict multi-version policy detected"
          fi

  build-release:
    name: Release Build Verification
    runs-on: ubuntu-latest
    needs: [lint, test]
    steps:
      - uses: actions/checkout@v4

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@stable

      - name: Cache dependencies
        uses: Swatinem/rust-cache@v2
        with:
          cache-on-failure: true

      - name: Build release binary
        run: cargo build --release --bin mirror-log

      - name: Verify strip and LTO settings
        run: |
          file target/release/mirror-log && \
          echo "Release binary built successfully"