Skip to content

feat: auto-merge ~/.claude tooling on host bind-mount#23

Merged
recoskyler merged 4 commits into
latestfrom
dev
Mar 29, 2026
Merged

feat: auto-merge ~/.claude tooling on host bind-mount#23
recoskyler merged 4 commits into
latestfrom
dev

Conversation

@recoskyler

Copy link
Copy Markdown
Owner

Summary

  • New scripts/merge-claude-home.sh: Detects when host ~/.claude is bind-mounted into the container and additively merges image-built tooling (plugins, skills, rules, GSD) without overwriting host credentials/settings
  • Dockerfile snapshot: After setup-claude.sh runs, snapshots ~/.claude/ to /opt/devcontainer-claude/ as the golden backup, with an .image-marker for mount detection
  • Entrypoint wiring: docker-sock-fix.sh calls the merge script before existing docker socket logic
  • Documentation: Updated devcontainer-claude.md with merge behavior notes

How it works

  1. Build time: Image marker written, full ~/.claude/ snapshot to /opt/devcontainer-claude/
  2. Container start: Merge script compares markers. If they differ (mount detected), cp -rn fills in missing tooling directories. CLAUDE.md gets append-merged if host version lacks DevContainer sections.
  3. Idempotency: .merge-done marker prevents re-merging on container restart.

Test plan

  • Build base image and verify /opt/devcontainer-claude/ exists with full tooling
  • Start container without mount — verify merge script exits early (marker matches)
  • Start container with ~/.claude bind-mount — verify plugins/skills/rules restored
  • Restart container with mount — verify no duplicate CLAUDE.md content (idempotency)
  • Verify bash -n passes on both merge and entrypoint scripts
  • CI build check passes

@github-actions

Copy link
Copy Markdown

✅ Tool Verification: base

Click to expand verification output
========================================
  Tool Verification: base
========================================

=== Base tools ===
  PASS: git
  PASS: curl
  PASS: wget
  PASS: jq
  PASS: less
  PASS: sudo
  PASS: unzip
  PASS: tmux
  PASS: tree
  PASS: vim
  PASS: nano
  PASS: xclip
  PASS: rg
  PASS: fzf
  PASS: bat (batcat)
  PASS: fd (fdfind)
  PASS: tldr
  PASS: duf
  PASS: gh
  PASS: aws
  PASS: terraform
  PASS: kubectl
  PASS: stripe
  PASS: nvm
  PASS: node
  PASS: npm
  PASS: npx
  PASS: pnpm
  PASS: tsx
  PASS: uv
  PASS: gcc
  PASS: g++
  PASS: make
  PASS: cmake
  PASS: pkg-config
  PASS: psql
  PASS: mysql
  PASS: redis-cli
  PASS: ssh
  PASS: nc
  PASS: http
  PASS: ttyd
  PASS: delta
  PASS: agent-browser
  PASS: claude
  PASS: pi
  PASS: clideck
  PASS: GSD directory
  PASS: ntfy-hook.sh
  PASS: suggest-context7-hook.sh
  PASS: init-claude-mcp.sh

========================================
  Verification Summary
========================================
  Passed: 51
  Failed: 0
========================================

ALL_CHECKS_PASSED

@github-actions

Copy link
Copy Markdown

✅ Tool Verification: trixie-vnc-nvm-uv-claude

Click to expand verification output
========================================
  Tool Verification: trixie-vnc-nvm-uv-claude
========================================

