Skip to content

fix(security): prevent sensitive file disclosure during skill updates #1912

fix(security): prevent sensitive file disclosure during skill updates

fix(security): prevent sensitive file disclosure during skill updates #1912

Workflow file for this run

name: CI
permissions:
checks: write
contents: read
on:
push:
branches: [main]
pull_request:
branches: [main]
merge_group:
branches: [main]
env:
CARGO_TERM_COLOR: always
RUST_BACKTRACE: 1
# Force JavaScript actions to use Node.js 24 (Node.js 20 is deprecated)
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
jobs:
# ==========================================================================
# Code Quality Checks
# ==========================================================================
check:
name: Check
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Setup Rust toolchain
uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9 # v1
with:
toolchain: stable
- name: Cache cargo registry
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
continue-on-error: true
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-check-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-check-
- name: Run cargo check
run: cargo check --all-targets --all-features
# ==========================================================================
# Formatting
# ==========================================================================
fmt:
name: Rustfmt
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Setup Rust toolchain
uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9 # v1
with:
toolchain: stable
components: rustfmt
- name: Check formatting
run: cargo fmt --all -- --check
# ==========================================================================
# Linting
# ==========================================================================
clippy:
name: Clippy
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Setup Rust toolchain
uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9 # v1
with:
toolchain: stable
components: clippy
- name: Cache cargo registry
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
continue-on-error: true
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-clippy-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-clippy-
- name: Run clippy
run: cargo clippy --all-targets --all-features -- -D warnings
# ==========================================================================
# Tests
# ==========================================================================
test:
name: Test (${{ matrix.os }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Setup Rust toolchain
uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9 # v1
with:
toolchain: stable
- name: Cache cargo registry
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
continue-on-error: true
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-test-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-test-
- name: Run tests
run: cargo test --all-features
# ==========================================================================
# Build verification
# ==========================================================================
build:
name: Build (${{ matrix.os }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Setup Rust toolchain
uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9 # v1
with:
toolchain: stable
- name: Cache cargo registry
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
continue-on-error: true
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-build-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-build-
- name: Build release binary
run: cargo build --release
- name: Test binary runs
shell: bash
run: |
./target/release/agentsync${{ matrix.os == 'windows-latest' && '.exe' || '' }} --help
./target/release/agentsync${{ matrix.os == 'windows-latest' && '.exe' || '' }} --version
# ==========================================================================
# Security audit
# ==========================================================================
audit:
name: Security Audit
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- name: Setup Rust toolchain
uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9 # v1
with:
toolchain: 1.89.0
- name: Install system packages required to build cargo-audit
run: |
for i in {1..5}; do
sudo apt-get update && \
sudo apt-get install -y \
build-essential \
pkg-config \
libssl-dev \
libclang-dev \
zlib1g-dev \
ca-certificates \
curl && break || sleep 5
if [ $i -eq 5 ]; then exit 1; fi
done
- name: Run cargo audit
uses: rustsec/audit-check@69366f33c96575abad1ee0dba8212993eecbe998 # v2.0.0
with:
token: ${{ secrets.GITHUB_TOKEN }}
# ==========================================================================
# End-to-End Tests
# ==========================================================================
e2e:
name: E2E Tests (${{ matrix.distro }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- distro: ubuntu
image: ubuntu@sha256:cd1dba651b3080c3686ecf4e3c4220f026b521fb76978881737d24f200828b2b
- distro: alpine
image: alpine@sha256:6baf43584bcb78f2e5847d1de515f23499913ac9f12bdf834811a3145eb11ca1
- distro: arch
image: archlinux@sha256:9b8e02df0f0a08fa8144d901932bd85d751257f83e00314053314a27ff87884f
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Setup Docker Buildx
uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 # v4.1.0
- name: Prepare E2E fixtures
run: |
cd tests/e2e/fixtures
zip -r sample-skill.zip sample-skill/
- name: Build and run E2E tests
env:
DISTRO: ${{ matrix.distro }}
IMAGE: ${{ matrix.image }}
run: |
cd tests/e2e
case "$DISTRO" in
ubuntu) export UBUNTU_IMAGE="$IMAGE" ;;
alpine) export ALPINE_IMAGE="$IMAGE" ;;
arch) export ARCH_IMAGE="$IMAGE" ;;
esac
status=0
docker compose build test-runner-$DISTRO || status=$?
if [ $status -eq 0 ]; then docker compose up --no-build --abort-on-container-exit --exit-code-from test-runner-$DISTRO test-runner-$DISTRO || status=$?; fi
docker compose down --volumes --remove-orphans
exit $status