claudepod 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.devcontainer/config/claude/settings.json +179 -0
- package/.devcontainer/devcontainer.json +110 -0
- package/.devcontainer/post-create.sh +400 -0
- package/.devcontainer/post-start.sh +370 -0
- package/.devcontainer/setup-zsh.sh +385 -0
- package/README.md +189 -0
- package/package.json +39 -0
- package/setup.js +75 -0
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# ZSH Configuration Script for ClaudePod
|
|
3
|
+
# This script enhances the ZSH setup with plugins, themes, and productivity features
|
|
4
|
+
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
echo "🐚 Setting up enhanced ZSH configuration..."
|
|
8
|
+
|
|
9
|
+
# Variables
|
|
10
|
+
ZSH_CUSTOM="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}"
|
|
11
|
+
NODE_USER="node"
|
|
12
|
+
|
|
13
|
+
# Function to install ZSH plugin
|
|
14
|
+
install_zsh_plugin() {
|
|
15
|
+
local plugin_name="$1"
|
|
16
|
+
local plugin_repo="$2"
|
|
17
|
+
local plugin_dir="$ZSH_CUSTOM/plugins/$plugin_name"
|
|
18
|
+
|
|
19
|
+
if [ ! -d "$plugin_dir" ]; then
|
|
20
|
+
echo "📦 Installing ZSH plugin: $plugin_name"
|
|
21
|
+
git clone "https://github.com/$plugin_repo.git" "$plugin_dir" || {
|
|
22
|
+
echo "⚠️ Failed to install $plugin_name plugin"
|
|
23
|
+
return 1
|
|
24
|
+
}
|
|
25
|
+
else
|
|
26
|
+
echo "✅ ZSH plugin $plugin_name already installed"
|
|
27
|
+
fi
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
# Function to install Powerlevel10k theme
|
|
31
|
+
install_powerlevel10k() {
|
|
32
|
+
local theme_dir="$ZSH_CUSTOM/themes/powerlevel10k"
|
|
33
|
+
|
|
34
|
+
if [ ! -d "$theme_dir" ]; then
|
|
35
|
+
echo "🎨 Installing Powerlevel10k theme..."
|
|
36
|
+
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git "$theme_dir" || {
|
|
37
|
+
echo "⚠️ Failed to install Powerlevel10k theme"
|
|
38
|
+
return 1
|
|
39
|
+
}
|
|
40
|
+
else
|
|
41
|
+
echo "✅ Powerlevel10k theme already installed"
|
|
42
|
+
fi
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
# Function to create enhanced .zshrc
|
|
46
|
+
create_zshrc() {
|
|
47
|
+
echo "📝 Creating enhanced .zshrc configuration..."
|
|
48
|
+
|
|
49
|
+
# Backup existing .zshrc if it exists
|
|
50
|
+
if [ -f "$HOME/.zshrc" ]; then
|
|
51
|
+
cp "$HOME/.zshrc" "$HOME/.zshrc.backup.$(date +%s)" 2>/dev/null || true
|
|
52
|
+
fi
|
|
53
|
+
|
|
54
|
+
cat > "$HOME/.zshrc" << 'EOF'
|
|
55
|
+
# ClaudePod ZSH Configuration
|
|
56
|
+
# Path to your oh-my-zsh installation
|
|
57
|
+
export ZSH="$HOME/.oh-my-zsh"
|
|
58
|
+
|
|
59
|
+
# Set name of the theme to load
|
|
60
|
+
ZSH_THEME="powerlevel10k/powerlevel10k"
|
|
61
|
+
|
|
62
|
+
# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc.
|
|
63
|
+
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
|
|
64
|
+
source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
|
|
65
|
+
fi
|
|
66
|
+
|
|
67
|
+
# Disable P10k configuration wizard
|
|
68
|
+
export POWERLEVEL9K_DISABLE_CONFIGURATION_WIZARD=true
|
|
69
|
+
|
|
70
|
+
# ZSH Configuration
|
|
71
|
+
CASE_SENSITIVE="false"
|
|
72
|
+
HYPHEN_INSENSITIVE="true"
|
|
73
|
+
DISABLE_AUTO_UPDATE="false"
|
|
74
|
+
DISABLE_UPDATE_PROMPT="true"
|
|
75
|
+
export UPDATE_ZSH_DAYS=7
|
|
76
|
+
DISABLE_MAGIC_FUNCTIONS="false"
|
|
77
|
+
DISABLE_LS_COLORS="false"
|
|
78
|
+
DISABLE_AUTO_TITLE="false"
|
|
79
|
+
ENABLE_CORRECTION="true"
|
|
80
|
+
COMPLETION_WAITING_DOTS="true"
|
|
81
|
+
DISABLE_UNTRACKED_FILES_DIRTY="false"
|
|
82
|
+
HIST_STAMPS="yyyy-mm-dd"
|
|
83
|
+
|
|
84
|
+
# ZSH Plugins
|
|
85
|
+
plugins=(
|
|
86
|
+
git
|
|
87
|
+
docker
|
|
88
|
+
docker-compose
|
|
89
|
+
node
|
|
90
|
+
npm
|
|
91
|
+
python
|
|
92
|
+
pip
|
|
93
|
+
vscode
|
|
94
|
+
zsh-syntax-highlighting
|
|
95
|
+
zsh-autosuggestions
|
|
96
|
+
zsh-completions
|
|
97
|
+
fast-syntax-highlighting
|
|
98
|
+
history-substring-search
|
|
99
|
+
colored-man-pages
|
|
100
|
+
command-not-found
|
|
101
|
+
extract
|
|
102
|
+
z
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
# Load Oh My Zsh
|
|
106
|
+
source $ZSH/oh-my-zsh.sh
|
|
107
|
+
|
|
108
|
+
# User configuration
|
|
109
|
+
export LANG=en_US.UTF-8
|
|
110
|
+
export EDITOR='code'
|
|
111
|
+
export ARCHFLAGS="-arch x86_64"
|
|
112
|
+
|
|
113
|
+
# History configuration
|
|
114
|
+
HISTSIZE=50000
|
|
115
|
+
SAVEHIST=50000
|
|
116
|
+
setopt HIST_EXPIRE_DUPS_FIRST
|
|
117
|
+
setopt HIST_IGNORE_DUPS
|
|
118
|
+
setopt HIST_IGNORE_ALL_DUPS
|
|
119
|
+
setopt HIST_IGNORE_SPACE
|
|
120
|
+
setopt HIST_FIND_NO_DUPS
|
|
121
|
+
setopt HIST_SAVE_NO_DUPS
|
|
122
|
+
setopt HIST_BEEP
|
|
123
|
+
setopt SHARE_HISTORY
|
|
124
|
+
|
|
125
|
+
# Path configuration
|
|
126
|
+
export PATH="$HOME/.local/bin:$PATH"
|
|
127
|
+
export PATH="/usr/local/share/npm-global/bin:$PATH"
|
|
128
|
+
|
|
129
|
+
# Node.js/NVM configuration
|
|
130
|
+
export NVM_DIR="/usr/local/share/nvm"
|
|
131
|
+
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
|
|
132
|
+
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
|
|
133
|
+
|
|
134
|
+
# Python configuration
|
|
135
|
+
if command -v python3 &> /dev/null; then
|
|
136
|
+
alias python=python3
|
|
137
|
+
alias pip=pip3
|
|
138
|
+
fi
|
|
139
|
+
|
|
140
|
+
# ClaudePod aliases
|
|
141
|
+
alias ll='ls -alF'
|
|
142
|
+
alias la='ls -A'
|
|
143
|
+
alias l='ls -CF'
|
|
144
|
+
alias gs='git status'
|
|
145
|
+
alias gd='git diff'
|
|
146
|
+
alias gc='git commit'
|
|
147
|
+
alias gco='git checkout'
|
|
148
|
+
alias gp='git push'
|
|
149
|
+
alias gl='git log --oneline --graph --decorate'
|
|
150
|
+
alias ga='git add'
|
|
151
|
+
alias gb='git branch'
|
|
152
|
+
alias gm='git merge'
|
|
153
|
+
alias gr='git rebase'
|
|
154
|
+
alias gf='git fetch'
|
|
155
|
+
alias gpl='git pull'
|
|
156
|
+
|
|
157
|
+
# Development aliases
|
|
158
|
+
alias c='code .'
|
|
159
|
+
alias cls='clear'
|
|
160
|
+
alias h='history'
|
|
161
|
+
alias ..='cd ..'
|
|
162
|
+
alias ...='cd ../..'
|
|
163
|
+
alias ....='cd ../../..'
|
|
164
|
+
alias ~='cd ~'
|
|
165
|
+
|
|
166
|
+
# Claude Code aliases
|
|
167
|
+
alias claude='claude --model sonnet --dangerously-skip-permissions'
|
|
168
|
+
alias claude-help='claude --help'
|
|
169
|
+
alias claude-mcp='claude mcp list'
|
|
170
|
+
alias claude-version='claude --version'
|
|
171
|
+
|
|
172
|
+
# Docker aliases (if docker is available)
|
|
173
|
+
if command -v docker &> /dev/null; then
|
|
174
|
+
alias d='docker'
|
|
175
|
+
alias dc='docker-compose'
|
|
176
|
+
alias dps='docker ps'
|
|
177
|
+
alias dpsa='docker ps -a'
|
|
178
|
+
alias di='docker images'
|
|
179
|
+
alias drm='docker rm'
|
|
180
|
+
alias drmi='docker rmi'
|
|
181
|
+
fi
|
|
182
|
+
|
|
183
|
+
# Useful functions
|
|
184
|
+
# Extract various archive formats
|
|
185
|
+
extract() {
|
|
186
|
+
if [ -f $1 ]; then
|
|
187
|
+
case $1 in
|
|
188
|
+
*.tar.bz2) tar xjf $1 ;;
|
|
189
|
+
*.tar.gz) tar xzf $1 ;;
|
|
190
|
+
*.bz2) bunzip2 $1 ;;
|
|
191
|
+
*.rar) unrar e $1 ;;
|
|
192
|
+
*.gz) gunzip $1 ;;
|
|
193
|
+
*.tar) tar xf $1 ;;
|
|
194
|
+
*.tbz2) tar xjf $1 ;;
|
|
195
|
+
*.tgz) tar xzf $1 ;;
|
|
196
|
+
*.zip) unzip $1 ;;
|
|
197
|
+
*.Z) uncompress $1 ;;
|
|
198
|
+
*.7z) 7z x $1 ;;
|
|
199
|
+
*) echo "'$1' cannot be extracted via extract()" ;;
|
|
200
|
+
esac
|
|
201
|
+
else
|
|
202
|
+
echo "'$1' is not a valid file"
|
|
203
|
+
fi
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
# Create directory and cd into it
|
|
207
|
+
mkcd() {
|
|
208
|
+
mkdir -p "$1" && cd "$1"
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
# Find process by name
|
|
212
|
+
findp() {
|
|
213
|
+
ps aux | grep -v grep | grep "$1"
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
# Quick HTTP server
|
|
217
|
+
serve() {
|
|
218
|
+
local port="${1:-8000}"
|
|
219
|
+
python3 -m http.server "$port"
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
# Load Powerlevel10k configuration
|
|
223
|
+
if [[ -r ~/.p10k.zsh ]]; then
|
|
224
|
+
source ~/.p10k.zsh
|
|
225
|
+
fi
|
|
226
|
+
|
|
227
|
+
# Auto-suggestions configuration
|
|
228
|
+
ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE="fg=#666666"
|
|
229
|
+
ZSH_AUTOSUGGEST_STRATEGY=(history completion)
|
|
230
|
+
ZSH_AUTOSUGGEST_USE_ASYNC=true
|
|
231
|
+
|
|
232
|
+
# Syntax highlighting configuration
|
|
233
|
+
ZSH_HIGHLIGHT_HIGHLIGHTERS=(main brackets pattern)
|
|
234
|
+
|
|
235
|
+
# Welcome message
|
|
236
|
+
if [[ -n "$ZSH_VERSION" && -z "$VSCODE_RESOLVING_ENVIRONMENT" ]]; then
|
|
237
|
+
echo "🚀 Welcome to ClaudePod!"
|
|
238
|
+
echo "💡 Type 'claude' to start using Claude Code"
|
|
239
|
+
echo "📋 Run 'claude mcp list' to see available MCP servers"
|
|
240
|
+
fi
|
|
241
|
+
EOF
|
|
242
|
+
|
|
243
|
+
echo "✅ Enhanced .zshrc created"
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
# Function to create Powerlevel10k configuration
|
|
247
|
+
create_p10k_config() {
|
|
248
|
+
echo "⚡ Creating Powerlevel10k configuration..."
|
|
249
|
+
|
|
250
|
+
cat > "$HOME/.p10k.zsh" << 'EOF'
|
|
251
|
+
# Powerlevel10k configuration for ClaudePod
|
|
252
|
+
'builtin' 'local' '-a' 'p10k_config_opts'
|
|
253
|
+
[[ ! -o 'aliases' ]] || p10k_config_opts+=('aliases')
|
|
254
|
+
[[ ! -o 'sh_glob' ]] || p10k_config_opts+=('sh_glob')
|
|
255
|
+
[[ ! -o 'no_brace_expand' ]] || p10k_config_opts+=('no_brace_expand')
|
|
256
|
+
'builtin' 'setopt' 'no_aliases' 'no_sh_glob' 'brace_expand'
|
|
257
|
+
|
|
258
|
+
() {
|
|
259
|
+
emulate -L zsh -o extended_glob
|
|
260
|
+
|
|
261
|
+
# Unset all configuration options (safely).
|
|
262
|
+
local var
|
|
263
|
+
for var in ${(M)${(k)parameters[@]}:#POWERLEVEL9K_*}; do
|
|
264
|
+
unset $var
|
|
265
|
+
done
|
|
266
|
+
|
|
267
|
+
# The list of segments shown on the left. Fill it with the most important segments.
|
|
268
|
+
typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(
|
|
269
|
+
os_icon # os identifier
|
|
270
|
+
dir # current directory
|
|
271
|
+
vcs # git status
|
|
272
|
+
prompt_char # prompt symbol
|
|
273
|
+
)
|
|
274
|
+
|
|
275
|
+
# The list of segments shown on the right. Fill it with less important segments.
|
|
276
|
+
typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(
|
|
277
|
+
status # exit code of the last command
|
|
278
|
+
command_execution_time # duration of the last command
|
|
279
|
+
background_jobs # presence of background jobs
|
|
280
|
+
direnv # direnv status (https://direnv.net/)
|
|
281
|
+
asdf # asdf version manager (https://github.com/asdf-vm/asdf)
|
|
282
|
+
virtualenv # python virtual environment (https://docs.python.org/3/library/venv.html)
|
|
283
|
+
anaconda # conda environment (https://conda.io/)
|
|
284
|
+
pyenv # python environment (https://github.com/pyenv/pyenv)
|
|
285
|
+
goenv # go environment (https://github.com/syndbg/goenv)
|
|
286
|
+
nodenv # node.js version from nodenv (https://github.com/nodenv/nodenv)
|
|
287
|
+
nvm # node.js version from nvm (https://github.com/nvm-sh/nvm)
|
|
288
|
+
nodeenv # node.js environment (https://github.com/ekalinin/nodeenv)
|
|
289
|
+
node_version # node.js version
|
|
290
|
+
time # current time
|
|
291
|
+
)
|
|
292
|
+
|
|
293
|
+
# Basic style options that define the overall look of your prompt.
|
|
294
|
+
typeset -g POWERLEVEL9K_BACKGROUND= # transparent background
|
|
295
|
+
typeset -g POWERLEVEL9K_{LEFT,RIGHT}_{LEFT,RIGHT}_WHITESPACE= # no surrounding whitespace
|
|
296
|
+
typeset -g POWERLEVEL9K_{LEFT,RIGHT}_SUBSEGMENT_SEPARATOR=' ' # separate segments with a space
|
|
297
|
+
typeset -g POWERLEVEL9K_{LEFT,RIGHT}_SEGMENT_SEPARATOR= # no end-of-line symbol
|
|
298
|
+
typeset -g POWERLEVEL9K_VISUAL_IDENTIFIER_EXPANSION= # no segment icons
|
|
299
|
+
|
|
300
|
+
# Directory colors
|
|
301
|
+
typeset -g POWERLEVEL9K_DIR_BACKGROUND=4
|
|
302
|
+
typeset -g POWERLEVEL9K_DIR_FOREGROUND=254
|
|
303
|
+
typeset -g POWERLEVEL9K_DIR_SHORTENED_FOREGROUND=250
|
|
304
|
+
typeset -g POWERLEVEL9K_DIR_ANCHOR_FOREGROUND=255
|
|
305
|
+
typeset -g POWERLEVEL9K_DIR_ANCHOR_BOLD=true
|
|
306
|
+
|
|
307
|
+
# Git colors
|
|
308
|
+
typeset -g POWERLEVEL9K_VCS_CLEAN_BACKGROUND=2
|
|
309
|
+
typeset -g POWERLEVEL9K_VCS_CLEAN_FOREGROUND=0
|
|
310
|
+
typeset -g POWERLEVEL9K_VCS_UNTRACKED_BACKGROUND=3
|
|
311
|
+
typeset -g POWERLEVEL9K_VCS_UNTRACKED_FOREGROUND=0
|
|
312
|
+
typeset -g POWERLEVEL9K_VCS_MODIFIED_BACKGROUND=1
|
|
313
|
+
typeset -g POWERLEVEL9K_VCS_MODIFIED_FOREGROUND=0
|
|
314
|
+
|
|
315
|
+
# Prompt character
|
|
316
|
+
typeset -g POWERLEVEL9K_PROMPT_CHAR_OK_{VIINS,VICMD,VIVIS}_FOREGROUND=76
|
|
317
|
+
typeset -g POWERLEVEL9K_PROMPT_CHAR_ERROR_{VIINS,VICMD,VIVIS}_FOREGROUND=196
|
|
318
|
+
|
|
319
|
+
# Time format
|
|
320
|
+
typeset -g POWERLEVEL9K_TIME_FORMAT='%D{%H:%M:%S}'
|
|
321
|
+
|
|
322
|
+
# Command execution time threshold
|
|
323
|
+
typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=3
|
|
324
|
+
|
|
325
|
+
# Node.js version display
|
|
326
|
+
typeset -g POWERLEVEL9K_NODE_VERSION_PROJECT_ONLY=true
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
# Apply configuration
|
|
330
|
+
(( ! $#p10k_config_opts )) || setopt ${p10k_config_opts[@]}
|
|
331
|
+
'builtin' 'unset' 'p10k_config_opts'
|
|
332
|
+
EOF
|
|
333
|
+
|
|
334
|
+
echo "✅ Powerlevel10k configuration created"
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
# Main setup function
|
|
338
|
+
main() {
|
|
339
|
+
echo "🐚 Starting ZSH enhancement setup..."
|
|
340
|
+
|
|
341
|
+
# Ensure we're running as the correct user
|
|
342
|
+
if [ "$(whoami)" != "$NODE_USER" ]; then
|
|
343
|
+
echo "❌ This script should run as user $NODE_USER"
|
|
344
|
+
exit 1
|
|
345
|
+
fi
|
|
346
|
+
|
|
347
|
+
# Check if Oh My Zsh is installed
|
|
348
|
+
if [ ! -d "$HOME/.oh-my-zsh" ]; then
|
|
349
|
+
echo "❌ Oh My Zsh not found. Ensure the common-utils feature installed it."
|
|
350
|
+
exit 1
|
|
351
|
+
fi
|
|
352
|
+
|
|
353
|
+
# Suppress NVM errors during this process
|
|
354
|
+
export NVM_DIR="/usr/local/share/nvm"
|
|
355
|
+
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" 2>/dev/null || true
|
|
356
|
+
|
|
357
|
+
# Install Powerlevel10k theme
|
|
358
|
+
install_powerlevel10k
|
|
359
|
+
|
|
360
|
+
# Install useful ZSH plugins (with error handling)
|
|
361
|
+
echo "📦 Installing ZSH plugins..."
|
|
362
|
+
install_zsh_plugin "zsh-autosuggestions" "zsh-users/zsh-autosuggestions" || echo "⚠️ Failed to install zsh-autosuggestions"
|
|
363
|
+
install_zsh_plugin "zsh-syntax-highlighting" "zsh-users/zsh-syntax-highlighting" || echo "⚠️ Failed to install zsh-syntax-highlighting"
|
|
364
|
+
install_zsh_plugin "zsh-completions" "zsh-users/zsh-completions" || echo "⚠️ Failed to install zsh-completions"
|
|
365
|
+
install_zsh_plugin "fast-syntax-highlighting" "zdharma-continuum/fast-syntax-highlighting" || echo "⚠️ Failed to install fast-syntax-highlighting"
|
|
366
|
+
install_zsh_plugin "history-substring-search" "zsh-users/zsh-history-substring-search" || echo "⚠️ Failed to install history-substring-search"
|
|
367
|
+
|
|
368
|
+
# Create enhanced .zshrc
|
|
369
|
+
create_zshrc
|
|
370
|
+
|
|
371
|
+
# Create Powerlevel10k configuration
|
|
372
|
+
create_p10k_config
|
|
373
|
+
|
|
374
|
+
# Set ZSH as default shell
|
|
375
|
+
echo "🔧 Setting ZSH as default shell..."
|
|
376
|
+
if [ -f "/usr/bin/zsh" ]; then
|
|
377
|
+
sudo chsh -s /usr/bin/zsh "$NODE_USER" || echo "⚠️ Could not change default shell"
|
|
378
|
+
fi
|
|
379
|
+
|
|
380
|
+
echo "✅ ZSH enhancement setup complete!"
|
|
381
|
+
echo "💡 Restart your terminal or run 'source ~/.zshrc' to apply changes"
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
# Execute main function
|
|
385
|
+
main
|
package/README.md
ADDED
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# ClaudePod DevContainer Package
|
|
2
|
+
|
|
3
|
+
A fully configured DevContainer optimized for Claude Code development with MCP servers, modern development tools, and persistent configuration. Easily add this development environment to any project with one command.
|
|
4
|
+
|
|
5
|
+
## 🚀 Quick Setup
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Install in any project directory
|
|
9
|
+
npx claudepod-devcontainer
|
|
10
|
+
|
|
11
|
+
# Start the container
|
|
12
|
+
devpod up .
|
|
13
|
+
|
|
14
|
+
# Connect with VS Code
|
|
15
|
+
devpod ssh <workspace-name> --ide vscode
|
|
16
|
+
|
|
17
|
+
# Start coding with Claude
|
|
18
|
+
claude
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## ✨ What You Get
|
|
22
|
+
|
|
23
|
+
### 🛠️ Development Stack
|
|
24
|
+
- **Node.js 20** (via NVM) + npm/npx
|
|
25
|
+
- **Python 3.13** with pipx, uv/uvx, and common tools
|
|
26
|
+
- **Git** with git-delta for beautiful diffs
|
|
27
|
+
- **GitHub CLI** for repository operations
|
|
28
|
+
- **Claude Code CLI** with optimized tool configuration
|
|
29
|
+
|
|
30
|
+
### 🔌 MCP Servers (Pre-configured)
|
|
31
|
+
- **Serena** - Advanced code analysis and semantic search
|
|
32
|
+
- **DeepWiki** - GitHub repository documentation search
|
|
33
|
+
- **TaskMaster AI** - AI-powered project management
|
|
34
|
+
- **Sequential Thinking** - Structured problem-solving
|
|
35
|
+
- **GitHub MCP** - Complete GitHub API integration (requires API key)
|
|
36
|
+
- **Tavily Search** - Web search capabilities (requires API key)
|
|
37
|
+
- **Ref.Tools** - Documentation tools (requires API key)
|
|
38
|
+
|
|
39
|
+
### ⚡ Productivity Features
|
|
40
|
+
- **Optimized tool configuration** - 79 essential tools pre-allowed (51% reduction from 161 total)
|
|
41
|
+
- **Zero permission prompts** for common development workflows
|
|
42
|
+
- **Intelligent tool selection** - Prioritizes powerful MCP tools over basic built-ins
|
|
43
|
+
- **Shell aliases** - `gs`, `gd`, `gc`, `gp`, `gl` for git operations
|
|
44
|
+
- **Persistent storage** - Claude config and shell history survive rebuilds
|
|
45
|
+
- **VS Code extensions** - Pre-configured for remote development
|
|
46
|
+
|
|
47
|
+
## 📋 Requirements
|
|
48
|
+
|
|
49
|
+
1. **DevPod** installed and configured
|
|
50
|
+
2. **VS Code** with Remote Development Extension Pack:
|
|
51
|
+
```bash
|
|
52
|
+
code --install-extension ms-vscode-remote.vscode-remote-extensionpack
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## 🔧 Usage
|
|
56
|
+
|
|
57
|
+
### Install in Existing Project
|
|
58
|
+
```bash
|
|
59
|
+
cd my-existing-project
|
|
60
|
+
npx claudepod-devcontainer
|
|
61
|
+
devpod up .
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### New Project Setup
|
|
65
|
+
```bash
|
|
66
|
+
mkdir new-project && cd new-project
|
|
67
|
+
npx claudepod-devcontainer
|
|
68
|
+
devpod up .
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### First-Time Container Setup
|
|
72
|
+
```bash
|
|
73
|
+
# Inside the container
|
|
74
|
+
./scripts/setup-env.sh # Optional environment setup
|
|
75
|
+
claude login # Authenticate with Claude
|
|
76
|
+
claude # Start development
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## 🎯 Quick Commands
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
# Claude Code (with MCP servers, no permission prompts)
|
|
83
|
+
claude # Start Claude
|
|
84
|
+
claude mcp list # List available MCP servers
|
|
85
|
+
|
|
86
|
+
# Git (with aliases and delta highlighting)
|
|
87
|
+
gs # git status
|
|
88
|
+
gd # git diff
|
|
89
|
+
gc -m "message" # git commit
|
|
90
|
+
gp # git push
|
|
91
|
+
gl # git log --oneline --graph
|
|
92
|
+
|
|
93
|
+
# Python development
|
|
94
|
+
uvx <package> # Run packages without installing
|
|
95
|
+
uv add <package> # Add dependencies
|
|
96
|
+
|
|
97
|
+
# Health check
|
|
98
|
+
./scripts/health-check.sh # Verify everything works
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## 🔑 Optional API Keys
|
|
102
|
+
|
|
103
|
+
Add these to your environment for enhanced features:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
# GitHub integration (recommended)
|
|
107
|
+
export GITHUB_PERSONAL_ACCESS_TOKEN="ghp_your_token"
|
|
108
|
+
|
|
109
|
+
# Web search capabilities
|
|
110
|
+
export TAVILY_API_KEY="tvly-your-key"
|
|
111
|
+
|
|
112
|
+
# Documentation tools
|
|
113
|
+
export REF_TOOLS_API_KEY="your-key"
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## 📁 What Gets Installed
|
|
117
|
+
|
|
118
|
+
```
|
|
119
|
+
your-project/
|
|
120
|
+
├── .devcontainer/
|
|
121
|
+
│ ├── devcontainer.json # Container configuration
|
|
122
|
+
│ ├── post-create.sh # Development tools setup
|
|
123
|
+
│ └── post-start.sh # MCP server installation
|
|
124
|
+
└── (your existing files remain unchanged)
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## 🏗️ Container Architecture
|
|
128
|
+
|
|
129
|
+
- **Base**: Ubuntu 22.04
|
|
130
|
+
- **User**: `node` (uid: 1000, gid: 1000)
|
|
131
|
+
- **Workspace**: `/workspace` (your project files)
|
|
132
|
+
- **Persistent Data**: Claude config, shell history, npm cache
|
|
133
|
+
- **Network**: Host network for optimal development server performance
|
|
134
|
+
|
|
135
|
+
## 🔧 Customization
|
|
136
|
+
|
|
137
|
+
After installation, you can modify `.devcontainer/devcontainer.json`:
|
|
138
|
+
|
|
139
|
+
```json
|
|
140
|
+
{
|
|
141
|
+
"containerEnv": {
|
|
142
|
+
"YOUR_API_KEY": "${localEnv:YOUR_API_KEY}"
|
|
143
|
+
},
|
|
144
|
+
"customizations": {
|
|
145
|
+
"vscode": {
|
|
146
|
+
"extensions": ["your.extension.id"]
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## 🩺 Troubleshooting
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
# Container not starting?
|
|
156
|
+
devpod delete <workspace> && devpod up .
|
|
157
|
+
|
|
158
|
+
# Claude not authenticated?
|
|
159
|
+
claude login
|
|
160
|
+
|
|
161
|
+
# MCP servers not working?
|
|
162
|
+
claude mcp list
|
|
163
|
+
claude mcp remove <server> && claude mcp add <server>
|
|
164
|
+
|
|
165
|
+
# Check container health
|
|
166
|
+
./scripts/health-check.sh
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
## 📚 Documentation
|
|
170
|
+
|
|
171
|
+
After installation, see:
|
|
172
|
+
- `CLAUDE.md` - Complete container documentation
|
|
173
|
+
- `examples/` - Configuration examples
|
|
174
|
+
- `scripts/` - Helper scripts and utilities
|
|
175
|
+
|
|
176
|
+
## 🤝 Team Usage
|
|
177
|
+
|
|
178
|
+
Each team member runs:
|
|
179
|
+
```bash
|
|
180
|
+
cd shared-project
|
|
181
|
+
npx claudepod-devcontainer # Installs .devcontainer
|
|
182
|
+
devpod up . # Starts identical environment
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
Perfect for ensuring consistent development environments across your team!
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
**Ready to supercharge your development with AI!** 🚀
|
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "claudepod",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "A fully configured DevPod environment optimized for Claude Code development with MCP servers and modern tools.",
|
|
5
|
+
"main": "setup.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"claudepod-setup": "./setup.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"test": "node test.js"
|
|
11
|
+
},
|
|
12
|
+
"keywords": [
|
|
13
|
+
"devcontainer",
|
|
14
|
+
"claude",
|
|
15
|
+
"claude-code",
|
|
16
|
+
"mcp",
|
|
17
|
+
"development-environment",
|
|
18
|
+
"devpod",
|
|
19
|
+
"vscode"
|
|
20
|
+
],
|
|
21
|
+
"author": "AnExiledDev",
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"files": [
|
|
24
|
+
".devcontainer/**/*",
|
|
25
|
+
"setup.js",
|
|
26
|
+
"README.md"
|
|
27
|
+
],
|
|
28
|
+
"engines": {
|
|
29
|
+
"node": ">=14.0.0"
|
|
30
|
+
},
|
|
31
|
+
"repository": {
|
|
32
|
+
"type": "git",
|
|
33
|
+
"url": "https://github.com/yourusername/claudepod-devcontainer.git"
|
|
34
|
+
},
|
|
35
|
+
"homepage": "https://github.com/yourusername/claudepod-devcontainer#readme",
|
|
36
|
+
"bugs": {
|
|
37
|
+
"url": "https://github.com/yourusername/claudepod-devcontainer/issues"
|
|
38
|
+
}
|
|
39
|
+
}
|
package/setup.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
|
|
6
|
+
function copyDirectory(src, dest) {
|
|
7
|
+
if (!fs.existsSync(dest)) {
|
|
8
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const entries = fs.readdirSync(src, { withFileTypes: true });
|
|
12
|
+
|
|
13
|
+
for (const entry of entries) {
|
|
14
|
+
const srcPath = path.join(src, entry.name);
|
|
15
|
+
const destPath = path.join(dest, entry.name);
|
|
16
|
+
|
|
17
|
+
if (entry.isDirectory()) {
|
|
18
|
+
copyDirectory(srcPath, destPath);
|
|
19
|
+
} else {
|
|
20
|
+
fs.copyFileSync(srcPath, destPath);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function main() {
|
|
26
|
+
const currentDir = process.cwd();
|
|
27
|
+
const packageDir = __dirname;
|
|
28
|
+
const devcontainerSrc = path.join(packageDir, '.devcontainer');
|
|
29
|
+
const devcontainerDest = path.join(currentDir, '.devcontainer');
|
|
30
|
+
|
|
31
|
+
console.log('🚀 Setting up ClaudePod DevContainer...');
|
|
32
|
+
|
|
33
|
+
// Check if .devcontainer already exists
|
|
34
|
+
if (fs.existsSync(devcontainerDest)) {
|
|
35
|
+
console.log('⚠️ .devcontainer directory already exists.');
|
|
36
|
+
console.log(' Remove it first or run in a different directory.');
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Check if source .devcontainer exists
|
|
41
|
+
if (!fs.existsSync(devcontainerSrc)) {
|
|
42
|
+
console.error('❌ Error: .devcontainer source directory not found in package.');
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
try {
|
|
47
|
+
// Copy .devcontainer directory
|
|
48
|
+
copyDirectory(devcontainerSrc, devcontainerDest);
|
|
49
|
+
|
|
50
|
+
console.log('✅ ClaudePod DevContainer configuration installed!');
|
|
51
|
+
console.log('');
|
|
52
|
+
console.log('🔧 Next steps:');
|
|
53
|
+
console.log(' 1. devpod up .');
|
|
54
|
+
console.log(' 2. devpod ssh <workspace-name> --ide vscode');
|
|
55
|
+
console.log(' 3. Start coding with Claude: claude');
|
|
56
|
+
console.log('');
|
|
57
|
+
console.log('📚 Features included:');
|
|
58
|
+
console.log(' • Claude Code CLI with optimized tool configuration');
|
|
59
|
+
console.log(' • MCP servers: Serena, DeepWiki, TaskMaster AI, Sequential Thinking');
|
|
60
|
+
console.log(' • Development tools: Node.js 20, Python 3.13, Git with delta');
|
|
61
|
+
console.log(' • Persistent configuration and shell history');
|
|
62
|
+
console.log('');
|
|
63
|
+
console.log('🔗 Documentation: See .devcontainer/README.md');
|
|
64
|
+
|
|
65
|
+
} catch (error) {
|
|
66
|
+
console.error('❌ Error copying .devcontainer:', error.message);
|
|
67
|
+
process.exit(1);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (require.main === module) {
|
|
72
|
+
main();
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
module.exports = { copyDirectory, main };
|