Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 21 additions & 8 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,19 +47,30 @@ jobs:
smoke:
name: Installer Smoke Test
runs-on: ubuntu-latest
permissions:
contents: read
packages: read
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Log in to GHCR
uses: docker/login-action@v3
- name: Setup Node
uses: actions/setup-node@v4
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
node-version: "22"

- name: Resolve tool versions
id: versions
env:
GH_TOKEN: ${{ github.token }}
run: bash ./scripts/resolve-tool-versions.sh

- name: Build local smoke image
run: |
docker build -t deva-smoke:ci \
--build-arg CLAUDE_CODE_VERSION="${{ steps.versions.outputs.claude_code_version }}" \
--build-arg CODEX_VERSION="${{ steps.versions.outputs.codex_version }}" \
--build-arg GEMINI_CLI_VERSION="${{ steps.versions.outputs.gemini_cli_version }}" \
--build-arg ATLAS_CLI_VERSION="${{ steps.versions.outputs.atlas_cli_version }}" \
--build-arg COPILOT_API_VERSION="${{ steps.versions.outputs.copilot_api_version }}" \
.

- name: Install and launch each agent without a TTY
shell: bash
Expand All @@ -68,6 +79,8 @@ jobs:
export HOME="$(mktemp -d)"
export PATH="$HOME/.local/bin:$PATH"
export DEVA_INSTALL_BASE_URL="file://$PWD"
export DEVA_DOCKER_IMAGE="deva-smoke:ci"
Copy link

Copilot AI Mar 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DEVA_DOCKER_IMAGE in deva.sh is a repo name and deva.sh appends :${DEVA_DOCKER_TAG}. Setting DEVA_DOCKER_IMAGE="deva-smoke:ci" here will make deva.sh try to run deva-smoke:ci:latest (invalid image reference) and break the smoke test. Set DEVA_DOCKER_IMAGE to deva-smoke and DEVA_DOCKER_TAG to ci (or adjust deva.sh/installer semantics to accept a fully-qualified image reference).

Suggested change
export DEVA_DOCKER_IMAGE="deva-smoke:ci"
export DEVA_DOCKER_IMAGE="deva-smoke"
export DEVA_DOCKER_TAG="ci"

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Split smoke image repo and tag env vars

This step sets DEVA_DOCKER_IMAGE=deva-smoke:ci, but deva.sh later always composes image references as ${DEVA_DOCKER_IMAGE}:${DEVA_DOCKER_TAG} (for both check_image and docker run), so the smoke commands resolve to an invalid/different reference like deva-smoke:ci:latest instead of the locally built deva-smoke:ci. In the CI smoke context, that makes deva.sh ... --version fail before the intended non-TTY launch check; set repo/tag separately (DEVA_DOCKER_IMAGE=deva-smoke, DEVA_DOCKER_TAG=ci) or build/tag :latest.

Useful? React with 👍 / 👎.

export DEVA_DOCKER_IMAGE_FALLBACK=""
export DEVA_NO_DOCKER=1

bash ./install.sh
Expand Down
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Config-home fan-out skips loose credential files, backup files, VCS junk, and `.DS_Store`
- Auth-specific persistent containers now include the agent in the name suffix, avoiding cross-agent reuse with the wrong env or mounts
- `install.sh` now installs the full current agent set, including Gemini and `shared_auth.sh`
- `install.sh` now reuses a prebuilt local image instead of blindly pulling, so CI smoke no longer depends on registry auth
- release and nightly container workflows now resolve tool versions through the same script, and release no longer invents a local commit inside Actions

### Changed
Expand Down
27 changes: 17 additions & 10 deletions install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ set -euo pipefail
DEVA_LAUNCHER="deva.sh"
LEGACY_WRAPPER="claude.sh"
YOLO_WRAPPER="claude-yolo"
DOCKER_IMAGE="ghcr.io/thevibeworks/deva:latest"
DOCKER_IMAGE_FALLBACK="thevibeworks/deva:latest"
DOCKER_IMAGE="${DEVA_DOCKER_IMAGE:-ghcr.io/thevibeworks/deva:latest}"
DOCKER_IMAGE_FALLBACK="${DEVA_DOCKER_IMAGE_FALLBACK:-thevibeworks/deva:latest}"
Copy link