=== Base tools ===
  PASS: git
  PASS: curl
  PASS: wget
  PASS: jq
  PASS: less
  PASS: sudo
  PASS: unzip
  PASS: tmux
  PASS: tree
  PASS: vim
  PASS: nano
  PASS: xclip
  PASS: rg
  PASS: fzf
  PASS: bat (batcat)
  PASS: fd (fdfind)
  PASS: tldr
  PASS: duf
  PASS: gh
  PASS: aws
  PASS: terraform
  PASS: kubectl
  PASS: stripe
  PASS: nvm
  PASS: node
  PASS: npm
  PASS: npx
  PASS: pnpm
  PASS: tsx
  PASS: uv
  PASS: gcc
  PASS: g++
  PASS: make
  PASS: cmake
  PASS: pkg-config
  PASS: psql
  PASS: mysql
  PASS: redis-cli
  PASS: ssh
  PASS: nc
  PASS: http
  PASS: ttyd
  PASS: delta
  PASS: agent-browser
  PASS: claude
  PASS: pi
  PASS: clideck
  PASS: GSD directory
  PASS: ntfy-hook.sh
  PASS: suggest-context7-hook.sh
  PASS: init-claude-mcp.sh

=== VNC tools ===
  PASS: x11vnc
  PASS: xvfb-run
  PASS: xdg-open

========================================
  Verification Summary
========================================
  Passed: 54
  Failed: 0
========================================

ALL_CHECKS_PASSED

@github-actions

Copy link
Copy Markdown

✅ Tool Verification: trixie-bun-nvm-uv-claude

Click to expand verification output
========================================
  Tool Verification: trixie-bun-nvm-uv-claude
========================================

=== Base tools ===
  PASS: git
  PASS: curl
  PASS: wget
  PASS: jq
  PASS: less
  PASS: sudo
  PASS: unzip
  PASS: tmux
  PASS: tree
  PASS: vim
  PASS: nano
  PASS: xclip
  PASS: rg
  PASS: fzf
  PASS: bat (batcat)
  PASS: fd (fdfind)
  PASS: tldr
  PASS: duf
  PASS: gh
  PASS: aws
  PASS: terraform
  PASS: kubectl
  PASS: stripe
  PASS: nvm
  PASS: node
  PASS: npm
  PASS: npx
  PASS: pnpm
  PASS: tsx
  PASS: uv
  PASS: gcc
  PASS: g++
  PASS: make
  PASS: cmake
  PASS: pkg-config
  PASS: psql
  PASS: mysql
  PASS: redis-cli
  PASS: ssh
  PASS: nc
  PASS: http
  PASS: ttyd
  PASS: delta
  PASS: agent-browser
  PASS: claude
  PASS: pi
  PASS: clideck
  PASS: GSD directory
  PASS: ntfy-hook.sh
  PASS: suggest-context7-hook.sh
  PASS: init-claude-mcp.sh

=== Bun tools ===
  PASS: bun
  PASS: bunx

========================================
  Verification Summary
========================================
  Passed: 53
  Failed: 0
========================================

ALL_CHECKS_PASSED

@github-actions

Copy link
Copy Markdown

✅ Tool Verification: trixie-php-nvm-uv-claude

Click to expand verification output
========================================
  Tool Verification: trixie-php-nvm-uv-claude
========================================

=== Base tools ===
  PASS: git
  PASS: curl
  PASS: wget
  PASS: jq
  PASS: less
  PASS: sudo
  PASS: unzip
  PASS: tmux
  PASS: tree
  PASS: vim
  PASS: nano
  PASS: xclip
  PASS: rg
  PASS: fzf
  PASS: bat (batcat)
  PASS: fd (fdfind)
  PASS: tldr
  PASS: duf
  PASS: gh
  PASS: aws
  PASS: terraform
  PASS: kubectl
  PASS: stripe
  PASS: nvm
  PASS: node
  PASS: npm
  PASS: npx
  PASS: pnpm
  PASS: tsx
  PASS: uv
  PASS: gcc
  PASS: g++
  PASS: make
  PASS: cmake
  PASS: pkg-config
  PASS: psql
  PASS: mysql
  PASS: redis-cli
  PASS: ssh
  PASS: nc
  PASS: http
  PASS: ttyd
  PASS: delta
  PASS: agent-browser
  PASS: claude
  PASS: pi
  PASS: clideck
  PASS: GSD directory
  PASS: ntfy-hook.sh
  PASS: suggest-context7-hook.sh
  PASS: init-claude-mcp.sh

