kraal 0.3.0

A terminal workspace manager for SSH fleets and coding agents
name: CI

# Linux on every push and pull request. macOS on pull requests, tags, and when asked for (Actions,
# Run workflow); a push to main was already tested in its pull request.

on:
  push:
    branches: [main]
    tags: ["v*"]
  pull_request:
  workflow_dispatch:

jobs:
  linux:
    runs-on: ubuntu-latest
    timeout-minutes: 20
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
        with:
          components: rustfmt, clippy
      - run: cargo fmt --check
      - run: cargo clippy --all-targets -- -D warnings
      - run: cargo test

  macos:
    if: github.event_name != 'push' || startsWith(github.ref, 'refs/tags/')
    runs-on: macos-latest
    timeout-minutes: 25
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
        with:
          components: clippy
      - run: cargo clippy --all-targets -- -D warnings
      # Every failure reported, not only the first test binary's.
      - run: cargo test --no-fail-fast

  # This kraal with sessions of the oldest release it supports and of the latest one, and their
  # commands with a session of this kraal (tests/compat.sh). macOS runs when the macos job does.
  compat:
    strategy:
      fail-fast: false
      matrix:
        os: ${{ fromJSON(github.event_name == 'push' && !startsWith(github.ref, 'refs/tags/') && '["ubuntu-latest"]' || '["ubuntu-latest", "macos-latest"]') }}
    runs-on: ${{ matrix.os }}
    timeout-minutes: 20
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
      - uses: Swatinem/rust-cache@v2
      - id: releases
        run: echo "tags=$(tests/compat.sh --list)" >> "$GITHUB_OUTPUT"
      # The releases' binaries, downloaded once and checked against their checksums then.
      - uses: actions/cache@v4
        with:
          path: ${{ runner.temp }}/kraal-compat
          key: kraal-releases-${{ runner.os }}-${{ runner.arch }}-${{ steps.releases.outputs.tags }}
      - run: tests/compat.sh ${{ steps.releases.outputs.tags }}
        env:
          KRAAL_COMPAT_DIR: ${{ runner.temp }}/kraal-compat