busbar-sf-agentscript 0.0.2

AgentScript parser, graph analysis, and LSP for Salesforce Agentforce
Documentation
name: CI

on:
  push:
    branches: [main, "feature/**", "fix/**", "chore/**", "dev"]
  pull_request:
  workflow_dispatch:

# Cancel in-progress runs on the same branch when a newer commit is pushed.
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

permissions:
  contents: read

env:
  RUST_BACKTRACE: 1
  CARGO_TERM_COLOR: always

jobs:
  rust-fmt:
    name: Rust Format
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
        with:
          components: rustfmt
      - run: cargo fmt --all --check

  rust-clippy:
    name: Rust Clippy
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          submodules: true
      - uses: dtolnay/rust-toolchain@stable
        with:
          components: clippy
      - uses: Swatinem/rust-cache@v2
      - run: cargo clippy --workspace --all-targets --all-features -- -D warnings

  test-agentscript:
    name: Test / Rust / agentscript
    runs-on: ubuntu-latest
    needs: [rust-fmt, rust-clippy]
    steps:
      - uses: actions/checkout@v4
        with:
          submodules: true
      - uses: dtolnay/rust-toolchain@stable
      - uses: Swatinem/rust-cache@v2
      - run: cargo test -p busbar-sf-agentscript --all-features

  test-lsp:
    name: Test / lsp
    runs-on: ubuntu-latest
    needs: [rust-fmt, rust-clippy]
    steps:
      - uses: actions/checkout@v4
        with:
          submodules: true
      - uses: dtolnay/rust-toolchain@stable
      - uses: Swatinem/rust-cache@v2
      - run: cargo test -p busbar-sf-agentscript-lsp --all-features

  wasm-agentscript:
    name: WASM check / agentscript
    runs-on: ubuntu-latest
    needs: [rust-fmt, rust-clippy]
    steps:
      - uses: actions/checkout@v4
        with:
          submodules: true
      - uses: dtolnay/rust-toolchain@stable
        with:
          targets: wasm32-unknown-unknown
      - uses: Swatinem/rust-cache@v2
      - run: cargo check -p busbar-sf-agentscript --target wasm32-unknown-unknown --features wasm

  rust-docs:
    name: Rust Docs
    runs-on: ubuntu-latest
    needs: [rust-fmt, rust-clippy]
    env:
      RUSTDOCFLAGS: -D warnings
    steps:
      - uses: actions/checkout@v4
        with:
          submodules: true
      - uses: dtolnay/rust-toolchain@stable
      - uses: Swatinem/rust-cache@v2
      - run: cargo doc --no-deps --all-features --workspace

  rust-deny:
    name: Cargo Deny
    runs-on: ubuntu-latest
    needs: [rust-fmt, rust-clippy]
    steps:
      - uses: actions/checkout@v4
      - uses: EmbarkStudios/cargo-deny-action@v2

  rust-audit:
    name: Security Audit
    runs-on: ubuntu-latest
    needs: [rust-fmt, rust-clippy]
    steps:
      - uses: actions/checkout@v4
      - uses: rustsec/audit-check@v2
        with:
          token: ${{ secrets.GITHUB_TOKEN }}

  rust-coverage:
    name: Coverage
    runs-on: ubuntu-latest
    needs: [test-agentscript, test-lsp]
    steps:
      - uses: actions/checkout@v4
        with:
          submodules: true
      - uses: dtolnay/rust-toolchain@stable
        with:
          components: llvm-tools-preview
      - uses: Swatinem/rust-cache@v2
      - uses: taiki-e/install-action@cargo-llvm-cov
      - run: cargo llvm-cov --workspace --all-features --lcov --output-path lcov.info
      - uses: codecov/codecov-action@v5
        with:
          files: lcov.info
          token: ${{ secrets.CODECOV_TOKEN }}
          fail_ci_if_error: false

  sf-plugin-build:
    name: SF Plugin Build
    runs-on: ubuntu-latest
    needs: [rust-fmt, rust-clippy]
    steps:
      - uses: actions/checkout@v4
        with:
          submodules: true
      - uses: dtolnay/rust-toolchain@stable
        with:
          targets: wasm32-unknown-unknown
      - uses: Swatinem/rust-cache@v2
      - uses: actions/setup-node@v4
        with:
          node-version: "20"
      - name: Install wasm-bindgen-cli
        run: |
          VERSION=$(cargo metadata --format-version 1 | jq -r '.packages[] | select(.name == "wasm-bindgen") | .version')
          cargo install wasm-bindgen-cli --version "$VERSION" --locked
      - name: Build WASM package
        run: |
          WASM_VERSION=$(grep '^version' Cargo.toml | head -1 | sed 's/version = "\(.*\)"/\1/')
          cargo build --lib --release --target wasm32-unknown-unknown --features wasm,graph
          mkdir -p pkg
          wasm-bindgen --target web --out-dir pkg \
            target/wasm32-unknown-unknown/release/busbar_sf_agentscript.wasm
          node -e "
            const fs = require('fs');
            fs.writeFileSync('pkg/package.json', JSON.stringify({
              name: '@muselab/busbar-sf-agentscript',
              version: '$WASM_VERSION',
              files: ['busbar_sf_agentscript_bg.wasm','busbar_sf_agentscript.js','busbar_sf_agentscript.d.ts','busbar_sf_agentscript_bg.wasm.d.ts'],
              main: 'busbar_sf_agentscript.js',
              types: 'busbar_sf_agentscript.d.ts',
              sideEffects: false
            }, null, 2));
          "
      - name: Install plugin dependencies
        run: |
          # Link the locally built WASM into npm's global registry so
          # plugin-agency can install it by name+version without modifying package.json
          (cd pkg && npm link)
          (cd plugin-agency && npm link @muselab/busbar-sf-agentscript && npm install)
      - name: Build SF plugin
        working-directory: plugin-agency/
        run: npm run build

  vscode-build:
    name: VS Code Extension Build
    runs-on: ubuntu-latest
    needs: [rust-fmt, rust-clippy]
    defaults:
      run:
        working-directory: packages/
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: "20"
          cache: npm
          cache-dependency-path: packages/package-lock.json
      - run: npm ci
      - run: npm run compile

  zed-build:
    name: Zed Extension Build
    runs-on: ubuntu-latest
    needs: [rust-fmt, rust-clippy]
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
        with:
          targets: wasm32-wasip2
      - uses: Swatinem/rust-cache@v2
        with:
          key: zed-wasm32-wasip2
          workspaces: zed-extension
      - name: Build Zed extension
        run: cargo build --manifest-path zed-extension/Cargo.toml --target wasm32-wasip2

  tree-sitter-check:
    name: Tree-sitter Grammar Check
    runs-on: ubuntu-latest
    needs: [rust-fmt, rust-clippy]
    defaults:
      run:
        working-directory: tree-sitter-agentscript/
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: "20"
          cache: npm
          cache-dependency-path: tree-sitter-agentscript/package-lock.json
      - run: npm ci
      - run: npm run generate
      - run: npm test

  ci-pass:
    name: CI Pass
    runs-on: ubuntu-latest
    needs:
      - rust-fmt
      - rust-clippy
      - test-agentscript
      - test-lsp
      - wasm-agentscript
      - rust-docs
      - rust-deny
      - rust-audit
      - rust-coverage
      - sf-plugin-build
      - vscode-build
      - zed-build
      - tree-sitter-check
    steps:
      - run: echo "All CI jobs passed"