=== PHP tools ===
  PASS: php
  PASS: composer

========================================
  Verification Summary
========================================
  Passed: 53
  Failed: 0
========================================

ALL_CHECKS_PASSED

@github-actions

Copy link
Copy Markdown

✅ Tool Verification: trixie-rust-nvm-uv-claude

Click to expand verification output
========================================
  Tool Verification: trixie-rust-nvm-uv-claude
========================================

=== Base tools ===
  PASS: git
  PASS: curl
  PASS: wget
  PASS: jq
  PASS: less
  PASS: sudo
  PASS: unzip
  PASS: tmux
  PASS: tree
  PASS: vim
  PASS: nano
  PASS: xclip
  PASS: rg
  PASS: fzf
  PASS: bat (batcat)
  PASS: fd (fdfind)
  PASS: tldr
  PASS: duf
  PASS: gh
  PASS: aws
  PASS: terraform
  PASS: kubectl
  PASS: stripe
  PASS: nvm
  PASS: node
  PASS: npm
  PASS: npx
  PASS: pnpm
  PASS: tsx
  PASS: uv
  PASS: gcc
  PASS: g++
  PASS: make
  PASS: cmake
  PASS: pkg-config
  PASS: psql
  PASS: mysql
  PASS: redis-cli
  PASS: ssh
  PASS: nc
  PASS: http
  PASS: ttyd
  PASS: delta
  PASS: agent-browser
  PASS: claude
  PASS: pi
  PASS: clideck
  PASS: GSD directory
  PASS: ntfy-hook.sh
  PASS: suggest-context7-hook.sh
  PASS: init-claude-mcp.sh

=== Rust tools ===
  PASS: rustc
  PASS: cargo
  PASS: rustup
  PASS: rustfmt
  PASS: cargo-clippy
  PASS: cargo-watch
  PASS: cargo-set-version
  PASS: cargo-nextest

========================================
  Verification Summary
========================================
  Passed: 59
  Failed: 0
========================================

ALL_CHECKS_PASSED

@github-actions

Copy link
Copy Markdown

✅ Tool Verification: trixie-vnc-flutter-rust-nvm-uv-claude

Click to expand verification output
========================================
  Tool Verification: trixie-vnc-flutter-rust-nvm-uv-claude
========================================

=== Base tools ===
  PASS: git
  PASS: curl
  PASS: wget
  PASS: jq
  PASS: less
  PASS: sudo
  PASS: unzip
  PASS: tmux
  PASS: tree
  PASS: vim
  PASS: nano
  PASS: xclip
  PASS: rg
  PASS: fzf
  PASS: bat (batcat)
  PASS: fd (fdfind)
  PASS: tldr
  PASS: duf
  PASS: gh
  PASS: aws
  PASS: terraform
  PASS: kubectl
  PASS: stripe
  PASS: nvm
  PASS: node
  PASS: npm
  PASS: npx
  PASS: pnpm
  PASS: tsx
  PASS: uv
  PASS: gcc
  PASS: g++
  PASS: make
  PASS: cmake
  PASS: pkg-config
  PASS: psql
  PASS: mysql
  PASS: redis-cli
  PASS: ssh
  PASS: nc
  PASS: http
  PASS: ttyd
  PASS: delta
  PASS: agent-browser
  PASS: claude
  PASS: pi
  PASS: clideck
  PASS: GSD directory
  PASS: ntfy-hook.sh
  PASS: suggest-context7-hook.sh
  PASS: init-claude-mcp.sh

=== Rust tools ===
  PASS: rustc
  PASS: cargo
  PASS: rustup
  PASS: rustfmt
  PASS: cargo-clippy
  PASS: cargo-watch
  PASS: cargo-set-version
  PASS: cargo-nextest

