Claude Code로 개발하기
Claude Code 기능 개요·메모리·.claude 디렉토리(CLAUDE.md/AGENTS.md/imports/auto-memory/settings/hooks)를 Neul 저장소 기준으로 정리한 온보딩 가이드
이 저장소는 Claude Code 로 개발하는 것을 1급 워크플로우로 삼습니다. 이 페이지는
Claude Code 공식 문서의 기능 개요·메모리·.claude 디렉토리 세 글을
요약하고, Neul 저장소가 실제로 그 기능들을 어떻게 쓰는지를 함께 설명합니다.
출처:
Claude Code 확장하기(features-overview),
Claude가 프로젝트를 기억하는 방법(memory),
.claude 디렉토리 탐색(claude-directory).
공식 문서는 일반론입니다. 이 페이지의 "Neul 에서는" 블록이 이 저장소에 맞춘 실제 적용입니다. 새로 합류했다면 이 부분만 읽어도 바로 작업을 시작할 수 있습니다.
핵심 개념: 내장 도구 + 확장 계층
Claude Code 는 코드를 추론하는 모델에 내장 도구(파일 읽기/쓰기, 검색, 실행, 웹 접근)를 결합합니다. 내장 도구가 대부분의 코딩 작업을 처리하고, 그 위에 확장 계층을 얹어 "Claude 가 알아야 할 것"을 커스터마이즈하거나 외부 서비스에 연결하거나 워크플로우를 자동화합니다.
기능 개요 (features-overview 요약)
확장은 에이전트 루프의 서로 다른 지점에 연결됩니다.
| 기능 | 하는 일 | 언제 쓰나 | 컨텍스트 비용 |
|---|---|---|---|
| CLAUDE.md | 모든 세션에 로드되는 지속 컨텍스트 | 프로젝트 규칙, "항상 X" 규칙 | 매 요청(전체 로드) |
| Skills | 재사용 지식 + 호출 가능한 워크플로우(/name) | 참조 문서, 반복 작업 | 낮음(설명만 상시, 본문은 사용 시) |
| Subagents | 격리된 컨텍스트에서 실행 후 요약만 반환 | 많은 파일 읽기, 병렬·특화 작업 | 주 세션과 격리 |
| Agent teams | 여러 독립 세션이 서로 메시징하며 협업 | 경쟁 가설 디버깅, 병렬 기능 개발 | 높음(세션마다 별도 인스턴스) |
| Code intelligence(LSP) | 기호 네비게이션 + 실시간 타입 오류 | 타입 언어, grep 이 느린 대규모 코드 | 낮음(파일 통독 대체) |
| MCP | 외부 서비스/도구 연결 | DB 쿼리, Slack 게시, 브라우저 제어 | 도구 이름만 상시, 스키마는 사용 시 |
| Hooks | 라이프사이클 이벤트에서 스크립트/요청 실행 | "매번 자동으로" 실행할 작업 | 0(출력 반환 시에만 발생) |
| Plugins | 위 기능들을 묶어 배포하는 패키징 계층 | 여러 저장소에서 동일 설정 재사용 | 번들 구성에 따름 |
유사 기능 구별 (요약)
- Skill vs Subagent: skill 은 어느 컨텍스트로든 로드되는 재사용 콘텐츠, subagent 는 주 대화와 분리되어 도는 격리 워커(요약만 반환). 컨텍스트 격리가 필요하거나 윈도우가 찰 때 subagent.
- CLAUDE.md vs Skill: 항상 알아야 할 규칙 → CLAUDE.md. 가끔 필요한 참조/워크플로우 → skill. 경험칙: CLAUDE.md 는 200줄 이하로 유지.
- CLAUDE.md vs Rules vs Skill:
.claude/rules/는pathsfrontmatter 로 특정 파일에만 로드되어 컨텍스트를 절약. - Subagent vs Agent team: subagent 는 주 에이전트에 보고, agent team 은 팀원끼리 직접 메시징하며 자체 조정(토큰 비용 높음).
- MCP vs Skill: MCP 는 "연결(능력)", skill 은 "그 도구를 잘 쓰는 법(지식)". 함께 쓰면 강력.
- Hook vs Skill: hook 은 이벤트에서 결정론적으로 항상 실행, skill 은 Claude 가 해석해 적용. 가드레일은 hook 으로(프롬프트 지침은 요청일 뿐 강제가 아님).
시간이 지남에 따라 설정 쌓기
미리 다 만들 필요 없습니다. 트리거가 보이면 추가합니다.
| 트리거 | 추가 |
|---|---|
| Claude 가 같은 규칙/명령을 두 번 틀림 | CLAUDE.md 에 한 줄 추가 |
| 같은 프롬프트를 계속 입력 | 사용자 호출 skill(/name)로 저장 |
| 같은 플레이북을 세 번째로 붙여넣음 | skill 로 캡처 |
| 안 보이는 시스템의 데이터를 계속 복사 | MCP 서버로 연결 |
| 정의/사용처 찾으려 파일을 많이 읽음 | code intelligence(LSP) 플러그인 설치 |
| 부수효과 출력이 대화를 채움 | subagent 로 라우팅 |
| 요청 없이도 매번 실행되길 원함 | hook 작성 |
| 두 번째 저장소가 같은 설정 필요 | plugin 으로 패키징 |
메모리 (memory 요약)
Claude Code 세션은 매번 새 컨텍스트로 시작합니다. 세션 간 지식 전달은 두 가지로 합니다.
| CLAUDE.md 파일 | 자동 메모리(auto-memory) | |
|---|---|---|
| 작성자 | 사람 | Claude |
| 내용 | 지침·규칙 | 학습·패턴 |
| 범위 | 프로젝트/사용자/조직 | 저장소당(워크트리 공유) |
| 로드 | 모든 세션 | 모든 세션(MEMORY.md 앞 200줄 또는 25KB) |
CLAUDE.md 계층
가장 넓은 범위부터 좁은 범위 순으로 로드되며 서로를 덮어쓰지 않고 누적됩니다(더 구체적인 지침이 보통 우선).
| 범위 | 위치 | 공유 대상 |
|---|---|---|
| 관리 정책 | OS 별 시스템 경로 | 조직 전체(개별 제외 불가) |
| 사용자 | ~/.claude/CLAUDE.md | 본인(모든 프로젝트) |
| 프로젝트 | ./CLAUDE.md 또는 ./.claude/CLAUDE.md | 소스 컨트롤로 팀 공유 |
| 로컬 | ./CLAUDE.local.md(.gitignore) | 본인(현재 프로젝트) |
작업 디렉토리 위쪽의 CLAUDE.md 는 시작 시 전부 로드되고, 하위 디렉토리의 파일은 그 디렉토리의 파일을 만질 때 로드됩니다.
@path import
CLAUDE.md 는 @경로 구문으로 다른 파일을 가져옵니다. 가져온 파일은 펼쳐져 시작
컨텍스트에 함께 로드되며, 최대 4 홉까지 재귀 import 됩니다. 상대 경로는 작업
디렉토리가 아니라 import 를 포함한 파일 기준입니다.
AGENTS.md 와의 관계 — Neul 의 핵심 패턴
Neul 에서는
Claude Code 는 AGENTS.md 를 직접 읽지 않고 CLAUDE.md 를 읽습니다. 그래서 이
저장소의 루트 CLAUDE.md 는 단 한 줄, 다음으로 되어 있습니다:
@AGENTS.md즉 모든 아키텍처/규칙의 원본은 AGENTS.md 이고, Claude Code 는 @AGENTS.md
import 를 통해 그 내용을 시작 시 로드합니다. 다른 코딩 에이전트(AGENTS.md 규약을
쓰는 도구)와 중복 없이 동일한 지침을 공유하기 위한 구성입니다. Claude 전용
지침이 필요하면 @AGENTS.md 아래에 덧붙이면 됩니다.
AGENTS.md 에는 이 저장소의 v5 아키텍처, 핵심 결정/주의(자체 인증, AI 라우터,
Workers DB 요청별 생성, day-key UTC, 모바일 네트워킹), 로컬 실행 명령, 작업 규칙,
그리고 테스트 정책이 정리되어 있습니다. 이 문서 사이트의 다른 페이지들도
AGENTS.md 를 원본으로 삼아 작성되었습니다.
자동 메모리 (auto-memory)
Claude 는 작업하며 빌드 명령·디버깅 인사이트·선호도 등을 스스로 노트로 남깁니다. 저장 위치는 저장소별로:
~/.claude/projects/<project>/memory/
├─ MEMORY.md # 간결한 인덱스 (모든 세션에 앞 200줄/25KB 로드)
└─ *.md # 주제별 상세 노트 (필요할 때만 읽음)<project> 경로는 git 저장소에서 파생되므로 같은 저장소의 모든 워크트리·하위
디렉토리가 하나의 메모리 디렉토리를 공유합니다(머신 로컬, 클라우드 미공유).
/memory 명령으로 로드된 CLAUDE.md/규칙 파일을 확인하고 자동 메모리를 켜고 끌 수
있습니다.
Neul 에서는
이 저장소에는 이미 자동 메모리 인덱스가 쌓여 있습니다(예: "인증은 Supabase 가
아니라 자체 JWT", "v5 스택 버전별 주의", "보고된 버그는 항상 회귀 테스트로",
"배포 맵/ wrangler 함정"). 새 세션에서 Claude 가 이를 자동으로 참고하므로, 같은
맥락을 매번 다시 설명할 필요가 줄어듭니다. 잘못 기억된 내용이 보이면 /memory 로
열어 직접 편집/삭제하세요.
또한 같은 학습을 벤더 중립(도구 무관)으로 커밋해 둔 .agents/memory/ 가 있습니다
— Claude 의 머신 로컬 auto-memory 와 달리 저장소에 들어가 어떤 에이전트든 읽습니다.
.agents/memory/MEMORY.md 가 인덱스이며 AGENTS.md 의 "메모리" 섹션이 여기를 가리킵니다.
.claude 디렉토리 구조 (claude-directory 요약)
Claude Code 는 두 곳의 .claude 디렉토리를 읽습니다 — 프로젝트의 ./.claude/(팀과
공유, 커밋) 와 홈의 ~/.claude/(개인 전역, 머신 로컬). 같은 종류의 파일이 두
곳에 있을 수 있고, 보통 사용자(전역) → 프로젝트 순으로 로드돼 더 구체적인
프로젝트 설정이 뒤에 옵니다.
프로젝트 ./.claude/ (커밋 — 팀 공유)
| 항목 | 역할 | 비고 |
|---|---|---|
CLAUDE.md | 모든 세션 로드되는 프로젝트 지침 | 루트 ./CLAUDE.md 도 동일 |
settings.json | 권한·hooks·구성 | 커밋(팀 공유) |
settings.local.json | 개인 오버라이드 | gitignore |
rules/ | 주제별 지침(paths frontmatter 로 특정 파일에만 로드) | 컨텍스트 절약 |
skills/<name>/SKILL.md | /name 으로 부르는 재사용 워크플로우(+부속 파일 번들) | commands 의 상위호환 |
commands/*.md | 단일 파일 슬래시 명령 | skills 로 대체 권장 |
agents/*.md | 격리 컨텍스트 subagent 정의 | 코드리뷰어 등 |
workflows/ | 여러 subagent 를 오케스트레이션하는 동적 워크플로우 스크립트 | |
agent-memory/<agent>/MEMORY.md | subagent 영속 메모리(메인 세션 auto-memory 와 분리) | |
(루트) .mcp.json | 프로젝트 범위 MCP 서버 | 커밋 |
홈 ~/.claude/ (머신 로컬 — 모든 프로젝트)
CLAUDE.md(개인 전역 선호), settings.json(전역 기본 설정), keybindings.json,
themes/, rules/·skills/·commands/·agents/·workflows/(전역판),
output-styles/(시스템 프롬프트 변형), 그리고 자동 메모리가 사는
projects/<project>/memory/. .claude.json 은 앱 상태/UI 선호도.
Neul 에서는
이 저장소의 ./.claude/ 에는 커밋된 파일들이 있습니다:
.claude/
├─ settings.json # Stop 훅 등록 (committed)
└─ hooks/
├─ enforce-tests.mjs # 테스트 강제 Stop 훅
└─ enforce-artifacts.mjs # Storybook/docs 동기화 강제 Stop 훅
# .claude/settings.local.json 은 .gitignore (개인 오버라이드)두 Stop 훅이 작업 마무리 시점에 산출물 동기화를 강제합니다(모두 fail-open):
enforce-tests.mjs— 구현 파일(.ts/.tsx)을 고치면서 회귀 테스트를 같은 변경에 안 넣으면 정지(테스트 정책). 우회[skip-tests].enforce-artifacts.mjs— UI 컴포넌트(apps/web/src/components/**.tsx)를 고치면서 스토리(*.stories.tsx)를 안 갱신하면 정지(우회[skip-storybook]); 문서 원본 표면(AGENTS.md·wrangler·DEPLOY.md·deploy 워크플로우)을 고치면서apps/docs/content를 안 갱신하면 정지(우회[skip-docs]).
.claude/ 는 eslint 에서 제외돼 있어 훅 스크립트(Node) 가 lint 를 깨지 않습니다.
Neul 에서 Claude Code 쓰기 — 실전 체크리스트
SDK/프레임워크 코드를 쓰기 전, 항상 node_modules 의 실제 .d.ts/README 를
확인하세요. 이 저장소의 패키지(hono, drizzle-orm, @cloudflare/vite-plugin, jose,
fetch-event-source, fumadocs 등)는 학습 데이터보다 새로울 수 있습니다. 이 문서
사이트도 설치된 fumadocs 16.x 타입을 확인하고 작성했습니다.
- 규칙의 원본은
AGENTS.md. 반복되는 실수나 새 결정은 채팅 일회성 수정이 아니라AGENTS.md편집으로 남깁니다(루트CLAUDE.md가@AGENTS.md로 가져옵니다). - 새 API 라우트는 메서드 체이닝으로. 그래야 Hono RPC 타입이 web 으로 추론됩니다.
- 워크스페이스 경계를 지키세요.
.ts/.tsx변경은 해당 워크스페이스 안에서. 백엔드 응답 shape 은 프론트 화면 호환을 위해 보존합니다. - 테스트는 정책입니다. 버그를 고치면 회귀 테스트를 같은 커밋에 포함합니다(unit /
integration
TZ=UTC/ e2e 중 버그 성격에 맞는 레벨 — 테스트 참고). - DB/네이티브 명령은 신중히.
pnpm db:*는 로컬 Postgres 상태를 바꾸고, cap 명령은 네이티브 프로젝트를 건드립니다. 실행 전 영향을 확인하세요. - 컨텍스트 비용을 의식하세요. 항상 필요한 규칙만
AGENTS.md/CLAUDE.md 에, 가끔 필요한 참조는 skill 로, "매번 자동" 보장이 필요하면 hook 으로.
더 보기
- 기능별 상세: features-overview
- 메모리 상세(계층·import·auto-memory·문제 해결): memory
.claude디렉토리 전체 구성: claude-directory- 이 저장소 규칙 원본: 루트
AGENTS.md