Skip to content

feat(storage): add reconciliation migration foundation #83

feat(storage): add reconciliation migration foundation

feat(storage): add reconciliation migration foundation #83

Workflow file for this run

name: CI
on:
push:
branches: [develop]
pull_request:
branches: [develop, main]
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.ref_name }}
cancel-in-progress: true
env:
CARGO_TERM_COLOR: always
jobs:
lint:
name: Lint
runs-on: ubuntu-latest
defaults:
run:
working-directory: crosslink
steps:
- uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt, clippy
- name: Cache cargo
uses: actions/cache@v4
with:
path: |
~/.cargo/bin/
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
crosslink/target/
key: ${{ runner.os }}-cargo-lint-${{ hashFiles('crosslink/Cargo.lock') }}
- name: Check formatting
run: cargo fmt --all -- --check
- name: Verify generated Codex plugin assets
run: python3 scripts/sync-codex-plugin.py --check
- name: Clippy (strict)
run: cargo clippy -- -D warnings -W clippy::unwrap_used -W clippy::expect_used
security:
needs: lint
name: Security Audit
runs-on: ubuntu-latest
defaults:
run:
working-directory: crosslink
steps:
- uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Install cargo-audit
run: cargo install cargo-audit --locked
- name: Run security audit
run: cargo audit
test:
needs: lint
name: Test (${{ matrix.os }})
runs-on: ${{ matrix.os }}
timeout-minutes: 35
defaults:
run:
working-directory: crosslink
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
env:
PROPTEST_CASES: 10
steps:
- uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Cache cargo
uses: actions/cache@v4
with:
path: |
~/.cargo/bin/
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
crosslink/target/
key: ${{ runner.os }}-cargo-test-${{ hashFiles('crosslink/Cargo.lock') }}
- name: Build
run: cargo build --locked --verbose
- name: Run unit tests (with proptests, Ubuntu only)
if: matrix.os == 'ubuntu-latest'
run: cargo test --bin crosslink --verbose
- name: Run unit tests (skip proptests, macOS)
if: matrix.os == 'macos-latest'
run: cargo test --bin crosslink --verbose -- --skip proptest --skip prop_
- name: Run platform and provider unit tests (Windows)
if: matrix.os == 'windows-latest'
run: |
$filters = @(
"agents::",
"commands::container::",
"commands::design_cmd::",
"commands::doctor::",
"commands::init::",
"commands::kickoff::",
"dashboard::pty::tests",
"git_compat::",
"orchestrator::decompose::"
)
foreach ($filter in $filters) {
cargo test --bin crosslink --verbose $filter -- --skip proptest --skip prop_
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
}
- name: Run integration tests
run: cargo test --test cli_integration --verbose
- name: Run provider hook fixture tests
if: matrix.os != 'windows-latest'
run: cargo test --test provider_hooks --verbose
proptest:
needs: test
name: Property Tests
runs-on: ubuntu-latest
if: startsWith(github.head_ref, 'release/') || (github.event_name == 'pull_request' && github.base_ref == 'main')
defaults:
run:
working-directory: crosslink
steps:
- uses: actions/checkout@v4
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Cache cargo
uses: actions/cache@v4
with:
path: |
~/.cargo/bin/
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
crosslink/target/
key: ${{ runner.os }}-cargo-proptest-${{ hashFiles('crosslink/Cargo.lock') }}
- name: Run property-based tests (extended)
run: cargo test proptest --bin crosslink -- --test-threads=1
env:
PROPTEST_CASES: 1000
fuzz:
needs: test
name: Fuzz Tests
runs-on: ubuntu-latest
if: startsWith(github.head_ref, 'release/') || (github.event_name == 'pull_request' && github.base_ref == 'main')
defaults:
run:
working-directory: crosslink
steps:
- uses: actions/checkout@v4
- name: Install Rust nightly
uses: dtolnay/rust-toolchain@nightly
- name: Install cargo-fuzz
run: cargo install cargo-fuzz --locked
- name: Cache cargo
uses: actions/cache@v4
with:
path: |
~/.cargo/bin/
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
crosslink/target/
crosslink/fuzz/target/
key: ${{ runner.os }}-cargo-fuzz-${{ hashFiles('crosslink/Cargo.lock') }}
- name: Fuzz create_issue (60s)
run: cargo +nightly fuzz run fuzz_create_issue -- -max_total_time=60
- name: Fuzz search (60s)
run: cargo +nightly fuzz run fuzz_search -- -max_total_time=60
- name: Fuzz import (60s)
run: cargo +nightly fuzz run fuzz_import -- -max_total_time=60
- name: Fuzz dependency_graph (60s)
run: cargo +nightly fuzz run fuzz_dependency_graph -- -max_total_time=60
- name: Fuzz state_machine (60s)
run: cargo +nightly fuzz run fuzz_state_machine -- -max_total_time=60
- name: Fuzz cli_output (60s)
run: cargo +nightly fuzz run fuzz_cli_output -- -max_total_time=60
- name: Fuzz comments (60s)
run: cargo +nightly fuzz run fuzz_comments -- -max_total_time=60
- name: Fuzz labels (60s)
run: cargo +nightly fuzz run fuzz_labels -- -max_total_time=60
- name: Fuzz update_operations (60s)
run: cargo +nightly fuzz run fuzz_update_operations -- -max_total_time=60
- name: Fuzz milestones (60s)
run: cargo +nightly fuzz run fuzz_milestones -- -max_total_time=60
- name: Fuzz subissues (60s)
run: cargo +nightly fuzz run fuzz_subissues -- -max_total_time=60
- name: Fuzz relations (60s)
run: cargo +nightly fuzz run fuzz_relations -- -max_total_time=60