DEV Community

김이더
김이더

Posted on

터미널이 IDE가 됐다

Claude Code를 처음 쓸 때 가장 불편했던 건 "터미널인데 터미널답지 않다"는 거였다.

설정은 JSON을 직접 열어야 하고, MCP 서버 관리는 커맨드라인에서 하나하나 잡아야 하고, 세션 구분은 안 되고, 훅을 걸려면 셸 스크립트를 짜야 했다. 기능은 강력한데 DX(Developer Experience)가 날것이었다.

3월 업데이트에서 이 날것 부분이 대폭 다듬어졌다. 하나하나는 작은 개선인데, 합치면 체감이 확 달라진다.

HTTP 훅 — 셸 스크립트 안 써도 된다

이전에는 훅을 걸려면 셸 커맨드를 짜야 했다.

{
  "hooks": {
    "TaskCompleted": {
      "command": "curl -X POST https://hooks.slack.com/... -d '{\"text\": \"done\"}'"
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

curl을 JSON 안에 넣으니까 이스케이핑 지옥이다. 작은따옴표, 큰따옴표가 뒤엉키고, 디버깅하려면 셸에서 직접 실행해봐야 한다.

HTTP 훅이 추가됐다. "type": "http"만 붙이면 URL에 JSON을 직접 쏜다.

{
  "hooks": {
    "TaskCompleted": {
      "type": "http",
      "url": "https://hooks.slack.com/services/T.../B.../xxx",
      "headers": {
        "Content-Type": "application/json"
      }
    },
    "PostToolUse": {
      "type": "http",
      "url": "https://my-server.com/hooks/post-tool",
      "headers": {
        "Authorization": "Bearer ${MY_API_KEY}"
      }
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

${MY_API_KEY} 같은 환경변수 삽입도 된다. 헤더에 인증 토큰을 넣을 때 하드코딩할 필요 없다.

Agent Teams와 합치면 재밌는 조합이 된다. TeammateIdle 훅으로 에이전트가 놀고 있을 때 대시보드에 알리고, TaskCompleted로 작업 완료 시 Slack에 노티를 보내는 식이다.

tool hook 타임아웃도 60초에서 10분으로 늘었다. 이전에는 빌드 스크립트가 1분 넘으면 훅이 죽었다.

SessionEnd 훅은 별도로 타임아웃을 설정할 수 있다.

export CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS=30000  # 30초
Enter fullscreen mode Exit fullscreen mode

기본 1.5초였는데, 세션 종료 시 요약을 API로 전송하거나 로그를 업로드하는 작업에는 턱없이 짧았다.

스킬 시스템 — 프로젝트별 가이드를 코드로

스킬은 .claude/skills/ 폴더에 SKILL.md를 넣어서 Claude Code에게 프로젝트 특화 지침을 주는 시스템이다. 이번 업데이트에서 세 가지가 바뀌었다.

첫째, ${CLAUDE_SKILL_DIR} 변수가 생겼다. 스킬이 자기 자신이 위치한 디렉토리를 참조할 수 있다.

<!-- .claude/skills/ue5-build/SKILL.md -->
---
name: ue5-build
description: "UE5 빌드 체크 스킬"
---

빌드 체크 실행:
\`\`\`bash
bash ${CLAUDE_SKILL_DIR}/check-build.sh
\`\`\`

설정 파일 참조:
\`\`\`bash
cat ${CLAUDE_SKILL_DIR}/build-config.yaml
\`\`\`
Enter fullscreen mode Exit fullscreen mode

스킬 폴더 안에 스크립트와 설정 파일을 같이 넣으면 하나의 "스킬 패키지"가 된다. 이전에는 스킬에서 외부 파일을 참조하려면 절대 경로를 하드코딩하거나 별도 설치 과정이 필요했다.

둘째, --add-dir로 추가한 디렉토리의 스킬이 자동 로드된다.

claude --add-dir /shared/team-skills
Enter fullscreen mode Exit fullscreen mode

팀 공용 스킬 디렉토리를 만들어두면 모든 팀원이 같은 스킬을 쓸 수 있다. 코드 리뷰 체크리스트 스킬, 배포 전 확인사항 스킬 같은 걸 공유하는 식이다.

셋째, 스킬 문자 예산이 컨텍스트 윈도우의 2%로 스케일링된다. 1M 토큰 컨텍스트를 쓰면 스킬 설명을 더 많이 넣을 수 있다. 작은 컨텍스트에서는 자동으로 줄어든다.

내장 스킬도 하나 추가됐다. /claude-api를 입력하면 Claude API와 Anthropic SDK로 앱을 만드는 가이드가 나온다.

MCP — 와일드카드 권한 + VS Code 관리 UI

MCP 서버 관리가 이전에는 좀 고통스러웠다. 도구 하나하나에 권한을 설정해야 하고, 서버 연결/해제는 설정 파일을 직접 수정하거나 커맨드를 쳐야 했다.

와일드카드 권한이 추가됐다.

{
  "permissions": {
    "allow": ["mcp__myserver__*"],
    "deny": ["mcp__untrusted__*"]
  }
}
Enter fullscreen mode Exit fullscreen mode

서버 단위로 모든 도구를 한번에 허용하거나 거부한다. mcp__github__*로 GitHub 서버의 모든 도구를 허용하고, mcp__untrusted__*로 신뢰하지 않는 서버는 전부 차단. 도구가 20개인 서버에 하나씩 권한을 붙이던 시절이 끝났다.

VS Code 확장에서 /mcp를 치면 네이티브 MCP 관리 다이얼로그가 뜬다.

# VS Code 채팅 패널에서:
/mcp
# → 서버 목록
# → 활성화/비활성화 토글
# → 재연결 버튼
# → OAuth 인증 관리
Enter fullscreen mode Exit fullscreen mode

터미널로 나가서 설정 파일을 열지 않아도 된다. OAuth 인증이 만료되면 같은 UI에서 재인증.

MCP가 바이너리 콘텐츠를 반환할 때의 처리도 바뀌었다. 이전에는 PDF나 오디오를 반환하면 raw base64 텍스트가 대화 컨텍스트에 들어갔다. 지금은 올바른 확장자로 디스크에 저장하고 경로만 보여준다.

OAuth 쪽에서는 oauth.authServerMetadataUrl 설정이 추가돼서 표준 OAuth discovery가 안 되는 서버에도 메타데이터 URL을 직접 지정할 수 있고, 자동 리다이렉트가 안 될 때 URL을 수동으로 붙여넣는 폴백도 생겼다.

/remote-control — 세션에 이름을 붙인다

Remote Control로 여러 프로젝트를 동시에 돌릴 때 가장 짜증나는 게 "어떤 세션이 어떤 프로젝트인지" 구분이 안 되는 거였다.

이제 이름을 붙일 수 있다.

# 터미널 1
cd ~/vibe/ether-blog
claude remote-control --name "Ether Blog"

# 터미널 2
cd ~/vibe/Gongnog
claude remote-control --name "Gongnog"

# 터미널 3
cd ~/vibe/lamdicebot
claude remote-control --name "LAMDice"
Enter fullscreen mode Exit fullscreen mode

claude.ai/code에서 세 개 세션이 "Ether Blog", "Gongnog", "LAMDice"로 보인다. 세션 안에서도 /remote-control My Project로 바꿀 수 있다.

브릿지 세션 재연결도 개선돼서 노트북을 닫았다 열면 수초 내에 붙는다. 이전에는 최대 10분 기다려야 했다.

VS Code 확장 — 네이티브가 왔다

공식 네이티브 VS Code 확장이 출시됐다.

activity bar에 스파크 아이콘이 생기고, 거기서 모든 Claude Code 세션을 볼 수 있다. 세션 이름 변경, 삭제도 된다. Plan을 전체 마크다운 문서로 열어서 코멘트로 피드백을 줄 수 있고, compaction된 대화는 접기 가능한 "Compacted chat" 카드로 표시된다.

URI 핸들러가 추가돼서 외부 스크립트에서 Claude Code 탭을 프로그래밍 방식으로 열 수 있다.

code --open-url "vscode://anthropic.claude-code/open?prompt=fix%20the%20failing%20test"
code --open-url "vscode://anthropic.claude-code/open?session=abc123"
Enter fullscreen mode Exit fullscreen mode

CI에서 빌드 실패 시 "이 테스트 수정해줘" 프롬프트가 미리 채워진 Claude Code 탭을 자동으로 여는 식의 자동화가 가능하다.

입력 보더에 effort 레벨이 표시되고, disableBypassPermissionsMode가 반영돼서 관리자가 bypass permissions를 비활성화하면 피커에서 아예 숨겨진다.

나머지 DX 개선들

큰 기능은 아니지만 하루에 100번 쓰는 커맨드들이 편해졌다.

/plan fix the auth bug로 plan 모드 진입과 설명을 한 줄에. 이전에는 두 단계였다. plan 모드에서 피드백을 줄 때 Shift+Enter로 멀티라인 입력도 된다.

/copy에서 w 키를 누르면 클립보드를 거치지 않고 파일에 직접 쓴다. SSH 환경에서 클립보드가 안 되는 상황에 딱이다.

CLAUDE.md에 HTML 주석(<!-- -->)을 쓰면 자동 주입 시 Claude에게 숨겨진다. Read 도구로 직접 열면 보인다. 내부 메모를 남기되 토큰은 안 쓰는 트릭.

<!-- 이 주석은 Claude에게 자동 주입 시 안 보인다 -->
<!-- TODO: 다음 스프린트에서 인증 로직 리팩토링 -->

## 코딩 컨벤션
TypeScript strict mode. 함수형 컴포넌트 + hooks.
Enter fullscreen mode Exit fullscreen mode

includeGitInstructions: false로 내장 git 워크플로우 지침을 끌 수 있다. 커스텀 git 워크플로우를 쓰는데 Claude Code의 기본 지침이 자꾸 충돌하는 경우에 유용하다.

bash auto-approval 목록에 lsof, pgrep, fd, fdfind, seq, printf 등 17개 커맨드가 추가돼서 읽기 전용 작업의 권한 프롬프트가 줄었다. fd --type f ".ts" 같은 파일 검색을 할 때마다 "Allow?" 팝업이 뜨던 게 사라졌다.

터미널의 진화

이번 업데이트를 관통하는 하나의 흐름이 있다.

터미널에서 할 수 있는 일이 IDE 수준으로 올라왔다. HTTP 훅으로 외부 시스템과 연결하고, 스킬 패키지로 프로젝트별 지식을 관리하고, MCP를 UI로 다루고, 세션에 이름을 붙여서 멀티 프로젝트를 운영하고, URI 핸들러로 자동화까지 건다.

이게 가능해진 이유는 Claude Code가 단순한 CLI 도구에서 플랫폼으로 진화하고 있기 때문이다. 훅, 스킬, 에이전트, 플러그인 — 이 네 가지 확장 포인트를 중심으로 생태계가 만들어지고 있다.

"좋은 도구는 쓸 때 도구라는 걸 잊게 만든다. 터미널이 IDE가 되는 건 그 다음이다."

Top comments (0)