AGENTS.md 하나로 Cursor·Claude Code·Codex 규칙을 맞출 수 있을까? 심링크가 필요한 경우

Claude Code(v2.1.277+)·Codex·Cursor는 모두 AGENTS.md를 직접 읽습니다. CLAUDE.md 심링크나 @AGENTS.md import가 필요한 경우와 Windows·git 주의점을 공식 문서와 실행 결과로 정리했습니다.

네, 2026-09-30 기준 Claude Code(v2.1.277 이상)·Codex·Cursor는 모두 저장소 루트의 AGENTS.md를 직접 읽습니다. 단 Claude Code는 CLAUDE.md나 CLAUDE.local.md가 하나라도 있으면 기본값에서 AGENTS.md를 건너뛰므로, 그때만 CLAUDE.md를 심링크나 @AGENTS.md import로 이으면 됩니다. Windows 사용자가 있는 저장소라면 심링크 대신 import가 안전합니다.

처음에는 CLAUDE.md, AGENTS.md, .cursor/rules/*.mdc를 전부 심링크로 묶을 생각이었습니다. 문서를 다시 읽고 직접 돌려 보니 필요한 링크는 그보다 적었습니다. 이 글은 그 확인 기록입니다. 스킬 파일(SKILL.md)을 여러 도구에서 같이 쓰는 문제는 SKILL.md 하나로 Codex·Claude·Antigravity·Grok에서 모두 쓸 수 있을까?에서 따로 다뤘습니다.

기준일. 도구별 동작은 2026-09-30(KST) 기준 각 공식 문서와 소스 코드에서 확인했습니다. 문서에 없는 내용은 출처(포럼, GitHub PR)를 따로 밝혔습니다. 링크는 글 끝 출처에 모았습니다.

도구마다 어떤 규칙 파일을 읽나?

Claude Code: CLAUDE.md, 그리고 이제는 AGENTS.md도

  • 프로젝트 규칙은 ./CLAUDE.md 또는 ./.claude/CLAUDE.md에 둡니다. 작업 디렉터리와 그 위 디렉터리의 파일을 모두 이어 붙여 읽습니다.
  • v2.1.277부터는 AGENTS.md를 직접 읽습니다. 다만 기본값에서는 작업 디렉터리나 그 위에 CLAUDE.md·.claude/CLAUDE.md·CLAUDE.local.md가 하나도 없을 때만 AGENTS.md를 읽습니다. 둘 다 있으면 CLAUDE.md만 읽습니다. ~/.claude/CLAUDE.md와 .claude/rules/는 이 판정에 들어가지 않습니다.
  • 개인용 CLAUDE.local.md를 하나 만들기만 해도 AGENTS.md를 읽지 않게 됩니다. 둘 다 읽게 하려면 /config에서 Project instructions를 claude-md-and-agents-md로 바꿉니다.
  • 문서가 AGENTS.md를 못 읽는다고 적어 둔 세션도 있습니다. v2.1.277 이전 버전, 내장 agents-md 플러그인을 끈 경우, v2.1.276 이하에서 업그레이드한 직후 첫 세션(일부), 그리고 v2.1.281 이전의 Amazon Bedrock·텔레메트리를 끈 일부 세션입니다.
  • 설정으로 읽힌 AGENTS.md는 CLAUDE.md와 다르게 동작하는 곳이 있습니다. InstructionsLoaded 훅이 발동하지 않고(CLAUDE.md가 import하거나 심링크한 AGENTS.md는 발동), --add-dir과 CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD로 추가한 디렉터리의 AGENTS.md는 읽지 않습니다.
  • 문서가 직접 두 가지 연결 방법을 소개합니다. CLAUDE.md 안에 @AGENTS.md 한 줄을 넣는 import 방식과, ln -s AGENTS.md CLAUDE.md 심링크 방식입니다.
  • 심링크를 쓸 때 문서가 적어 둔 제약이 두 가지 있습니다.
    • Claude는 링크를 통해 CLAUDE.md를 읽지만, Edit·Write 도구는 심링크 너머로 쓰지 않고 원본(AGENTS.md)을 고치라고 안내합니다.
    • Windows에서 작업하는 사람이 있으면 import 방식을 쓰라고 합니다. 심링크를 만들려면 관리자 권한이나 개발자 모드가 필요하고, core.symlinks가 꺼진 클론에서는 CLAUDE.md가 한 줄짜리 텍스트 파일로 풀리기 때문입니다.
  • .claude/rules/도 심링크를 지원합니다. 단, 링크 대상이 작업 디렉터리 밖이면 외부 import처럼 취급해 승인 전까지 불러오지 않습니다. 네트워크 경로를 가리키는 링크는 따라가지 않습니다.

Codex: AGENTS.md가 기본

  • 전역은 Codex 홈 디렉터리(기본 ~/.codex, CODEX_HOME으로 변경 가능)의 AGENTS.override.md, 없으면 AGENTS.md를 읽습니다. 이 단계에서는 비어 있지 않은 첫 파일 하나만 씁니다.
  • 프로젝트는 루트(보통 Git 루트)부터 현재 디렉터리까지 내려가며 디렉터리마다 AGENTS.override.md → AGENTS.md → project_doc_fallback_filenames에 적은 이름 순으로 하나씩 찾습니다. 빈 파일은 건너뜁니다.
  • 합친 크기가 project_doc_max_bytes(기본 32 KiB)에 닿으면 파일을 더 붙이지 않습니다.
  • CLAUDE.md는 기본 탐색 대상이 아닙니다. 다른 파일 이름을 쓰고 싶으면 ~/.codex/config.toml의 project_doc_fallback_filenames에 추가합니다.
  • 심링크는 공식 가이드에는 나오지 않습니다. 대신 소스 코드(codex-rs/core/src/agents_md.rs)의 탐색 함수 주석에 “Symlinks are allowed.”라고 적혀 있고, 탐색 성능 PR(#29870)의 Symlinks 절에는 링크 대상이 일반 파일이면 읽고 깨진 링크는 없는 파일로 취급한다고 나옵니다.
  • 같은 소스 파일에는 신뢰하지 않은(untrusted) 프로젝트로 표시된 경우 프로젝트의 AGENTS.md를 읽지 않는 분기가 있습니다. 공식 가이드가 아니라 소스 기준입니다.

Cursor: .cursor/rules/*.mdc 또는 AGENTS.md

  • 프로젝트 규칙은 .cursor/rules 안의 .mdc 파일입니다. 문서는 확장자가 .md인 파일은 규칙 시스템이 무시한다고 명시합니다. frontmatter에 description, globs, alwaysApply를 적어 언제 적용할지 정하기 때문입니다.
  • 같은 문서가 “plain markdown을 원하면 AGENTS.md를 쓰라”고 합니다. 루트와 하위 디렉터리의 AGENTS.md를 읽고, 하위 폴더의 파일이 더 구체적인 지시로 우선합니다.
  • 프로젝트 루트의 .cursorrules는 공식 도움말 기준 legacy이고 deprecated 예정입니다.
  • .cursor/rules의 심링크는 공식 문서에 설명이 없습니다. Cursor 커뮤니티 포럼에는 2025년 12월(2.2.x)에 심링크된 .mdc를 읽지 못한다는 버그 보고가 있었고, 2026년 2월 Cursor 스태프가 같은 스레드에 “2.5에서 고쳐졌다”고 답했습니다.
  • 2026년 2월 말 스레드(2.5.25)에서는 심링크한 디렉터리 안 규칙이 안 잡힌다는 보고에 스태프가 Reload Window를 권했지만, 보고자는 다시 불러오거나 재시작해도 안 된다고 답했습니다. 결국 보고자가 찾은 원인은 그 폴더 이름(generated/)이 .gitignore에 걸려 있던 것이었습니다. 같은 보고에서 개별 .mdc 파일 심링크는 정상 동작했다고 합니다. 둘 다 공식 문서가 아니라 포럼 글이라는 점은 감안해야 합니다.

정리하면

도구 기본으로 읽는 파일 AGENTS.md 직접 읽기 심링크
Claude Code CLAUDE.md, .claude/CLAUDE.md, CLAUDE.local.md, .claude/rules/*.md 읽음(v2.1.277+, CLAUDE.md류가 없을 때) CLAUDE.md 심링크를 문서가 직접 안내. Windows는 import 권장
Codex AGENTS.override.md, AGENTS.md 읽음(기본) 소스 주석상 허용
Cursor .cursor/rules/*.mdc(frontmatter 필요) 읽음 문서엔 없음. 포럼상 개별 파일 심링크는 2.5에서 수정

심링크는 언제 필요하고, git에는 어떻게 저장되나?

AGENTS.md 공식 사이트도 기존 파일을 옮길 때 mv AGENT.md AGENTS.md && ln -s AGENTS.md AGENT.md처럼 심링크로 하위 호환을 유지하라고 안내합니다. 심링크 자체는 흔한 방법입니다. 다만 위 표대로라면 AGENTS.md만 두면 세 도구가 다 읽습니다. CLAUDE.md 링크가 필요한 경우는 이 정도입니다.

  • 문서가 AGENTS.md를 못 읽는다고 적은 Claude Code 세션(v2.1.277 이전, v2.1.281 이전의 Bedrock·텔레메트리 끈 세션, 업그레이드 직후 첫 세션 등)이 팀에 섞여 있을 때
  • 팀원 중 누군가 CLAUDE.local.md를 쓰고 있을 때(이 파일이 있으면 기본값에서 AGENTS.md를 안 읽음)
  • InstructionsLoaded 훅을 쓰거나 --add-dir로 다른 디렉터리 규칙을 불러올 때(설정으로 읽힌 AGENTS.md는 훅이 안 뜨고, 추가 디렉터리의 AGENTS.md는 안 읽힘)

아래는 리눅스(git 2.47) 임시 디렉터리에서 원본 AGENTS.md 하나에 CLAUDE.md와 .cursor/rules/core.mdc를 심링크로 걸어 본 결과입니다. 출력은 실제로 나온 그대로입니다. 파일 시스템과 git 동작만 본 것이고, 각 도구가 실제로 파일을 읽는지는 이 데모에서 확인하지 않았습니다.

만들기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mkdir -p /tmp/rules-demo && cd /tmp/rules-demo
git init -q -b main .

cat > AGENTS.md <<'MD'
# 프로젝트 규칙

- 패키지 매니저는 pnpm을 쓴다.
- 커밋 전에 `pnpm lint && pnpm test`를 돌린다.
- `dist/`는 생성물이므로 직접 고치지 않는다.
MD

ln -s AGENTS.md CLAUDE.md
mkdir -p .cursor/rules
ln -s ../../AGENTS.md .cursor/rules/core.mdc

링크 대상은 링크가 있는 위치 기준 상대 경로입니다. .cursor/rules/core.mdc에서 루트의 AGENTS.md까지는 두 단계 위라서 ../../AGENTS.md가 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$ tree -a -I .git
.
├── .cursor
│ └── rules
│ └── core.mdc -> ../../AGENTS.md
├── AGENTS.md
└── CLAUDE.md -> AGENTS.md

3 directories, 3 files

$ ls -la . .cursor/rules
.:
total 44
drwxr-xr-x 4 box box 4096 Sep 30 10:47 .
drwxrwxrwt 1 root root 20480 Sep 30 10:47 ..
drwxr-xr-x 3 box box 4096 Sep 30 10:47 .cursor
drwxr-xr-x 7 box box 4096 Sep 30 10:47 .git
-rw-r--r-- 1 box box 179 Sep 30 10:47 AGENTS.md
lrwxrwxrwx 1 box box 9 Sep 30 10:47 CLAUDE.md -> AGENTS.md

.cursor/rules:
total 8
drwxr-xr-x 2 box box 4096 Sep 30 10:47 .
drwxr-xr-x 3 box box 4096 Sep 30 10:47 ..
lrwxrwxrwx 1 box box 15 Sep 30 10:47 core.mdc -> ../../AGENTS.md

$ readlink CLAUDE.md .cursor/rules/core.mdc
AGENTS.md
../../AGENTS.md

git은 심링크를 “링크”로 저장한다

1
2
3
4
5
6
7
8
9
10
$ git add -A

$ git ls-files -s
120000 b7e6491d3a0dda1d656cc3c4320f5c013cdbc02d 0 .cursor/rules/core.mdc
100644 f469d6a0a1be5a6ce9db905553c85667281bf894 0 AGENTS.md
120000 47dc3e3d863cfb5727b87d785d09abf9743c0a72 0 CLAUDE.md

$ git cat-file -p :CLAUDE.md
AGENTS.md
$ git commit -q -m init

일반 파일은 모드 100644, 심링크는 120000으로 들어갑니다. 저장소에 담기는 건 원본 내용이 아니라 링크 대상 경로 문자열(AGENTS.md)입니다. 그래서 받는 쪽이 심링크를 풀어 주지 않으면 이 문자열이 그대로 파일이 됩니다.

커밋한 저장소를 core.symlinks를 끈 채로 클론해 Windows에서 생길 수 있는 상황을 흉내 내 봤습니다.

1
2
3
4
5
6
7
$ git clone -q -c core.symlinks=false /tmp/rules-demo /tmp/rules-demo-nosym

$ ls -la /tmp/rules-demo-nosym/CLAUDE.md
-rw-r--r-- 1 box box 9 Sep 30 10:47 /tmp/rules-demo-nosym/CLAUDE.md

$ cat /tmp/rules-demo-nosym/CLAUDE.md
AGENTS.md

9바이트짜리 일반 파일이 생겼고, 내용은 AGENTS.md 한 단어입니다. git 문서의 core.symlinks 설명 그대로입니다. 이 값이 false면 심링크를 “링크 텍스트가 담긴 작은 일반 파일”로 체크아웃합니다. 기본값은 true지만 git clone·git init이 파일 시스템을 확인해 적절하면 false로 설정합니다. Claude Code 문서가 Windows 사용자가 있으면 import 방식을 권하는 이유가 여기에 있습니다. 이 상태의 CLAUDE.md는 규칙 대신 단어 하나만 담고 있으니까요.

상대 경로로 걸어야 하는 이유

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ mkdir -p /tmp/abs-demo && cd /tmp/abs-demo

$ echo "# 규칙" > AGENTS.md

$ ln -s AGENTS.md CLAUDE.md

$ ln -s /tmp/abs-demo/AGENTS.md CLAUDE.abs.md

$ mv /tmp/abs-demo /tmp/abs-demo-moved && cd /tmp/abs-demo-moved

$ head -n 1 CLAUDE.md
# 규칙

$ head -n 1 CLAUDE.abs.md
head: cannot open 'CLAUDE.abs.md' for reading: No such file or directory

절대 경로 링크는 디렉터리를 옮기거나 다른 사람이 클론하면 바로 깨집니다. 저장소에 커밋하는 링크는 상대 경로로 겁니다.

.cursor/rules에 AGENTS.md를 심링크하면 안 되나?

링크는 잘 걸립니다. 문제는 내용입니다.

1
2
3
4
$ head -n 3 .cursor/rules/core.mdc
# 프로젝트 규칙

- 패키지 매니저는 pnpm을 쓴다.

core.mdc를 열면 AGENTS.md 본문이 그대로 나오고, frontmatter가 없습니다. Cursor 문서의 표에 따르면 alwaysApply가 false이고 description·globs가 모두 없으면 채팅에서 @멘션할 때만 규칙이 들어갑니다. frontmatter가 아예 없는 경우를 따로 적진 않았지만, 이대로면 이 링크는 자동으로 적용되지 않을 가능성이 큽니다. 그렇다고 AGENTS.md 맨 위에 alwaysApply: true 같은 frontmatter를 넣으면 Codex와 Claude Code가 그 줄까지 규칙 본문으로 읽을 수 있습니다.

Cursor는 AGENTS.md를 직접 읽으니 이 링크는 뺐습니다. 특정 경로에만 거는 Cursor 전용 규칙이 필요하면 그때 frontmatter를 갖춘 진짜 .mdc 파일을 따로 만듭니다.

최종 구성

앞의 git 실험은 링크를 지우기 전 상태에서 했습니다. 실제로 남기는 구성은 core.mdc 링크를 지운 쪽입니다.

1
rm .cursor/rules/core.mdc
1
2
3
.
├── AGENTS.md # 원본. Codex, Cursor, Claude Code(v2.1.277+)가 직접 읽음
└── CLAUDE.md -> AGENTS.md # AGENTS.md를 못 읽는 Claude Code 세션용 (선택)

Windows 사용자가 있는 저장소라면 CLAUDE.md를 심링크 대신 한 줄짜리 일반 파일로 둡니다.

1
@AGENTS.md

로딩 확인은 이렇게 합니다.

  • Claude Code: AGENTS.md가 직접 읽혔는지는 /memory에서 경로로 확인합니다(문서가 지정한 방법). 인터랙티브 세션을 시작할 때 no CLAUDE.md found; AGENTS.md loaded: … 같은 줄도 나옵니다. CLAUDE.md 심링크나 import를 쓴다면 /context의 Memory files 목록에 CLAUDE.md가 있는지 봅니다.
  • Codex: 문서에 나온 대로 저장소 루트에서 아래 명령을 실행합니다.
1
codex --ask-for-approval never "Summarize the current instructions."

dot-agents 같은 도구를 써야 하나?

이 작업을 대신해 준다는 도구로 dot-agents(www.dot-agents.com, github.com/dot-agents/dot-agents)를 검토했습니다. 규칙·스킬·MCP 설정을 ~/.agents/에 모아 두고 Cursor, Claude Code, Codex, OpenCode 프로젝트에 심링크로 뿌려 주는 무료 bash CLI이고, 라이선스는 MIT입니다. 설치는 하지 않고 저장소 코드만 읽었습니다. 커밋은 모두 dottybotdev 한 계정에서 나왔고, v0.1.9(2026-01-13) 직후 1월 중순 커밋을 마지막으로 2026-09-30 현재 약 8개월 반째 새 커밋이 없습니다. 사이트에는 tasks, history, snapshot, restore 같은 명령이 소개돼 있지만 “출시 후 제공” 항목으로 묶여 있고, 코드에 들어 있는 명령은 add, doctor, explain, hooks, init, remove, skills, status, sync 9개입니다. 직접 하기로 한 이유는 설정 파일 처리였습니다. init은 ~/.claude/settings.json이 없을 때, 또는 --force를 주면 기존 파일이 있어도 그 자리를 심링크로 바꿉니다. add는 ~/.agents에 해당 설정이 있으면 프로젝트의 .mcp.json과 .codex/config.toml을 ln -sf로 심링크로 바꿉니다. hooks examples가 보여 주는 예제(기본 설치는 아니고 hooks add로 직접 추가해야 함) 중에는 입력한 프롬프트를 ~/.claude/prompts.log에, 실행한 명령을 ~/.claude/command-log.txt에 평문으로 남기는 훅이 있어, 그대로 쓰면 토큰이 섞인 입력도 파일에 남습니다. 설치 방법 중 하나가 curl | bash라는 점, 이름이 비슷한 다른 프로젝트 getsentry/dotagents와 헷갈리기 쉽다는 점도 걸렸습니다. 도구가 나쁘다는 이야기는 아닙니다. 필요한 건 링크 한두 개였고, 그 정도면 ln -s 한 줄로 끝나기 때문에 설정 파일까지 맡길 이유가 없었습니다.

적용 전에 무엇을 확인하나? (체크리스트)

  • 원본은 AGENTS.md 하나. 다른 파일은 링크나 @AGENTS.md import로만 잇는다
  • 링크는 링크 위치 기준 상대 경로로 건다(ln -s AGENTS.md CLAUDE.md). 절대 경로는 클론하거나 옮기면 깨진다
  • Windows 사용자가 있으면 CLAUDE.md는 심링크 대신 @AGENTS.md 한 줄짜리 일반 파일
  • 규칙 파일에 API 키, 토큰, 내부 URL 같은 비밀값을 넣지 않는다. 커밋되고, 매 세션 모델 컨텍스트에 들어간다
  • settings.json, .mcp.json, config.toml 같은 설정 파일은 심링크로 묶지 않는다. 형식도 도구마다 다르고(JSON, TOML), 한 곳을 고치면 모든 도구에 바로 반영된다
  • .cursor/rules에 넣는 파일은 .mdc 확장자와 frontmatter를 갖춘 진짜 파일로
  • 심링크한 규칙 폴더 이름이 .gitignore에 걸려 있지 않은지 본다(포럼 사례)
  • CLAUDE.local.md를 만들면 Claude Code가 기본값에서 AGENTS.md를 안 읽는다는 점을 팀에 공유
  • Codex는 합친 규칙이 32 KiB(기본값)에 닿으면 파일을 더 붙이지 않는다. 규칙이 길어지면 하위 디렉터리로 나눈다
  • 바꾼 뒤에는 Claude Code /memory·/context, Codex 요약 명령으로 실제로 읽히는지 확인한다

자주 묻는 질문

Q. Claude Code는 AGENTS.md를 읽나요? A. v2.1.277부터 직접 읽습니다. 단 기본값에선 작업 디렉터리나 그 위에 CLAUDE.md류가 없을 때만 읽고, 둘 다 읽으려면 /config에서 Project instructions를 claude-md-and-agents-md로 바꿉니다.

Q. CLAUDE.md를 AGENTS.md 심링크로 만들어도 되나요? A. 공식 문서가 안내하는 방법입니다. 상대 경로(ln -s AGENTS.md CLAUDE.md)로 걸고, Windows 사용자가 있으면 @AGENTS.md 한 줄 import를 쓰세요.

Q. Windows에서 CLAUDE.md가 한 줄짜리 파일이 되는 이유는? A. core.symlinks가 false인 클론에선 git이 심링크를 링크 경로 문자열이 담긴 일반 파일로 체크아웃하기 때문입니다.

Q. Codex가 CLAUDE.md를 읽게 할 수 있나요? A. 기본은 아니고, ~/.codex/config.toml의 project_doc_fallback_filenames에 추가하면 됩니다.

Q. Cursor의 .cursorrules는 아직 쓰나요? A. 공식 도움말상 legacy이고 deprecated 예정입니다. .cursor/rules/*.mdc나 AGENTS.md로 옮기세요.

출처

도구 공식 문서·소스

포럼(공식 문서 아님)

dot-agents 관련

관련 글

Comments

댓글

GitHub 계정으로 의견을 남길 수 있습니다. 댓글은 GitHub Discussions에 저장됩니다.