Add VSCode, Claude Code CLI auto-install and fix bugs

- Add VSCode (brew cask), Node.js, Claude Code CLI (npm) installation
- Add VSCode Claude extension auto-install with code CLI fallback
- Fix save_configs.sh missing RECTANGLE_SETTINGS_DIR variable
- Fix Rectangle config: support both plist and JSON (RectangleConfig.json)
- Fix ZSH plugin paths for Intel Mac using $(brew --prefix)
- Fix iTerm2 Dynamic Profile JSON assembly (safe wrapping)
- Fix GUID extraction regex for flexible whitespace
- Fix set -e compatibility for plutil failure handling
- Add mkdir -p for Stats settings dir in save_configs.sh
- Add vim swap file patterns to .gitignore
- Update README.md with Claude Code docs, checklist, troubleshooting
- Simplify iTerm2 launch logic

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
csbae-macbook
2026-03-04 13:55:55 +09:00
co-authored by Claude Opus 4.6
parent 443d65d912
commit 51cde642d9
4 changed files with 168 additions and 74 deletions
+113 -59
View File
@@ -3,7 +3,7 @@
# =============================================================================
# Mac 초기 개발 환경 설정 스크립트
# 작성자: NAD4
# 설명: Homebrew, iTerm2, Oh My Zsh, 필수 앱 자동 설치 및 설정
# 설명: Homebrew, iTerm2, Oh My Zsh, Claude Code, VSCode, 필수 앱 자동 설치 및 설정
# =============================================================================
set -e # 에러 발생 시 스크립트 중단
@@ -16,6 +16,7 @@ RECTANGLE_SETTINGS_DIR="$SCRIPT_DIR/rectangle-settings"
ITERM_PROFILE_FILE="$ITERM_SETTINGS_DIR/profile.json"
STATS_PLIST_FILE="$STATS_SETTINGS_DIR/Stats.plist"
RECTANGLE_PLIST_FILE="$RECTANGLE_SETTINGS_DIR/com.knollsoft.Rectangle.plist"
RECTANGLE_JSON_FILE="$RECTANGLE_SETTINGS_DIR/RectangleConfig.json"
echo "🚀 Mac 초기 개발 환경 설정을 시작합니다..."
echo "📂 스크립트 위치: $SCRIPT_DIR"
@@ -122,6 +123,7 @@ echo "🖥️ GUI 애플리케이션 설치 중..."
# 설치할 앱 목록
APPS=(
"tunnelblick"
"visual-studio-code"
"cursor"
"notion"
"discord"
@@ -146,7 +148,59 @@ done
echo ""
# =============================================================================
# 7. .zshrc
# 7. Node.js & Claude Code CLI
# =============================================================================
echo "🤖 Node.js & Claude Code 설치 중..."
# Node.js
if brew list node &> /dev/null; then
echo "✅ Node.js 이미 설치됨"
else
brew install node
echo "✅ Node.js 설치 완료"
fi
# Claude Code CLI
if command -v claude &> /dev/null; then
echo "✅ Claude Code CLI 이미 설치됨"
else
npm install -g @anthropic-ai/claude-code
echo "✅ Claude Code CLI 설치 완료"
fi
echo ""
# =============================================================================
# 8. VSCode 확장 설치
# =============================================================================
echo "🔌 VSCode 확장 설치 중..."
# VSCode code CLI 경로 확인
CODE_CMD=""
if command -v code &> /dev/null; then
CODE_CMD="code"
elif [ -f "/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code" ]; then
CODE_CMD="/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code"
fi
if [ -n "$CODE_CMD" ]; then
# Claude for VSCode 확장 설치
if "$CODE_CMD" --install-extension anthropic.claude-code 2>/dev/null; then
echo "✅ Claude for VSCode 확장 설치 완료"
else
echo "⚠️ Claude 확장 자동 설치 실패"
echo " VSCode에서 수동 설치: Extensions (⌘⇧X) → 'Claude' 검색"
fi
else
echo "⚠️ VSCode code 명령을 찾을 수 없습니다."
echo " VSCode 실행 후: ⌘⇧P → 'Shell Command: Install code command in PATH'"
echo " 이후 Extensions에서 'Claude' 확장을 수동 설치해주세요."
fi
echo ""
# =============================================================================
# 9. .zshrc 설정
# =============================================================================
echo "🎨 ZSH 설정 파일 구성 중..."
@@ -231,14 +285,16 @@ build_prompt() {
EOF
# ZSH 플러그인 source 추가 (중복 체크)
SYNTAX_LINE='source /opt/homebrew/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh'
if ! grep -qxF "$SYNTAX_LINE" ~/.zshrc; then
# ZSH 플러그인 source 추가 (중복 체크, Apple Silicon/Intel 자동 감지)
BREW_PREFIX="$(brew --prefix)"
SYNTAX_LINE="source $BREW_PREFIX/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh"
if ! grep -q "zsh-syntax-highlighting.zsh" ~/.zshrc; then
echo "$SYNTAX_LINE" >> ~/.zshrc
fi
SUGGEST_LINE='source /opt/homebrew/share/zsh-autosuggestions/zsh-autosuggestions.zsh'
if ! grep -qxF "$SUGGEST_LINE" ~/.zshrc; then
SUGGEST_LINE="source $BREW_PREFIX/share/zsh-autosuggestions/zsh-autosuggestions.zsh"
if ! grep -q "zsh-autosuggestions.zsh" ~/.zshrc; then
echo "$SUGGEST_LINE" >> ~/.zshrc
fi
@@ -246,7 +302,7 @@ echo "✅ .zshrc 설정 완료"
echo ""
# =============================================================================
# 8. iTerm2 프로파일 설정
# 10. iTerm2 프로파일 설정
# =============================================================================
echo "⚙️ iTerm2 프로파일 설정 중..."
@@ -265,27 +321,18 @@ mkdir -p "$ITERM_DYNAMIC_DIR"
if [ -f "$ITERM_PROFILE_FILE" ]; then
echo "✅ profile.json 발견"
# DynamicProfile 형식으로 변환하여 복사
cat > "$ITERM_DYNAMIC_DIR/NAD4Profile.json" << 'DYNAMIC_WRAPPER'
{
"Profiles": [
DYNAMIC_WRAPPER
# 기존 프로파일 내용 추가 (마지막 } 제거)
cat "$ITERM_PROFILE_FILE" | sed '$ d' >> "$ITERM_DYNAMIC_DIR/NAD4Profile.json"
# 래퍼 종료
cat >> "$ITERM_DYNAMIC_DIR/NAD4Profile.json" << 'DYNAMIC_WRAPPER'
}
]
}
DYNAMIC_WRAPPER
# DynamicProfile 형식으로 변환하여 복사 (profile.json을 Profiles 배열로 래핑)
{
echo '{"Profiles": ['
cat "$ITERM_PROFILE_FILE"
echo ']}'
} > "$ITERM_DYNAMIC_DIR/NAD4Profile.json"
echo "✅ iTerm2 Dynamic Profile 생성 완료"
echo " 위치: $ITERM_DYNAMIC_DIR/NAD4Profile.json"
# profile.json에서 GUID 추출
PROFILE_GUID=$(grep -o '"Guid" : "[^"]*"' "$ITERM_PROFILE_FILE" | sed 's/"Guid" : "\(.*\)"/\1/')
# profile.json에서 GUID 추출 (공백 유무 무관)
PROFILE_GUID=$(grep -o '"Guid"[[:space:]]*:[[:space:]]*"[^"]*"' "$ITERM_PROFILE_FILE" | head -1 | sed 's/.*:.*"\([^"]*\)"/\1/')
if [ -n "$PROFILE_GUID" ]; then
echo "✅ 프로파일 GUID: $PROFILE_GUID"
@@ -302,18 +349,11 @@ else
echo "⚠️ $ITERM_PROFILE_FILE 파일을 찾을 수 없습니다."
fi
# iTerm2 재시작 (번들 ID 사용)
# iTerm2 재시작
echo "🔄 iTerm2 시작 중..."
sleep 1
# iTerm2 실행 (여러 방법 시도)
if [ -d "/Applications/iTerm.app" ]; then
open -a /Applications/iTerm.app
if open -a iTerm 2>/dev/null; then
echo "✅ iTerm2 시작 완료"
elif command -v open &> /dev/null; then
open -b com.googlecode.iterm2 2>/dev/null || \
open /Applications/iTerm.app 2>/dev/null || \
echo "⚠️ iTerm2를 수동으로 실행해주세요"
else
echo "⚠️ iTerm2를 수동으로 실행해주세요"
fi
@@ -321,7 +361,7 @@ fi
echo ""
# =============================================================================
# 9. Stats 앱 설정
# 11. Stats 앱 설정
# =============================================================================
echo "📊 Stats 앱 설정 중..."
@@ -373,7 +413,7 @@ fi
echo ""
# =============================================================================
# 10. Rectangle 앱 설정
# 12. Rectangle 앱 설정
# =============================================================================
echo "📐 Rectangle 앱 설정 중..."
@@ -388,43 +428,47 @@ if [ -d "/Applications/Rectangle.app" ]; then
sleep 2
fi
# Rectangle 설정 파일 확인
if [ -f "$RECTANGLE_PLIST_FILE" ]; then
echo "✅ Rectangle.plist 발견"
# Rectangle 설정 파일 백업
RECTANGLE_PREF_FILE="$HOME/Library/Preferences/com.knollsoft.Rectangle.plist"
# Rectangle 설정 파일 확인 (plist 우선, JSON 폴백)
RECTANGLE_PREF_FILE="$HOME/Library/Preferences/com.knollsoft.Rectangle.plist"
if [ -f "$RECTANGLE_PLIST_FILE" ] || [ -f "$RECTANGLE_JSON_FILE" ]; then
# 기존 설정 백업
if [ -f "$RECTANGLE_PREF_FILE" ]; then
RECTANGLE_BACKUP="$RECTANGLE_PREF_FILE.backup_$(date +%Y%m%d_%H%M%S)"
cp "$RECTANGLE_PREF_FILE" "$RECTANGLE_BACKUP"
echo "✅ 기존 Rectangle 설정 백업: $RECTANGLE_BACKUP"
fi
# 새 설정 적용
cp "$RECTANGLE_PLIST_FILE" "$RECTANGLE_PREF_FILE"
echo "✅ Rectangle 설정 적용 완료"
# 설정 파일 권한 설정
chmod 644 "$RECTANGLE_PREF_FILE"
if [ -f "$RECTANGLE_PLIST_FILE" ]; then
# plist 파일이 있으면 직접 복사
echo "✅ Rectangle.plist 발견"
cp "$RECTANGLE_PLIST_FILE" "$RECTANGLE_PREF_FILE"
chmod 644 "$RECTANGLE_PREF_FILE"
echo "✅ Rectangle 설정 적용 완료 (plist)"
elif [ -f "$RECTANGLE_JSON_FILE" ]; then
# JSON 파일만 있으면 plutil로 변환 후 적용
echo "✅ RectangleConfig.json 발견"
if plutil -convert binary1 -o "$RECTANGLE_PREF_FILE" "$RECTANGLE_JSON_FILE" 2>/dev/null; then
chmod 644 "$RECTANGLE_PREF_FILE"
echo "✅ Rectangle 설정 적용 완료 (JSON → plist 변환)"
else
echo "⚠️ JSON 변환 실패. Rectangle을 실행 후 수동으로 설정을 import 해주세요."
echo " Rectangle > Preferences > Import (${RECTANGLE_JSON_FILE})"
fi
fi
# Rectangle 재시작
echo "🔄 Rectangle 재시작 중..."
sleep 1
open -a Rectangle
echo "✅ Rectangle 시작 완료"
else
echo "⚠️ $RECTANGLE_PLIST_FILE 파일을 찾을 수 없습니다."
echo "⚠️ Rectangle 설정 파일을 찾을 수 없습니다."
echo " Rectangle을 실행하고 설정을 구성해주세요."
echo ""
echo " Rectangle 기본 설정 생성 중..."
# Rectangle 실행 (초기 설정 생성)
open -a Rectangle
sleep 3
echo "✅ Rectangle 초기 실행 완료"
echo " Preferences에서 키보드 단축키를 설정하세요."
fi
else
@@ -477,13 +521,23 @@ echo " ⌃⌥→ : 오른쪽 절반 ⌃⌥← : 왼쪽 절반"
echo " ⌃⌥↑ : 최대화 ⌃⌥↓ : 하단 정렬"
echo " ⌃⌥F : 전체 화면 ⌃⌥C : 가운데"
echo ""
echo " 7️⃣ AppCleaner 사용법:"
echo " 7️⃣ Claude Code 확인:"
echo " claude --version # → 버전 확인"
echo " claude # → Claude Code 실행"
echo " ※ 최초 실행 시 API 키 설정 필요"
echo ""
echo " 8️⃣ VSCode Claude 확장 확인:"
echo " VSCode 실행 → Extensions (⌘⇧X) → 'Claude' 설치 확인"
echo ""
echo " 9️⃣ AppCleaner 사용법:"
echo " - Applications 폴더에서 AppCleaner 실행"
echo " - 앱 삭제 시 관련 파일까지 자동 정리"
echo " - 추천: Dock에 추가하여 사용"
echo ""
echo "💡 설치된 앱 목록:"
echo " ✅ iTerm2 (터미널)"
echo " ✅ VSCode + Claude 확장"
echo " ✅ Claude Code CLI"
echo " ✅ Stats (시스템 모니터)"
echo " ✅ Rectangle (윈도우 관리)"
echo " ✅ AppCleaner (앱 제거 도구)"