22IMAGE_NAME := ghcr.io/thevibeworks/deva
33TAG := latest
44RUST_TAG := rust
5+ CORE_TAG := core
56DOCKERFILE := Dockerfile
67RUST_DOCKERFILE := Dockerfile.rust
78MAIN_IMAGE := $(IMAGE_NAME ) :$(TAG )
89RUST_IMAGE := $(IMAGE_NAME ) :$(RUST_TAG )
10+ CORE_IMAGE := $(IMAGE_NAME ) :$(CORE_TAG )
911CONTAINER_NAME := deva-$(shell basename $(PWD ) ) -$(shell date +% s)
1012
1113# Smart image detection: auto-detect available image for version checking
@@ -18,11 +20,11 @@ DETECTED_IMAGE := $(shell \
1820 else \
1921 echo "$(IMAGE_NAME ) :$(TAG ) "; \
2022 fi)
21- CLAUDE_CODE_VERSION := $(shell npm view @anthropic-ai/claude-code version 2>/dev/null || echo "2.0.1 ")
22- CODEX_VERSION := $(shell npm view @openai/codex version 2>/dev/null || echo "0.42 .0")
23- GEMINI_CLI_VERSION := $(shell npm view @google/gemini-cli version 2>/dev/null || echo "latest ")
24- ATLAS_CLI_VERSION := $(shell gh api repos/lroolle/atlas-cli/releases/latest --jq '.tag_name' 2>/dev/null || echo "v0.1.1 ")
25- COPILOT_API_VERSION := $(shell gh api repos/ericc-ch/copilot-api/branches/master --jq '.commit.sha' 2>/dev/null || echo "83cdfde17d7d3be36bd2493cc7592ff13be4928d ")
23+ CLAUDE_CODE_VERSION := $(shell npm view @anthropic-ai/claude-code version 2>/dev/null || echo "2.1.81 ")
24+ CODEX_VERSION := $(shell npm view @openai/codex version 2>/dev/null || echo "0.116 .0")
25+ GEMINI_CLI_VERSION := $(shell npm view @google/gemini-cli version 2>/dev/null || echo "0.35.0 ")
26+ ATLAS_CLI_VERSION := $(shell gh api repos/lroolle/atlas-cli/releases/latest --jq '.tag_name' 2>/dev/null || echo "v0.1.4 ")
27+ COPILOT_API_VERSION := $(shell gh api repos/ericc-ch/copilot-api/branches/master --jq '.commit.sha' 2>/dev/null || echo "0ea08febdd7e3e055b03dd298bf57e669500b5c1 ")
2628
2729export DOCKER_BUILDKIT := 1
2830
@@ -79,17 +81,33 @@ rebuild:
7981 @echo " ✅ Rebuild completed: $( MAIN_IMAGE) "
8082
8183
82- .PHONY : build-rust
83- build-rust :
84+ .PHONY : build-core
85+ build-core :
86+ @echo " 🔨 Building stable core image..."
87+ docker build -f $(DOCKERFILE ) --target agent-base --build-arg COPILOT_API_VERSION=$(COPILOT_API_VERSION ) -t $(CORE_IMAGE ) .
88+ @echo " ✅ Core build completed: $( CORE_IMAGE) "
89+
90+ .PHONY : build-rust-image
91+ build-rust-image :
8492 @echo " 🔨 Building Rust Docker image..."
85- docker build -f $(RUST_DOCKERFILE ) --build-arg BASE_IMAGE=$(MAIN_IMAGE ) -t $(RUST_IMAGE ) .
93+ docker build -f $(RUST_DOCKERFILE ) \
94+ --build-arg BASE_IMAGE=$(CORE_IMAGE ) \
95+ --build-arg CLAUDE_CODE_VERSION=$(CLAUDE_CODE_VERSION ) \
96+ --build-arg CODEX_VERSION=$(CODEX_VERSION ) \
97+ --build-arg GEMINI_CLI_VERSION=$(GEMINI_CLI_VERSION ) \
98+ --build-arg ATLAS_CLI_VERSION=$(ATLAS_CLI_VERSION ) \
99+ -t $(RUST_IMAGE ) .
86100 @echo " ✅ Rust build completed: $( RUST_IMAGE) "
87101
102+ .PHONY : build-rust
103+ build-rust : build-core build-rust-image
104+
88105.PHONY : build-all
89106build-all :
90107 @echo " 🔨 Building all images with versions: Claude $( CLAUDE_CODE_VERSION) , Codex $( CODEX_VERSION) , Gemini $( GEMINI_CLI_VERSION) , Atlas $( ATLAS_CLI_VERSION) , Copilot-API $( COPILOT_API_VERSION) ..."
108+ @$(MAKE ) build-core COPILOT_API_VERSION=$(COPILOT_API_VERSION )
91109 @$(MAKE ) build-main CLAUDE_CODE_VERSION=$(CLAUDE_CODE_VERSION ) CODEX_VERSION=$(CODEX_VERSION ) GEMINI_CLI_VERSION=$(GEMINI_CLI_VERSION ) ATLAS_CLI_VERSION=$(ATLAS_CLI_VERSION ) COPILOT_API_VERSION=$(COPILOT_API_VERSION )
92- @$(MAKE ) build-rust BASE_IMAGE =$(MAIN_IMAGE )
110+ @$(MAKE ) build-rust-image CLAUDE_CODE_VERSION =$(CLAUDE_CODE_VERSION ) CODEX_VERSION= $( CODEX_VERSION ) GEMINI_CLI_VERSION= $( GEMINI_CLI_VERSION ) ATLAS_CLI_VERSION= $( ATLAS_CLI_VERSION ) COPILOT_API_VERSION= $( COPILOT_API_VERSION )
93111 @echo " ✅ All images built successfully"
94112
95113.PHONY : buildx
@@ -160,6 +178,7 @@ clean:
160178 @echo " Removing project images..."
161179 -docker rmi $(MAIN_IMAGE ) 2> /dev/null || true
162180 -docker rmi $(RUST_IMAGE ) 2> /dev/null || true
181+ -docker rmi $(CORE_IMAGE ) 2> /dev/null || true
163182 @echo " Pruning stopped containers..."
164183 -docker container prune -f
165184 @echo " Pruning unused images..."
@@ -179,6 +198,7 @@ clean-all:
179198 @echo " Removing project images..."
180199 -docker rmi $(MAIN_IMAGE ) 2> /dev/null || true
181200 -docker rmi $(RUST_IMAGE ) 2> /dev/null || true
201+ -docker rmi $(CORE_IMAGE ) 2> /dev/null || true
182202 @echo " Removing ALL stopped containers..."
183203 -docker container prune -af
184204 @echo " Removing ALL dangling and unused images..."
@@ -297,6 +317,7 @@ help:
297317 @echo " "
298318 @echo " Available targets:"
299319 @echo " build Build all images (auto-detects latest npm versions)"
320+ @echo " build-core Build stable core image only"
300321 @echo " build-main Build main Docker image only"
301322 @echo " build-rust Build Rust Docker image"
302323 @echo " build-all Build all images (main + rust)"
@@ -320,6 +341,7 @@ help:
320341 @echo " IMAGE_NAME Main image name (default: $( IMAGE_NAME) )"
321342 @echo " TAG Docker image tag (default: $( TAG) )"
322343 @echo " RUST_TAG Rust image tag (default: $( RUST_TAG) )"
344+ @echo " CORE_TAG Stable core image tag (default: $( CORE_TAG) )"
323345 @echo " DOCKERFILE Dockerfile to use (default: $( DOCKERFILE) )"
324346 @echo " RUST_DOCKERFILE Rust Dockerfile path (default: $( RUST_DOCKERFILE) )"
325347 @echo " CLAUDE_CODE_VERSION Claude CLI version (default: $( CLAUDE_CODE_VERSION) )"
@@ -329,6 +351,7 @@ help:
329351 @echo " "
330352 @echo " Examples:"
331353 @echo " make build # Build all images with latest versions"
354+ @echo " make build-core # Build stable core image only"
332355 @echo " make build-main # Build main image only"
333356 @echo " make build-rust # Build Rust image only"
334357 @echo " make TAG=dev build # Build all with custom tag"
0 commit comments