Copilot AI Mar 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DOCKER_IMAGE_FALLBACK uses ${DEVA_DOCKER_IMAGE_FALLBACK:-...}, which treats an explicitly empty DEVA_DOCKER_IMAGE_FALLBACK as “unset” and re-enables the default fallback. That makes it impossible to disable the fallback pull (e.g., CI exports DEVA_DOCKER_IMAGE_FALLBACK="" but the script still falls back). Use the non-: form to honor empty string, or add explicit logic to interpret empty as “no fallback”.

Suggested change
DOCKER_IMAGE_FALLBACK="${DEVA_DOCKER_IMAGE_FALLBACK:-thevibeworks/deva:latest}"
DOCKER_IMAGE_FALLBACK="${DEVA_DOCKER_IMAGE_FALLBACK-thevibeworks/deva:latest}"

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve empty fallback override in installer

Using ${DEVA_DOCKER_IMAGE_FALLBACK:-thevibeworks/deva:latest} treats an explicitly empty value as unset, so DEVA_DOCKER_IMAGE_FALLBACK="" cannot actually disable fallback pulls even though the later branch checks for an empty string. In environments where the primary pull fails, this silently reintroduces a Docker Hub dependency and can break offline/private-registry install flows that this change is trying to decouple.

Useful? React with 👍 / 👎.

INSTALL_BASE_URL="${DEVA_INSTALL_BASE_URL:-https://raw.githubusercontent.com/thevibeworks/deva/main}"

agent_files=(
Expand Down Expand Up @@ -55,14 +55,21 @@ for file in "${agent_files[@]}"; do
done

echo ""
echo "Pulling Docker image..."
if ! docker pull "$DOCKER_IMAGE"; then
echo "GHCR pull failed. Trying Docker Hub..."
docker pull "$DOCKER_IMAGE_FALLBACK"
echo ""
echo "warning: using Docker Hub fallback image"
echo "set this if you want Docker Hub by default:"
echo " export DEVA_DOCKER_IMAGE=thevibeworks/deva"
if docker image inspect "$DOCKER_IMAGE" >/dev/null 2>&1; then
echo "Using local Docker image: $DOCKER_IMAGE"
else
echo "Pulling Docker image..."
if ! docker pull "$DOCKER_IMAGE"; then
if [ -n "$DOCKER_IMAGE_FALLBACK" ] && [ "$DOCKER_IMAGE_FALLBACK" != "$DOCKER_IMAGE" ]; then
echo "Primary pull failed. Trying fallback image..."
docker pull "$DOCKER_IMAGE_FALLBACK"
echo ""
echo "warning: using fallback image $DOCKER_IMAGE_FALLBACK"
Copy link

Copilot AI Mar 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

After successfully pulling the fallback image, the installer only prints a warning but doesn’t give an actionable way to run deva.sh with that fallback. Since deva.sh defaults to ghcr.io/thevibeworks/deva:latest, installs in environments without GHCR access will still fail at first launch unless the user sets the image env vars. Consider printing the exact export DEVA_DOCKER_IMAGE=.../DEVA_DOCKER_TAG=... guidance (or switching the effective image for the remainder of the session).

Suggested change
echo "warning: using fallback image $DOCKER_IMAGE_FALLBACK"
echo "warning: using fallback image $DOCKER_IMAGE_FALLBACK"
echo "note: deva.sh defaults to $DOCKER_IMAGE and may fail without access to that registry."
echo " To use the fallback image in this shell, run:"
echo " export DEVA_DOCKER_IMAGE=\"$DOCKER_IMAGE_FALLBACK\""
echo " You can add that line to your shell profile to make the change permanent."

Copilot uses AI. Check for mistakes.
else
echo "error: failed to pull Docker image $DOCKER_IMAGE" >&2
exit 1
fi
fi
fi

echo ""
Expand Down
Loading