mirror of
https://github.com/nad4-su/setup_mac.git
synced 2026-08-12 15:03:25 +09:00
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:
co-authored by
Claude Opus 4.6
parent
443d65d912
commit
51cde642d9
+113
-59
@@ -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 (앱 제거 도구)"
|
||||
|
||||
Reference in New Issue
Block a user