Skip to content

Commit dc9d3a6

Browse files
authored
Merge pull request #158 from thevibeworks/release/v0.9.0
chore: release v0.9.1
2 parents 52fa110 + e4cadb8 commit dc9d3a6

10 files changed

Lines changed: 1150 additions & 33 deletions

File tree

.deva.example

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
# deva Configuration File Example
2+
#
3+
# This file demonstrates the .deva config file format.
4+
# Config files are loaded in this order:
5+
# 1. $XDG_CONFIG_HOME/deva/.deva (usually ~/.config/deva/.deva)
6+
# 2. $HOME/.deva
7+
# 3. ./.deva (project-specific)
8+
# 4. ./.deva.local (gitignored overrides)
9+
#
10+
# Lines starting with # are comments.
11+
# Blank lines are ignored.
12+
13+
# VOLUME Directives
14+
# Mount host directories into container
15+
# Format: VOLUME=<host-path>:<container-path>:<mode>
16+
# Modes: ro (read-only), rw (read-write)
17+
VOLUME=$HOME/.ssh:/home/deva/.ssh:ro
18+
VOLUME=$HOME/projects/shared:/home/deva/shared:ro
19+
20+
# ENV Directives
21+
# Set environment variables in container
22+
# Format: ENV=<VAR_NAME>=<value>
23+
ENV=EDITOR=vim
24+
ENV=LANG=en_US.UTF-8
25+
26+
# Variable Assignments
27+
# Set deva.sh behavior variables
28+
# These control wrapper behavior, not container environment
29+
AUTH_METHOD=claude
30+
PROFILE=rust
31+
EPHEMERAL=false
32+
33+
# Common Use Cases:
34+
#
35+
# 1. Mount read-only SSH keys:
36+
# VOLUME=$HOME/.ssh:/home/deva/.ssh:ro
37+
#
38+
# 2. Mount project dependencies:
39+
# VOLUME=$HOME/shared-libs:/home/deva/libs:ro
40+
#
41+
# 3. Set default editor:
42+
# ENV=EDITOR=nvim
43+
#
44+
# 4. Enable Docker-in-Docker:
45+
# ENV=DOCKER_IN_DOCKER=true
46+
#
47+
# 5. Set default profile:
48+
# PROFILE=rust
49+
#
50+
# 6. Disable ephemeral containers (persistent):
51+
# EPHEMERAL=false
52+
53+
# Project-Specific Config (.deva in project root):
54+
#
55+
# VOLUME=./vendor:/home/deva/project/vendor:ro
56+
# ENV=DATABASE_URL=postgres://localhost/dev
57+
# PROFILE=rust
58+
59+
# Personal Overrides (.deva.local - add to .gitignore):
60+
#
61+
# VOLUME=$HOME/personal-keys:/home/deva/keys:ro
62+
# ENV=API_KEY=secret-key-here

.github/workflows/ci.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@ jobs:
3131

3232
- name: Test help output
3333
run: |
34-
./claude.sh --help
34+
./deva.sh --help
3535
./claude-yolo --help
3636
3737
- name: Test version output
3838
run: |
39-
./claude.sh --version
39+
./deva.sh --version
4040
./claude-yolo --version
4141
4242
- name: Check version consistency

.github/workflows/release.yml

Lines changed: 60 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ on:
1313

1414
env:
1515
REGISTRY: ghcr.io
16-
IMAGE_NAME: thevibeworks/ccyolo
16+
IMAGE_NAME: thevibeworks/deva
1717

1818
jobs:
1919
build-and-push:
@@ -48,21 +48,69 @@ jobs:
4848
type=ref,event=tag
4949
type=raw,value=latest,enable={{is_default_branch}}
5050
51-
- name: Build and push Docker image
51+
- name: Build and push base image
5252
uses: docker/build-push-action@v5
5353
with:
5454
context: .
55+
file: ./Dockerfile
5556
platforms: linux/amd64,linux/arm64
5657
push: true
5758
tags: ${{ steps.meta.outputs.tags }}
5859
labels: ${{ steps.meta.outputs.labels }}
5960
cache-from: type=gha
6061
cache-to: type=gha,mode=max
6162