=== VNC tools ===
  PASS: x11vnc
  PASS: xvfb-run
  PASS: xdg-open

=== Flutter tools ===
  PASS: flutter
  PASS: dart
  PASS: fvm
  PASS: java
  PASS: chromium
  PASS: adb
  PASS: sdkmanager
  PASS: avdmanager

========================================
  Verification Summary
========================================
  Passed: 70
  Failed: 0
========================================

ALL_CHECKS_PASSED

…apshot

- Add merge script that detects host ~/.claude mount and merges image tooling
- Script handles three scenarios: no backup, no mount, host mount
- Idempotent via marker file to handle container restarts
- CLAUDE.md gets special append-merge (not overwrite)
- Dockerfile creates image marker after setup-claude.sh
- Dockerfile snapshots ~/.claude to /opt/devcontainer-claude in root section
- Merge script copied to ~/.local/bin/ alongside other scripts
…vcontainer-claude.md

- Call merge-claude-home.sh early in docker-sock-fix.sh before socket logic
- Use || true to ensure entrypoint never fails on merge issues
- Document merge behavior in devcontainer-claude.md Notes section
- Add SUMMARY.md with execution results
- Update STATE.md with quick task completion
@recoskyler recoskyler merged commit 758b888 into latest Mar 29, 2026
2 checks passed
@github-actions

Copy link
Copy Markdown

✅ Tool Verification: base

Click to expand verification output
========================================
  Tool Verification: base
========================================

=== Base tools ===
  PASS: git
  PASS: curl
  PASS: wget
  PASS: jq
  PASS: less
  PASS: sudo
  PASS: unzip
  PASS: tmux
  PASS: tree
  PASS: vim
  PASS: nano
  PASS: xclip
  PASS: rg
  PASS: fzf
  PASS: bat (batcat)
  PASS: fd (fdfind)
  PASS: tldr
  PASS: duf
  PASS: gh
  PASS: aws
  PASS: terraform
  PASS: kubectl
  PASS: stripe
  PASS: nvm
  PASS: node
  PASS: npm
  PASS: npx
  PASS: pnpm
  PASS: tsx
  PASS: uv
  PASS: gcc
  PASS: g++
  PASS: make
  PASS: cmake
  PASS: pkg-config
  PASS: psql
  PASS: mysql
  PASS: redis-cli
  PASS: ssh
  PASS: nc
  PASS: http
  PASS: ttyd
  PASS: delta
  PASS: agent-browser
  PASS: claude
  PASS: pi
  PASS: clideck
  PASS: GSD directory
  PASS: ntfy-hook.sh
  PASS: suggest-context7-hook.sh
  PASS: init-claude-mcp.sh

========================================
  Verification Summary
========================================
  Passed: 51
  Failed: 0
========================================

ALL_CHECKS_PASSED

@github-actions

Copy link
Copy Markdown

✅ Tool Verification: trixie-bun-nvm-uv-claude

Click to expand verification output
========================================
  Tool Verification: trixie-bun-nvm-uv-claude
========================================

=== Base tools ===
  PASS: git
  PASS: curl
  PASS: wget
  PASS: jq
  PASS: less
  PASS: sudo
  PASS: unzip
  PASS: tmux
  PASS: tree
  PASS: vim
  PASS: nano
  PASS: xclip
  PASS: rg
  PASS: fzf
  PASS: bat (batcat)
  PASS: fd (fdfind)
  PASS: tldr
  PASS: duf
  PASS: gh
  PASS: aws
  PASS: terraform
  PASS: kubectl
  PASS: stripe
  PASS: nvm
  PASS: node
  PASS: npm
  PASS: npx
  PASS: pnpm
  PASS: tsx
  PASS: uv
  PASS: gcc
  PASS: g++
  PASS: make
  PASS: cmake
  PASS: pkg-config
  PASS: psql
  PASS: mysql
  PASS: redis-cli
  PASS: ssh
  PASS: nc
  PASS: http
  PASS: ttyd
  PASS: delta
  PASS: agent-browser
  PASS: claude
  PASS: pi
  PASS: clideck
  PASS: GSD directory
  PASS: ntfy-hook.sh
  PASS: suggest-context7-hook.sh
  PASS: init-claude-mcp.sh

