name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
permissions:
contents: read
env:
CARGO_TERM_COLOR: always
jobs:
quality:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 - uses: dtolnay/rust-toolchain@4cda84d5c5c54efe2404f9d843567869ab1699d4 with:
toolchain: "1.91"
components: clippy,rustfmt,llvm-tools-preview
- uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 - uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 with:
node-version: "22"
cache: npm
- name: Rust format
run: cargo fmt --check
- name: Rust check
run: cargo check --workspace --locked
- name: Rust lint
run: cargo clippy --workspace --all-targets --locked -- -D warnings
- name: Rust tests
run: cargo test --workspace --all-targets --locked
- name: Rust package
run: |
set -euo pipefail
publishable="$(cargo metadata --no-deps --format-version 1 | jq -r '[.packages[] | select(.publish != []) | .name] | sort | join("\n")')"
if [ "$publishable" != "yarp-cli" ]; then
echo "expected yarp-cli to be the only publishable crate, got: $publishable" >&2
exit 1
fi
cargo package --locked -p yarp-cli
- name: Install Rust quality tools
run: |
cargo install cargo-audit --locked --version 0.22.2
cargo install cargo-llvm-cov --locked --version 0.8.7
cargo install slophammer-rs --locked --version 0.4.0
- name: Dependency audit
run: cargo audit --deny warnings
- name: Coverage
run: cargo llvm-cov --workspace --all-targets --fail-under-lines 85
- name: Install TypeScript tools
run: npm ci --ignore-scripts
- name: JavaScript dependency audit
run: npm audit
- name: Pi extension type check
run: npm run typecheck:pi
- name: Pi extension tests and coverage
run: npm run coverage:pi
- name: Slophammer DRY check
run: slophammer-rs dry .
- name: Slophammer dependency boundaries
run: slophammer-rs boundaries .
- name: Slophammer unsafe-code policy
run: slophammer-rs unsafe .
- name: Slophammer repository checks
run: slophammer-rs check .