63+
build-and-push-rust:
64+
name: Build and Push Rust Profile Image
65+
runs-on: ubuntu-latest
66+
needs: build-and-push
67+
permissions:
68+
contents: read
69+
packages: write
70+
steps:
71+
- name: Checkout
72+
uses: actions/checkout@v4
73+
74+
- name: Set up QEMU
75+
uses: docker/setup-qemu-action@v3
76+
77+
- name: Set up Docker Buildx
78+
uses: docker/setup-buildx-action@v3
79+
80+
- name: Log in to Container Registry
81+
uses: docker/login-action@v3
82+
with:
83+
registry: ${{ env.REGISTRY }}
84+
username: ${{ github.actor }}
85+
password: ${{ secrets.GITHUB_TOKEN }}
86+
87+
- name: Extract metadata for rust profile
88+
id: meta-rust
89+
uses: docker/metadata-action@v5
90+
with:
91+
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
92+
tags: |
93+
type=ref,event=tag,suffix=-rust
94+
type=raw,value=rust,enable={{is_default_branch}}
95+
96+
- name: Build and push rust image
97+
uses: docker/build-push-action@v5
98+
with:
99+
context: .
100+
file: ./Dockerfile.rust
101+
platforms: linux/amd64,linux/arm64
102+
push: true
103+
tags: ${{ steps.meta-rust.outputs.tags }}
104+
labels: ${{ steps.meta-rust.outputs.labels }}
105+
cache-from: type=gha
106+
cache-to: type=gha,mode=max
107+
build-args: |
108+
BASE_IMAGE=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.ref_name }}
109+
62110
release:
63111
name: Create GitHub Release
64112
runs-on: ubuntu-latest
65-
needs: build-and-push
113+
needs: [build-and-push, build-and-push-rust]
66114
permissions:
67115
contents: write
68116
steps:
@@ -80,15 +128,15 @@ jobs:
80128
echo "version=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
81129
fi
82130
83-
- name: Update version in claude.sh
131+
- name: Update version in deva.sh
84132
run: |
85133
VERSION="${{ steps.version.outputs.version }}"
86134
# Remove 'v' prefix if present
87135
VERSION=${VERSION#v}
88-
sed -i "s/^VERSION=.*/VERSION=\"$VERSION\"/" claude.sh
136+
sed -i "s/^VERSION=.*/VERSION=\"$VERSION\"/" deva.sh
89137
git config --local user.email "action@github.com"
90138
git config --local user.name "GitHub Action"
91-
git add claude.sh
139+
git add deva.sh
92140
git commit -m "Update version to $VERSION" || echo "No changes to commit"
93141
94142
- name: Generate release notes
@@ -105,15 +153,20 @@ jobs:
105153
else
106154
echo "## Initial Release" > release_notes.md
107155
echo "" >> release_notes.md
108-
echo "First release of Claude Code YOLO - Docker wrapper for Claude CLI with safe YOLO mode." >> release_notes.md
156+
echo "First release of deva - Multi-agent development environment for Claude Code, Codex, and other AI coding assistants." >> release_notes.md
109157
fi
110158
111159
echo "" >> release_notes.md
112160
echo "## Docker Images" >> release_notes.md
113161
echo "" >> release_notes.md
162+
echo "**Base Profile (Python, Node, Go):**" >> release_notes.md
114163
echo "- \`ghcr.io/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.version }}\`" >> release_notes.md
115164
echo "- \`ghcr.io/${{ env.IMAGE_NAME }}:latest\`" >> release_notes.md
116165
echo "" >> release_notes.md
166+
echo "**Rust Profile (includes Rust toolchain):**" >> release_notes.md
167+
echo "- \`ghcr.io/${{ env.IMAGE_NAME }}:${{ steps.version.outputs.version }}-rust\`" >> release_notes.md
168+
echo "- \`ghcr.io/${{ env.IMAGE_NAME }}:rust\`" >> release_notes.md
169+
echo "" >> release_notes.md
117170
echo "## Supported Architectures" >> release_notes.md
118171
echo "" >> release_notes.md
119172
echo "- linux/amd64" >> release_notes.md

CHANGELOG.md

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,34 @@ All notable changes to Claude Code YOLO will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8-
## [Unreleased]
8+
## [0.9.1] - 2026-01-09
9+
10+
### Fixed
11+
- **CRITICAL**: docker-entrypoint.sh UID/GID remapping broken since commit 5807889 (2025-12-29)
12+
- Fixed selective `find -maxdepth 1 -user root` approach that skipped `.npm-global`, `.local`, etc.
13+
- Implemented explicit whitelist approach for container-managed directories
14+
- Prevents "env: 'claude': Permission denied" errors on container startup
15+
- See docs/UID-GID-HANDLING-RESEARCH.md for industry patterns analysis
16+
- GitHub workflows updated for deva rebrand
17+
- release.yml: Fixed IMAGE_NAME from `ccyolo` to `deva`
18+
- release.yml: Updated to modify `deva.sh` instead of `claude.sh`
19+
- release.yml: Added rust profile build and push
20+
- ci.yml: Updated tests to use `deva.sh` instead of `claude.sh`
21+
- scripts/version-check.sh: Updated to check `deva.sh` version
22+
- install.sh: Updated branding to "deva Multi-Agent Environment"
23+
24+
### Added
25+
- Comprehensive UID/GID handling research document (docs/UID-GID-HANDLING-RESEARCH.md)
26+
- Industry patterns from VS Code DevContainers, Jupyter, fixuid, and production best practices
27+
- Comparison matrix of 6 different UID/GID handling approaches
28+
- Validation that runtime UID fixing is legitimate for dev containers
29+
- Developer log documenting the UID/GID fix investigation (docs/devlog/20260108-docker-uid-permission-fix.org)
30+
- docker-entrypoint.sh: Improved execution order (setup_nonroot_user before ensure_agent_binaries)
31+
- `.deva.example` - Reference config file demonstrating all supported directives (VOLUME, ENV, PROFILE, etc.)
32+
33+
### Changed
34+
- GitHub release workflow now builds both base and rust profile images
35+
- Release notes now document both image profiles (base and rust)
936

1037
## [0.9.0] - 2026-01-08
1138

deva.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ if [ -n "${DEVA_DOCKER_TAG+x}" ]; then
1313
DEVA_DOCKER_TAG_ENV_SET=true
1414
fi
1515

16-
VERSION="0.9.0"
16+
VERSION="0.9.1"
1717
DEVA_DOCKER_IMAGE="${DEVA_DOCKER_IMAGE:-ghcr.io/thevibeworks/deva}"
1818
DEVA_DOCKER_TAG="${DEVA_DOCKER_TAG:-latest}"
1919
DEVA_CONTAINER_PREFIX="${DEVA_CONTAINER_PREFIX:-deva}"

docker-entrypoint.sh

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -218,8 +218,17 @@ setup_nonroot_user() {
218218
DEVA_UID="$actual_uid"
219219
fi
220220
fi
221-
# Only chown files owned by container, skip mounted volumes
222-
find "$DEVA_HOME" -maxdepth 1 ! -type l -user root -exec chown "$DEVA_UID:$DEVA_GID" {} \; 2>/dev/null || true
221+
# Fix container-managed directories (whitelist approach - safe for mounted volumes)
222+
# These directories are created at image build time and must be chowned to match host UID
223+
for dir in .npm-global .local .oh-my-zsh .skills .config .cache go; do
224+
if [ -d "$DEVA_HOME/$dir" ] && [ ! -L "$DEVA_HOME/$dir" ]; then
225+
chown -R "$DEVA_UID:$DEVA_GID" "$DEVA_HOME/$dir" 2>/dev/null || true
226+
fi
227+
done
228+
# Fix container-created dotfiles
229+
find "$DEVA_HOME" -maxdepth 1 \( -type f -o -type d \) -name '.*' \
230+
! -name '..' ! -name '.' \
231+
-exec chown "$DEVA_UID:$DEVA_GID" {} \; 2>/dev/null || true
223232
fi
224233

225234
chmod 755 /root 2>/dev/null || true
@@ -288,10 +297,10 @@ main() {
288297
cd "$WORKDIR"
289298
fi
290299

291-
ensure_agent_binaries
292300
setup_nonroot_user
293301
fix_rust_permissions
294302
fix_docker_socket_permissions
303+
ensure_agent_binaries
295304

296305
if [ $# -eq 0 ]; then
297306
if [ "$DEVA_AGENT" = "codex" ]; then

0 commit comments

Comments
 (0)