Skip to content

✨ feat(kb): cloud backups toolbar chip + popover, progressive page load #537

✨ feat(kb): cloud backups toolbar chip + popover, progressive page load

✨ feat(kb): cloud backups toolbar chip + popover, progressive page load #537

Workflow file for this run

name: CI
on:
push:
branches: [main, develop]
paths-ignore:
- 'docs/**'
- '**.md'
pull_request:
branches: [main]
paths-ignore:
- 'docs/**'
- '**.md'
env:
CARGO_TERM_COLOR: always
RUST_BACKTRACE: 1
jobs:
check:
name: Check
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install system build dependencies
run: |
sudo apt-get update
sudo apt-get install -y protobuf-compiler pkg-config libasound2-dev libdbus-1-dev
- name: Install pnpm
uses: pnpm/action-setup@v3
with:
version: 9
- name: Get pnpm store directory
id: pnpm-cache
shell: bash
run: echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_OUTPUT
- name: Setup pnpm cache
uses: actions/cache@v4
with:
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('web/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22
- name: Build frontend
working-directory: web
run: |
pnpm install --frozen-lockfile
pnpm run build
- name: Install Rust
uses: dtolnay/rust-toolchain@master
with:
# Pinned toolchain (matches local dev) so CI clippy does not drift
# onto newly-released lints between stable releases.
toolchain: "1.94"
components: clippy, rustfmt
- name: Cache Rust dependencies
uses: Swatinem/rust-cache@v2
- name: Check formatting
run: cargo fmt -- --check
- name: Run clippy
run: cargo clippy --all-features -- -D warnings
- name: Run static analysis
run: |
chmod +x scripts/static-analysis.sh
./scripts/static-analysis.sh
- name: Gate integrity checks
run: |
chmod +x scripts/gate-integrity.sh
./scripts/gate-integrity.sh --tree
- name: Check build
run: cargo check --all-features
- name: Check docs build
run: cargo doc --no-deps --all-features
msrv:
name: MSRV Check
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install system build dependencies
run: |
sudo apt-get update
sudo apt-get install -y protobuf-compiler pkg-config libasound2-dev libdbus-1-dev
- name: Ensure web assets directory exists
run: mkdir -p dist
- name: Install Rust MSRV
uses: dtolnay/rust-toolchain@master
with:
toolchain: "1.94"
- name: Cache Rust dependencies
uses: Swatinem/rust-cache@v2
- name: Verify MSRV
run: cargo check --all-features
test:
name: Test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install system build dependencies
run: |
sudo apt-get update
sudo apt-get install -y protobuf-compiler pkg-config libasound2-dev libdbus-1-dev
- name: Install pnpm
uses: pnpm/action-setup@v3
with:
version: 9
- name: Get pnpm store directory
id: pnpm-cache
shell: bash
run: echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_OUTPUT
- name: Setup pnpm cache
uses: actions/cache@v4
with:
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('web/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22
- name: Build frontend
working-directory: web
run: |
pnpm install --frozen-lockfile
pnpm run build
- name: Install Rust
uses: dtolnay/rust-toolchain@master
with:
toolchain: "1.94"
- name: Cache Rust dependencies
uses: Swatinem/rust-cache@v2
- name: Verify python3 (for MCP E2E tests)
run: python3 --version
- name: Run tests
run: "cargo test --all-features -- --skip e2e:: --nocapture"
- name: Run E2E tests (mock + no-provider)
run: |
cargo test --test e2e_test -- \
--skip llm_chat_tests \
--skip tool_chat_tests \
--skip browser_chat_tests \
--test-threads=1
- name: Run doc tests
run: cargo test --doc --all-features
test-local-embeddings:
name: Test local-embeddings feature
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install system build dependencies
run: |
sudo apt-get update
sudo apt-get install -y build-essential cmake protobuf-compiler pkg-config libasound2-dev libdbus-1-dev
- name: Ensure web assets directory exists
run: mkdir -p dist
- name: Install pnpm
uses: pnpm/action-setup@v3
with:
version: 9
- name: Get pnpm store directory
id: pnpm-cache
shell: bash
run: echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_OUTPUT
- name: Setup pnpm cache
uses: actions/cache@v4
with:
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('web/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22
- name: Build frontend
# web_ui handler tests read real assets from dist/, so the job must
# build the frontend just like the Test / Test (macOS) / Code Coverage
# jobs do; otherwise asset lookups fall through and the found-path
# assertions fail.
working-directory: web
run: |
pnpm install --frozen-lockfile
pnpm run build
- name: Install Rust
uses: dtolnay/rust-toolchain@master
with:
toolchain: "1.94"
- name: Cache Rust dependencies
uses: Swatinem/rust-cache@v2
- name: Run local-embeddings tests
run: "cargo test --features local-embeddings -- --skip e2e::"
test-macos:
name: Test (macOS)
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- name: Install system build dependencies
run: brew install protobuf
- name: Install pnpm
uses: pnpm/action-setup@v3
with:
version: 9
- name: Get pnpm store directory
id: pnpm-cache
shell: bash
run: echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_OUTPUT
- name: Setup pnpm cache
uses: actions/cache@v4
with:
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('web/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22
- name: Build frontend
working-directory: web
run: |
pnpm install --frozen-lockfile
pnpm run build
- name: Install Rust
uses: dtolnay/rust-toolchain@master
with:
toolchain: "1.94"
- name: Cache Rust dependencies
uses: Swatinem/rust-cache@v2
- name: Run tests
run: "cargo test --all-features -- --skip e2e:: --nocapture"
build:
name: Build
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, macos-latest]
features: [default, all-features]
steps:
- uses: actions/checkout@v4
- name: Install system build dependencies (Ubuntu)
if: runner.os == 'Linux'
run: |
sudo apt-get update
sudo apt-get install -y protobuf-compiler pkg-config libasound2-dev libdbus-1-dev
- name: Install system build dependencies (macOS)
if: runner.os == 'macOS'
run: brew install protobuf
- name: Install pnpm
uses: pnpm/action-setup@v3
with:
version: 9
- name: Get pnpm store directory
id: pnpm-cache
shell: bash
run: echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_OUTPUT
- name: Setup pnpm cache
uses: actions/cache@v4
with:
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('web/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22
- name: Build frontend
working-directory: web
run: |
pnpm install --frozen-lockfile
pnpm run build
- name: Install Rust
uses: dtolnay/rust-toolchain@master
with:
toolchain: "1.94"
- name: Cache Rust dependencies
uses: Swatinem/rust-cache@v2
- name: Check (default)
if: matrix.features == 'default'
run: cargo check
- name: Check (all features)
if: matrix.features == 'all-features'
run: cargo check --all-features
frontend:
name: Frontend Build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v3
with:
version: 9
- name: Get pnpm store directory
id: pnpm-cache
shell: bash
run: echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_OUTPUT
- name: Setup pnpm cache
uses: actions/cache@v4
with:
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('web/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22
- name: Install dependencies
working-directory: web
run: pnpm install --frozen-lockfile
- name: Build frontend
working-directory: web
run: pnpm run build
- name: Type check
working-directory: web
run: npx tsc --noEmit
security:
name: Security Audit
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@master
with:
toolchain: "1.94"
- name: Cache Rust dependencies
uses: Swatinem/rust-cache@v2
- name: Run cargo audit
uses: actions-rust-lang/audit@v1
- name: Install cargo-deny
uses: taiki-e/install-action@cargo-deny
- name: Run cargo-deny
run: cargo deny check
coverage:
name: Code Coverage
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install system build dependencies
run: |
sudo apt-get update
sudo apt-get install -y protobuf-compiler pkg-config libasound2-dev libdbus-1-dev
- name: Install pnpm
uses: pnpm/action-setup@v3
with:
version: 9
- name: Get pnpm store directory
id: pnpm-cache
shell: bash
run: echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_OUTPUT
- name: Setup pnpm cache
uses: actions/cache@v4
with:
path: ${{ steps.pnpm-cache.outputs.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('web/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22
- name: Build frontend
working-directory: web
run: |
pnpm install --frozen-lockfile
pnpm run build
- name: Install Rust
uses: dtolnay/rust-toolchain@master
with:
toolchain: "1.94"
components: llvm-tools-preview
- name: Cache Rust dependencies
uses: Swatinem/rust-cache@v2
- name: Install cargo-llvm-cov
uses: taiki-e/install-action@cargo-llvm-cov
- name: Generate coverage report
# Source-based coverage via llvm-cov. tarpaulin's ptrace instrumentation
# segfaulted non-deterministically (the crash point drifted across runs:
# skill-manager, screenshot-encoder, system, use_loop), so it was
# replaced; the accumulated tarpaulin-era test skips are dropped — every
# test that runs in the normal suite runs here too. e2e:: is skipped
# for the same reason the Test job skips it (spawns gateway processes,
# slow/flaky under CI). The 55% gate matches the measured llvm-cov
# baseline (~56.3% locally); ratchet it up as coverage improves —
# tarpaulin's old fail-under=80 was aspirational and never met.
# syscity-desktop is excluded: its Tauri/glib build needs GTK system
# libraries that CI doesn't install, and it has no tests anyway.
run: "cargo llvm-cov --workspace --exclude syscity-desktop --all-features --lcov --output-path lcov.info --fail-under-lines 55 --ignore-filename-regex '(^|/)(tests|target)/' -- --skip e2e::"
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
with:
files: ./lcov.info
fail_ci_if_error: false
verbose: true
plugin-boundary:
name: Plugin SDK Boundary
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Check plugin SDK boundary
run: |
chmod +x scripts/check-plugin-boundary.sh
SYSCITY_PLUGIN_DIRS="./plugins" ./scripts/check-plugin-boundary.sh