=== Bun tools ===
  PASS: bun
  PASS: bunx

========================================
  Verification Summary
========================================
  Passed: 53
  Failed: 0
========================================

ALL_CHECKS_PASSED

@github-actions

Copy link
Copy Markdown

✅ Tool Verification: trixie-vnc-nvm-uv-claude

Click to expand verification output
========================================
  Tool Verification: trixie-vnc-nvm-uv-claude
========================================

=== Base tools ===
  PASS: git
  PASS: curl
  PASS: wget
  PASS: jq
  PASS: less
  PASS: sudo
  PASS: unzip
  PASS: tmux
  PASS: tree
  PASS: vim
  PASS: nano
  PASS: xclip
  PASS: rg
  PASS: fzf
  PASS: bat (batcat)
  PASS: fd (fdfind)
  PASS: tldr
  PASS: duf
  PASS: gh
  PASS: aws
  PASS: terraform
  PASS: kubectl
  PASS: stripe
  PASS: nvm
  PASS: node
  PASS: npm
  PASS: npx
  PASS: pnpm
  PASS: tsx
  PASS: uv
  PASS: gcc
  PASS: g++
  PASS: make
  PASS: cmake
  PASS: pkg-config
  PASS: psql
  PASS: mysql
  PASS: redis-cli
  PASS: ssh
  PASS: nc
  PASS: http
  PASS: ttyd
  PASS: delta
  PASS: agent-browser
  PASS: claude
  PASS: pi
  PASS: clideck
  PASS: GSD directory
  PASS: ntfy-hook.sh
  PASS: suggest-context7-hook.sh
  PASS: init-claude-mcp.sh

=== VNC tools ===
  PASS: x11vnc
  PASS: xvfb-run
  PASS: xdg-open

========================================
  Verification Summary
========================================
  Passed: 54
  Failed: 0
========================================

ALL_CHECKS_PASSED

@github-actions

Copy link
Copy Markdown

✅ Tool Verification: trixie-php-nvm-uv-claude

Click to expand verification output
========================================
  Tool Verification: trixie-php-nvm-uv-claude
========================================

=== Base tools ===
  PASS: git
  PASS: curl
  PASS: wget
  PASS: jq
  PASS: less
  PASS: sudo
  PASS: unzip
  PASS: tmux
  PASS: tree
  PASS: vim
  PASS: nano
  PASS: xclip
  PASS: rg
  PASS: fzf
  PASS: bat (batcat)
  PASS: fd (fdfind)
  PASS: tldr
  PASS: duf
  PASS: gh
  PASS: aws
  PASS: terraform
  PASS: kubectl
  PASS: stripe
  PASS: nvm
  PASS: node
  PASS: npm
  PASS: npx
  PASS: pnpm
  PASS: tsx
  PASS: uv
  PASS: gcc
  PASS: g++
  PASS: make
  PASS: cmake
  PASS: pkg-config
  PASS: psql
  PASS: mysql
  PASS: redis-cli
  PASS: ssh
  PASS: nc
  PASS: http
  PASS: ttyd
  PASS: delta
  PASS: agent-browser
  PASS: claude
  PASS: pi
  PASS: clideck
  PASS: GSD directory
  PASS: ntfy-hook.sh
  PASS: suggest-context7-hook.sh
  PASS: init-claude-mcp.sh

=== PHP tools ===
  PASS: php
  PASS: composer

========================================
  Verification Summary
========================================
  Passed: 53
  Failed: 0
========================================

ALL_CHECKS_PASSED

@github-actions

Copy link
Copy Markdown

✅ Tool Verification: trixie-rust-nvm-uv-claude

