Loading...
Loading...
Debug container agent issues. Use when things aren't working, container fails, authentication problems, or to understand how the container system works. Covers logs, environment variables, mounts, and common issues.
npx skill4agent add sbusso/claudeclaw debugHost (macOS) Container (Linux VM)
─────────────────────────────────────────────────────────────
src/orchestrator/container-runner.ts agent/runner/
│ │
│ spawns container │ runs Claude Agent SDK
│ with volume mounts │ with MCP servers
│ │
├── data/env/env ──────────────> /workspace/env-dir/env
├── groups/{folder} ───────────> /workspace/group
├── data/ipc/{folder} ────────> /workspace/ipc
├── data/sessions/{folder}/.claude/ ──> /home/node/.claude/ (isolated per-group)
└── (main only) project root ──> /workspace/projectnodeHOME=/home/node/home/node/.claude//root/.claude/| Log | Location | Content |
|---|---|---|
| Main app logs | | Host-side WhatsApp, routing, container spawning |
| Main app errors | | Host-side errors |
| Container run logs | | Per-run: input, mounts, stderr, stdout |
| Claude sessions | | Claude Code session history |
LOG_LEVEL=debug# For development
LOG_LEVEL=debug npm run dev
# For launchd service (macOS), add to plist EnvironmentVariables:
<key>LOG_LEVEL</key>
<string>debug</string>
# For systemd service (Linux), add to unit [Service] section:
# Environment=LOG_LEVEL=debuggroups/{folder}/logs/container-*.logInvalid API key · Please run /login.envcat .env # Should show one of:
# CLAUDE_CODE_OAUTH_TOKEN=sk-ant-oat01-... (subscription)
# ANTHROPIC_API_KEY=sk-ant-api03-... (pay-per-use)--dangerously-skip-permissions cannot be used with root/sudo privilegesUSER node-e-iCLAUDE_CODE_OAUTH_TOKENANTHROPIC_API_KEY.envecho '{}' | docker run -i \
-v $(pwd)/data/env:/workspace/env-dir:ro \
--entrypoint /bin/bash claudeclaw-agent:latest \
-c 'export $(cat /workspace/env-dir/env | xargs); echo "OAuth: ${#CLAUDE_CODE_OAUTH_TOKEN} chars, API: ${#ANTHROPIC_API_KEY} chars"'-v--mount:ro# Readonly
-v /path:/container/path:ro
# Read-write
-v /path:/container/pathdocker run --rm --entrypoint /bin/bash claudeclaw-agent:latest -c 'ls -la /workspace/'/workspace/
├── env-dir/env # Environment file (CLAUDE_CODE_OAUTH_TOKEN or ANTHROPIC_API_KEY)
├── group/ # Current group folder (cwd)
├── project/ # Project root (main channel only)
├── global/ # Global CLAUDE.md (non-main only)
├── ipc/ # Inter-process communication
│ ├── messages/ # Outgoing WhatsApp messages
│ ├── tasks/ # Scheduled task commands
│ ├── current_tasks.json # Read-only: scheduled tasks visible to this group
│ └── available_groups.json # Read-only: WhatsApp groups for activation (main only)
└── extra/ # Additional custom mountsnodedocker run --rm --entrypoint /bin/bash claudeclaw-agent:latest -c '
whoami
ls -la /workspace/
ls -la /app/
'/workspace//app/node$HOME/.claude/projects/HOME=/home/node/home/node/.claude/projects/# In container-runner.ts, verify mount is to /home/node/.claude/, NOT /root/.claude/
grep -A3 "Claude sessions" src/orchestrator/container-runner.tsdocker run --rm --entrypoint /bin/bash \
-v ~/.claude:/home/node/.claude \
claudeclaw-agent:latest -c '
echo "HOME=$HOME"
ls -la $HOME/.claude/projects/ 2>&1 | head -5
'container-runner.ts/home/node/.claude/mounts.push({
hostPath: claudeDir,
containerPath: '/home/node/.claude', // NOT /root/.claude
readonly: false
});# Set up env file
mkdir -p data/env groups/test
cp .env data/env/env
# Run test query
echo '{"prompt":"What is 2+2?","groupFolder":"test","chatJid":"test@g.us","isMain":false}' | \
docker run -i \
-v $(pwd)/data/env:/workspace/env-dir:ro \
-v $(pwd)/groups/test:/workspace/group \
-v $(pwd)/data/ipc:/workspace/ipc \
claudeclaw-agent:latestdocker run --rm --entrypoint /bin/bash \
-v $(pwd)/data/env:/workspace/env-dir:ro \
claudeclaw-agent:latest -c '
export $(cat /workspace/env-dir/env | xargs)
claude -p "Say hello" --dangerously-skip-permissions --allowedTools ""
'docker run --rm -it --entrypoint /bin/bash claudeclaw-agent:latestquery({
prompt: input.prompt,
options: {
cwd: '/workspace/group',
allowedTools: ['Bash', 'Read', 'Write', ...],
permissionMode: 'bypassPermissions',
allowDangerouslySkipPermissions: true, // Required with bypassPermissions
settingSources: ['project'],
mcpServers: { ... }
}
})allowDangerouslySkipPermissions: truepermissionMode: 'bypassPermissions'# Rebuild main app
npm run build
# Rebuild container (use --no-cache for clean rebuild)
./src/runtimes/docker/build.sh
# Or force full rebuild
docker builder prune -af
./src/runtimes/docker/build.sh# List images
docker images
# Check what's in the image
docker run --rm --entrypoint /bin/bash claudeclaw-agent:latest -c '
echo "=== Node version ==="
node --version
echo "=== Claude Code version ==="
claude --version
echo "=== Installed packages ==="
ls /app/node_modules/
'data/sessions/{group}/.claude/node/home/node/home/node/.claude//root/.claude/# Clear all sessions for all groups
rm -rf data/sessions/
# Clear sessions for a specific group
rm -rf data/sessions/{groupFolder}/.claude/
# Also clear the session ID from ClaudeClaw's tracking (stored in SQLite)
sqlite3 store/messages.db "DELETE FROM sessions WHERE group_folder = '{groupFolder}'"grep "Session initialized" logs/claudeclaw.log | tail -5
# Should show the SAME session ID for consecutive messages in the same group/workspace/ipc/# Check pending messages
ls -la data/ipc/messages/
# Check pending task operations
ls -la data/ipc/tasks/
# Read a specific IPC file
cat data/ipc/messages/*.json
# Check available groups (main channel only)
cat data/ipc/main/available_groups.json
# Check current tasks snapshot
cat data/ipc/{groupFolder}/current_tasks.jsonmessages/*.jsontasks/*.jsoncurrent_tasks.jsonavailable_groups.jsonRUNTIME=sandbox@anthropic-ai/sandbox-runtimeHost (macOS/Linux)
───────────────────────────────────────────
src/orchestrator/sandbox-runner.ts
│
│ spawns sandboxed process via srt CLI
│ with kernel-enforced filesystem/network
│
├── CLAUDECLAW_GROUP_DIR → groups/{folder}
├── CLAUDECLAW_IPC_DIR → data/ipc/{folder}
├── CLAUDECLAW_PROJECT_DIR → project root (read-only)
├── CLAUDECLAW_GLOBAL_DIR → groups/global (read-only)
└── CLAUDECLAW_EXTRA_DIR → additional mountsallowRead: []tsxcd agent/runner && npx tscnodeCLAUDECLAW_*_DIRsandbox-runner.ts/workspace/*sqlite3 store/messages.db "DELETE FROM sessions"allowedDomainsapi.anthropic.comdata/sandbox-settings/ANTHROPIC_API_KEYCLAUDE_CODE_OAUTH_TOKEN.envecho "=== Checking ClaudeClaw Agent Setup ==="
echo -e "\n1. Authentication configured?"
[ -f .env ] && (grep -q "CLAUDE_CODE_OAUTH_TOKEN=sk-" .env || grep -q "ANTHROPIC_API_KEY=sk-" .env) && echo "OK" || echo "MISSING - add CLAUDE_CODE_OAUTH_TOKEN or ANTHROPIC_API_KEY to .env"
echo -e "\n2. Env file copied for container?"
[ -f data/env/env ] && echo "OK" || echo "MISSING - will be created on first run"
echo -e "\n3. Container runtime running?"
docker info &>/dev/null && echo "OK" || echo "NOT RUNNING - start Docker Desktop (macOS) or sudo systemctl start docker (Linux)"
echo -e "\n4. Container image exists?"
echo '{}' | docker run -i --entrypoint /bin/echo claudeclaw-agent:latest "OK" 2>/dev/null || echo "MISSING - run ./src/runtimes/docker/build.sh"
echo -e "\n5. Session mount path correct?"
grep -q "/home/node/.claude" src/orchestrator/container-runner.ts 2>/dev/null && echo "OK" || echo "WRONG - should mount to /home/node/.claude/, not /root/.claude/"
echo -e "\n6. Groups directory?"
ls -la groups/ 2>/dev/null || echo "MISSING - run setup"
echo -e "\n7. Recent container logs?"
ls -t groups/*/logs/container-*.log 2>/dev/null | head -3 || echo "No container logs yet"
echo -e "\n8. Session continuity working?"
SESSIONS=$(grep "Session initialized" logs/claudeclaw.log 2>/dev/null | tail -5 | awk '{print $NF}' | sort -u | wc -l)
[ "$SESSIONS" -le 2 ] && echo "OK (recent sessions reusing IDs)" || echo "CHECK - multiple different session IDs, may indicate resumption issues"