feat: Agent Orchestrator — multi-project agent dashboard
Tauri + Svelte 5 + Rust application for orchestrating multiple AI coding agents. Includes Claude, Aider, Codex, and Ollama provider support, multi-agent communication (btmsg/bttask), session anchors, plugin sandbox, FTS5 search, Landlock sandboxing, and 507 vitest + 110 cargo tests.
This commit is contained in:
commit
3672e92b7e
272 changed files with 68600 additions and 0 deletions
175
.github/workflows/e2e.yml
vendored
Normal file
175
.github/workflows/e2e.yml
vendored
Normal file
|
|
@ -0,0 +1,175 @@
|
|||
name: E2E Tests
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [v2-mission-control]
|
||||
paths:
|
||||
- 'v2/src/**'
|
||||
- 'v2/src-tauri/**'
|
||||
- 'v2/bterminal-core/**'
|
||||
- 'v2/tests/e2e/**'
|
||||
- '.github/workflows/e2e.yml'
|
||||
pull_request:
|
||||
branches: [master, v2-mission-control]
|
||||
paths:
|
||||
- 'v2/src/**'
|
||||
- 'v2/src-tauri/**'
|
||||
- 'v2/bterminal-core/**'
|
||||
- 'v2/tests/e2e/**'
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
env:
|
||||
CARGO_TERM_COLOR: always
|
||||
|
||||
jobs:
|
||||
unit-tests:
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20
|
||||
cache: npm
|
||||
cache-dependency-path: v2/package-lock.json
|
||||
|
||||
- name: Install npm dependencies
|
||||
working-directory: v2
|
||||
run: npm ci --legacy-peer-deps
|
||||
|
||||
- name: Run Vitest
|
||||
working-directory: v2
|
||||
run: npm run test
|
||||
|
||||
cargo-tests:
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install system dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y \
|
||||
libwebkit2gtk-4.1-dev \
|
||||
libgtk-3-dev \
|
||||
libayatana-appindicator3-dev \
|
||||
librsvg2-dev \
|
||||
libssl-dev \
|
||||
build-essential \
|
||||
pkg-config
|
||||
|
||||
- name: Setup Rust
|
||||
uses: dtolnay/rust-toolchain@stable
|
||||
|
||||
- name: Cache Rust dependencies
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: |
|
||||
~/.cargo/registry
|
||||
~/.cargo/git
|
||||
v2/target
|
||||
key: ${{ runner.os }}-cargo-test-${{ hashFiles('v2/Cargo.lock') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-cargo-test-
|
||||
|
||||
- name: Run cargo tests
|
||||
working-directory: v2/src-tauri
|
||||
run: cargo test
|
||||
|
||||
e2e-tests:
|
||||
runs-on: ubuntu-22.04
|
||||
needs: [unit-tests, cargo-tests]
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install system dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y \
|
||||
libwebkit2gtk-4.1-dev \
|
||||
libgtk-3-dev \
|
||||
libayatana-appindicator3-dev \
|
||||
librsvg2-dev \
|
||||
libssl-dev \
|
||||
build-essential \
|
||||
pkg-config \
|
||||
xvfb
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20
|
||||
cache: npm
|
||||
cache-dependency-path: v2/package-lock.json
|
||||
|
||||
- name: Setup Rust
|
||||
uses: dtolnay/rust-toolchain@stable
|
||||
|
||||
- name: Cache Rust dependencies
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: |
|
||||
~/.cargo/registry
|
||||
~/.cargo/git
|
||||
v2/target
|
||||
key: ${{ runner.os }}-cargo-e2e-${{ hashFiles('v2/Cargo.lock') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-cargo-e2e-
|
||||
|
||||
- name: Install tauri-driver
|
||||
run: cargo install tauri-driver
|
||||
|
||||
- name: Install npm dependencies
|
||||
working-directory: v2
|
||||
run: npm ci --legacy-peer-deps
|
||||
|
||||
- name: Build debug binary
|
||||
working-directory: v2
|
||||
run: npx tauri build --debug --no-bundle
|
||||
|
||||
- name: Run E2E tests (Phase A — deterministic)
|
||||
working-directory: v2
|
||||
env:
|
||||
BTERMINAL_TEST: '1'
|
||||
SKIP_BUILD: '1'
|
||||
run: |
|
||||
xvfb-run --auto-servernum --server-args="-screen 0 1920x1080x24" \
|
||||
npx wdio tests/e2e/wdio.conf.js \
|
||||
--spec tests/e2e/specs/bterminal.test.ts \
|
||||
--spec tests/e2e/specs/agent-scenarios.test.ts
|
||||
|
||||
- name: Run E2E tests (Phase B — multi-project)
|
||||
if: success()
|
||||
working-directory: v2
|
||||
env:
|
||||
BTERMINAL_TEST: '1'
|
||||
SKIP_BUILD: '1'
|
||||
run: |
|
||||
xvfb-run --auto-servernum --server-args="-screen 0 1920x1080x24" \
|
||||
npx wdio tests/e2e/wdio.conf.js \
|
||||
--spec tests/e2e/specs/phase-b.test.ts
|
||||
|
||||
# LLM-judged tests only run when API key is available (manual/dispatch)
|
||||
- name: Run E2E tests (Phase B — LLM-judged)
|
||||
if: success() && env.ANTHROPIC_API_KEY != ''
|
||||
working-directory: v2
|
||||
env:
|
||||
BTERMINAL_TEST: '1'
|
||||
SKIP_BUILD: '1'
|
||||
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
|
||||
run: |
|
||||
xvfb-run --auto-servernum --server-args="-screen 0 1920x1080x24" \
|
||||
npx wdio tests/e2e/wdio.conf.js \
|
||||
--spec tests/e2e/specs/phase-b.test.ts
|
||||
|
||||
- name: Upload test results
|
||||
if: always()
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: e2e-results
|
||||
path: v2/test-results/
|
||||
if-no-files-found: ignore
|
||||
143
.github/workflows/release.yml
vendored
Normal file
143
.github/workflows/release.yml
vendored
Normal file
|
|
@ -0,0 +1,143 @@
|
|||
name: Release
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- "v*"
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
env:
|
||||
CARGO_TERM_COLOR: always
|
||||
|
||||
jobs:
|
||||
build-linux:
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install system dependencies
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y \
|
||||
libwebkit2gtk-4.1-dev \
|
||||
libgtk-3-dev \
|
||||
libayatana-appindicator3-dev \
|
||||
librsvg2-dev \
|
||||
libssl-dev \
|
||||
build-essential \
|
||||
pkg-config \
|
||||
curl \
|
||||
wget \
|
||||
libfuse2
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 20
|
||||
cache: npm
|
||||
cache-dependency-path: v2/package-lock.json
|
||||
|
||||
- name: Setup Rust
|
||||
uses: dtolnay/rust-toolchain@stable
|
||||
|
||||
- name: Cache Rust dependencies
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: |
|
||||
~/.cargo/registry
|
||||
~/.cargo/git
|
||||
v2/src-tauri/target
|
||||
key: ${{ runner.os }}-cargo-${{ hashFiles('v2/src-tauri/Cargo.lock') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-cargo-
|
||||
|
||||
- name: Install npm dependencies
|
||||
working-directory: v2
|
||||
run: npm ci --legacy-peer-deps
|
||||
|
||||
- name: Build Tauri app
|
||||
working-directory: v2
|
||||
env:
|
||||
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
|
||||
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }}
|
||||
run: npx tauri build
|
||||
|
||||
- name: List build artifacts
|
||||
run: |
|
||||
find v2/src-tauri/target/release/bundle -type f \( -name "*.deb" -o -name "*.AppImage" -o -name "*.sig" \) | head -20
|
||||
|
||||
- name: Generate updater latest.json
|
||||
run: |
|
||||
VERSION="${GITHUB_REF_NAME#v}"
|
||||
DEB_NAME=$(basename v2/src-tauri/target/release/bundle/deb/*.deb)
|
||||
APPIMAGE_NAME=$(basename v2/src-tauri/target/release/bundle/appimage/*.AppImage)
|
||||
SIG=""
|
||||
if [ -f "v2/src-tauri/target/release/bundle/appimage/${APPIMAGE_NAME}.sig" ]; then
|
||||
SIG=$(cat "v2/src-tauri/target/release/bundle/appimage/${APPIMAGE_NAME}.sig")
|
||||
fi
|
||||
cat > latest.json << EOF
|
||||
{
|
||||
"version": "${VERSION}",
|
||||
"notes": "Release ${VERSION}",
|
||||
"pub_date": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
|
||||
"platforms": {
|
||||
"linux-x86_64": {
|
||||
"signature": "${SIG}",
|
||||
"url": "https://github.com/DexterFromLab/BTerminal/releases/download/${GITHUB_REF_NAME}/${APPIMAGE_NAME}"
|
||||
}
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
- name: Upload .deb
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: bterminal-deb
|
||||
path: v2/src-tauri/target/release/bundle/deb/*.deb
|
||||
|
||||
- name: Upload AppImage
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: bterminal-appimage
|
||||
path: v2/src-tauri/target/release/bundle/appimage/*.AppImage
|
||||
|
||||
- name: Upload latest.json
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: updater-json
|
||||
path: latest.json
|
||||
|
||||
release:
|
||||
needs: build-linux
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Download .deb
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: bterminal-deb
|
||||
path: artifacts/
|
||||
|
||||
- name: Download AppImage
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: bterminal-appimage
|
||||
path: artifacts/
|
||||
|
||||
- name: Download latest.json
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: updater-json
|
||||
path: artifacts/
|
||||
|
||||
- name: Create GitHub Release
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
generate_release_notes: true
|
||||
files: |
|
||||
artifacts/*.deb
|
||||
artifacts/*.AppImage
|
||||
artifacts/latest.json
|
||||
Loading…
Add table
Add a link
Reference in a new issue