Click to expand verification output
========================================
  Tool Verification: trixie-rust-nvm-uv-claude
========================================

=== Base tools ===
  PASS: git
  PASS: curl
  PASS: wget
  PASS: jq
  PASS: less
  PASS: sudo
  PASS: unzip
  PASS: tmux
  PASS: tree
  PASS: vim
  PASS: nano
  PASS: xclip
  PASS: rg
  PASS: fzf
  PASS: bat (batcat)
  PASS: fd (fdfind)
  PASS: tldr
  PASS: duf
  PASS: gh
  PASS: aws
  PASS: terraform
  PASS: kubectl
  PASS: stripe
  PASS: nvm
  PASS: node
  PASS: npm
  PASS: npx
  PASS: pnpm
  PASS: tsx
  PASS: uv
  PASS: gcc
  PASS: g++
  PASS: make
  PASS: cmake
  PASS: pkg-config
  PASS: psql
  PASS: mysql
  PASS: redis-cli
  PASS: ssh
  PASS: nc
  PASS: http
  PASS: ttyd
  PASS: delta
  PASS: agent-browser
  PASS: claude
  PASS: pi
  PASS: clideck
  PASS: GSD directory
  PASS: ntfy-hook.sh
  PASS: suggest-context7-hook.sh
  PASS: init-claude-mcp.sh

=== Rust tools ===
  PASS: rustc
  PASS: cargo
  PASS: rustup
  PASS: rustfmt
  PASS: cargo-clippy
  PASS: cargo-watch
  PASS: cargo-set-version
  PASS: cargo-nextest

========================================
  Verification Summary
========================================
  Passed: 59
  Failed: 0
========================================

ALL_CHECKS_PASSED

@github-actions

Copy link
Copy Markdown

✅ Tool Verification: trixie-vnc-flutter-rust-nvm-uv-claude

Click to expand verification output
========================================
  Tool Verification: trixie-vnc-flutter-rust-nvm-uv-claude
========================================

=== Base tools ===
  PASS: git
  PASS: curl
  PASS: wget
  PASS: jq
  PASS: less
  PASS: sudo
  PASS: unzip
  PASS: tmux
  PASS: tree
  PASS: vim
  PASS: nano
  PASS: xclip
  PASS: rg
  PASS: fzf
  PASS: bat (batcat)
  PASS: fd (fdfind)
  PASS: tldr
  PASS: duf
  PASS: gh
  PASS: aws
  PASS: terraform
  PASS: kubectl
  PASS: stripe
  PASS: nvm
  PASS: node
  PASS: npm
  PASS: npx
  PASS: pnpm
  PASS: tsx
  PASS: uv
  PASS: gcc
  PASS: g++
  PASS: make
  PASS: cmake
  PASS: pkg-config
  PASS: psql
  PASS: mysql
  PASS: redis-cli
  PASS: ssh
  PASS: nc
  PASS: http
  PASS: ttyd
  PASS: delta
  PASS: agent-browser
  PASS: claude
  PASS: pi
  PASS: clideck
  PASS: GSD directory
  PASS: ntfy-hook.sh
  PASS: suggest-context7-hook.sh
  PASS: init-claude-mcp.sh

=== Rust tools ===
  PASS: rustc
  PASS: cargo
  PASS: rustup
  PASS: rustfmt
  PASS: cargo-clippy
  PASS: cargo-watch
  PASS: cargo-set-version
  PASS: cargo-nextest

=== VNC tools ===
  PASS: x11vnc
  PASS: xvfb-run
  PASS: xdg-open

=== Flutter tools ===
  PASS: flutter
  PASS: dart
  PASS: fvm
  PASS: java
  PASS: chromium
  PASS: adb
  PASS: sdkmanager
  PASS: avdmanager

========================================
  Verification Summary
========================================
  Passed: 70
  Failed: 0
========================================

ALL_CHECKS_PASSED

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant