Merge pull request #324 from thevibeworks/release/v0.11.0 #116
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: CI | |
| on: | |
| pull_request: | |
| branches: [ main ] | |
| push: | |
| branches: [ main ] | |
| jobs: | |
| shellcheck: | |
| name: Shell Linting | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Run ShellCheck | |
| uses: ludeeus/action-shellcheck@master | |
| with: | |
| scandir: "." | |
| format: gcc | |
| severity: error | |
| ignore_paths: ".github" | |
| test: | |
| name: Basic Tests | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Test help output | |
| run: | | |
| ./deva.sh --help | |
| ./claude-yolo --help | |
| - name: Test version output | |
| run: | | |
| ./deva.sh --version | |
| ./claude-yolo --version | |
| - name: Check version consistency | |
| run: | | |
| chmod +x scripts/version-check.sh | |
| ./scripts/version-check.sh | |
| - name: Unit tests (release-utils.sh) | |
| run: bash tests/test_release_utils.sh | |
| - name: Unit tests (version-upgrade.sh) | |
| run: bash tests/version-upgrade.sh | |
| smoke: | |
| name: Installer Smoke Test | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Load pinned versions | |
| id: pins | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| source ./scripts/version-pins.sh | |
| load_version_pins | |
| emit_github_outputs "$GITHUB_OUTPUT" | |
| - name: Build local smoke image | |
| run: | | |
| docker build -t deva-smoke:ci \ | |
| --build-arg NODE_MAJOR="${{ steps.pins.outputs.node_major }}" \ | |
| --build-arg GO_VERSION="${{ steps.pins.outputs.go_version }}" \ | |
| --build-arg PYTHON_VERSION="${{ steps.pins.outputs.python_version }}" \ | |
| --build-arg DELTA_VERSION="${{ steps.pins.outputs.delta_version }}" \ | |
| --build-arg TMUX_VERSION="${{ steps.pins.outputs.tmux_version }}" \ | |
| --build-arg TMUX_SHA256="${{ steps.pins.outputs.tmux_sha256 }}" \ | |
| --build-arg CLAUDE_CODE_VERSION="${{ steps.pins.outputs.claude_code_version }}" \ | |
| --build-arg CLAUDE_TRACE_VERSION="${{ steps.pins.outputs.claude_trace_version }}" \ | |
| --build-arg CODEX_VERSION="${{ steps.pins.outputs.codex_version }}" \ | |
| --build-arg GEMINI_CLI_VERSION="${{ steps.pins.outputs.gemini_cli_version }}" \ | |
| --build-arg ATLAS_CLI_VERSION="${{ steps.pins.outputs.atlas_cli_version }}" \ | |
| --build-arg COPILOT_API_VERSION="${{ steps.pins.outputs.copilot_api_version }}" \ | |
| . | |
| - name: Build core and rust images via Makefile | |
| run: | | |
| make build-core build-rust-image \ | |
| IMAGE_NAME=deva-smoke \ | |
| TAG=ci \ | |
| CORE_TAG=ci-core \ | |
| RUST_TAG=ci-rust \ | |
| NODE_MAJOR="${{ steps.pins.outputs.node_major }}" \ | |
| GO_VERSION="${{ steps.pins.outputs.go_version }}" \ | |
| PYTHON_VERSION="${{ steps.pins.outputs.python_version }}" \ | |
| DELTA_VERSION="${{ steps.pins.outputs.delta_version }}" \ | |
| TMUX_VERSION="${{ steps.pins.outputs.tmux_version }}" \ | |
| TMUX_SHA256="${{ steps.pins.outputs.tmux_sha256 }}" \ | |
| CLAUDE_CODE_VERSION="${{ steps.pins.outputs.claude_code_version }}" \ | |
| CLAUDE_TRACE_VERSION="${{ steps.pins.outputs.claude_trace_version }}" \ | |
| CODEX_VERSION="${{ steps.pins.outputs.codex_version }}" \ | |
| GEMINI_CLI_VERSION="${{ steps.pins.outputs.gemini_cli_version }}" \ | |
| ATLAS_CLI_VERSION="${{ steps.pins.outputs.atlas_cli_version }}" \ | |
| COPILOT_API_VERSION="${{ steps.pins.outputs.copilot_api_version }}" \ | |
| PLAYWRIGHT_VERSION="${{ steps.pins.outputs.playwright_version }}" \ | |
| RUST_TOOLCHAINS="${{ steps.pins.outputs.rust_toolchains }}" \ | |
| RUST_DEFAULT_TOOLCHAIN="${{ steps.pins.outputs.rust_default_toolchain }}" \ | |
| RUST_TARGETS="${{ steps.pins.outputs.rust_targets }}" | |
| - name: Install and launch each agent without a TTY | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| export HOME="$(mktemp -d)" | |
| export PATH="$HOME/.local/bin:$PATH" | |
| export DEVA_INSTALL_BASE_URL="file://$PWD" | |
| export DEVA_DOCKER_IMAGE="deva-smoke" | |
| export DEVA_DOCKER_TAG="ci" | |
| export DEVA_DOCKER_IMAGE_FALLBACK="" | |
| export DEVA_NO_DOCKER=1 | |
| bash ./install.sh | |
| deva.sh claude -Q -- --version | |
| deva.sh codex -Q -- --version | |
| deva.sh gemini -Q -- --version | |
| - name: Smoke Claude --chrome mount assembly | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| tmp_root="$(mktemp -d)" | |
| bridge_dir="$tmp_root/claude-mcp-browser-bridge-$(id -un)" | |
| profile_dir="$tmp_root/chrome/Default" | |
| mkdir -p "$bridge_dir" | |
| chmod 700 "$bridge_dir" | |
| mkdir -p "$profile_dir/Extensions/fcoeoabgfenejglbffodgkkbkcdhcgfn/1.0.0" | |
| dry_run="$( | |
| DEVA_DOCKER_IMAGE=deva-smoke \ | |
| DEVA_DOCKER_TAG=ci \ | |
| DEVA_CHROME_PROFILE_PATH="$profile_dir" \ | |
| DEVA_HOST_CHROME_BRIDGE_DIR="$bridge_dir" \ | |
| ./deva.sh claude --debug --dry-run -- --chrome 2>&1 | |
| )" | |
| printf '%s\n' "$dry_run" | |
| grep -F -- "$bridge_dir:/deva-host-chrome-bridge" <<<"$dry_run" | |
| grep -F -- "$profile_dir/Extensions:/home/deva/.config/google-chrome/Default/Extensions:ro" <<<"$dry_run" | |
| - name: Smoke bind mount shape guard | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| DEVA_DOCKER_IMAGE=deva-smoke \ | |
| DEVA_DOCKER_TAG=ci \ | |
| ./scripts/test-mount-shape.sh | |
| - name: Smoke agent tooling installer | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| ./scripts/test-install-agent-tooling.sh | |
| - name: Smoke version targets | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| ./scripts/test-version-targets.sh | |
| - name: Smoke Chrome bridge entrypoint symlink | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| tmp_root="$(mktemp -d)" | |
| bridge_dir="$tmp_root/claude-mcp-browser-bridge-$(id -un)" | |
| mkdir -p "$bridge_dir" | |
| chmod 700 "$bridge_dir" | |
| docker run --rm \ | |
| -e DEVA_AGENT=claude \ | |
| -e DEVA_UID="$(id -u)" \ | |
| -e DEVA_GID="$(id -g)" \ | |
| -e DEVA_CHROME_HOST_BRIDGE=1 \ | |
| -e DEVA_CHROME_HOST_BRIDGE_DIR=/deva-host-chrome-bridge \ | |
| -v "$bridge_dir:/deva-host-chrome-bridge" \ | |
| deva-smoke:ci \ | |
| bash -lc 'link="/tmp/claude-mcp-browser-bridge-$(id -un)"; test -L "$link"; test "$(readlink "$link")" = "/deva-host-chrome-bridge"' | |
| - name: Smoke tmux-bridge CLI surface | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| # tmux-bridge is the layer-2 agent comms CLI vendored from smux. | |
| # We assert it's installed, executable, runs outside a tmux pane for | |
| # the version/help/id error paths, and that tmux itself is present | |
| # so a future operator can drive tmux-bridge against host tmux. | |
| docker run --rm deva-smoke:ci bash -lc ' | |
| set -euo pipefail | |
| command -v tmux-bridge | |
| command -v tmux | |
| tmux-bridge version | |
| tmux-bridge --help | grep -q "cross-pane communication" | |
| # id requires $TMUX_PANE; outside tmux it must error cleanly. | |
| if tmux-bridge id 2>/dev/null; then | |
| echo "tmux-bridge id should fail outside a tmux pane" >&2 | |
| exit 1 | |
| fi | |
| # Ephemeral tmux server to prove list/name/read/type work end-to-end. | |
| sock="/tmp/tmux-smoke.sock" | |
| tmux -S "$sock" new-session -d -s smoke "sleep 30" | |
| export TMUX_BRIDGE_SOCKET="$sock" | |
| tmux-bridge list | tee /tmp/list.out | |
| grep -q "smoke:0" /tmp/list.out | |
| target="$(tmux -S "$sock" display-message -p "#{pane_id}")" | |
| tmux-bridge name "$target" smoke-worker | |
| tmux-bridge resolve smoke-worker | |
| tmux-bridge read "$target" 5 >/dev/null | |
| # read-guard: must read before type; second type without read must fail | |
| tmux-bridge type smoke-worker "echo hi" | |
| if tmux-bridge type smoke-worker "echo twice" 2>/dev/null; then | |
| echo "read-guard should have blocked second type without read" >&2 | |
| exit 1 | |
| fi | |
| tmux -S "$sock" kill-server | |
| ' | |
| docs: | |
| name: Docs Build | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Set up Python | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: "3.x" | |
| - name: Install MkDocs | |
| run: | | |
| python -m pip install --upgrade pip | |
| python -m pip install -r docs-requirements.txt | |
| - name: Build docs | |
| run: mkdocs build --strict |