AI 에이전트와 함께 일하는 팀의 GitHub 구조
팀원마다 다른 AI 도구(Claude Code, Copilot, Cursor 등)를 쓰고 레포가 여러 개인 팀을 위한 템플릿입니다. 어떤 도구로 작업하든 같은 규칙을 읽고 같은 검사를 통과해야 main에 반영됩니다. 이 페이지는 전체 구조, 작업 하나가 진행되는 순서, 각 장치를 둔 이유를 설명합니다.
- API 키 없이 동작
- 규칙 원본 1개
- 워크플로 22
- 스킬 15
- 서브에이전트 5
make setup이슈 등록
AI 분류와 라벨 제안
- 사람
ai:ready 부여
AI 구현, 테스트 먼저
초안 PR, CI, AI 리뷰
- 사람
CODEOWNER 승인
squash 머지와 릴리스
전체 구조
여섯 층으로 나뉩니다. 1층은 AI가 읽는 규칙이고, 2층과 3층이 그 규칙을 기계적으로 강제합니다. 4층은 작업 단계, 5층은 AI가 실행되는 위치, 6층은 다른 레포로 배포하는 방법입니다.
파일, 워크플로, 스킬을 하나씩 확대해 보려면 구조 지도를 엽니다.
읽는 쪽: 개발자, 리뷰어(CODEOWNER), Claude Code, GitHub Copilot, Cursor, OpenAI Codex, Gemini CLI, Aider · Zed · Jules
- 1
규칙AI에 대한 지시. 강제력 없음
팀 규칙은 AGENTS.md 한 곳에 씁니다. 도구별 파일은 이 파일을 가리키기만 하고, 특정 파일을 수정할 때만 경로별 규칙이 더해집니다.
AGENTS.md · CLAUDE.md · copilot-instructions.md · .cursor/rules · GEMINI.md · REVIEW.md - 2
로컬 가드레일개발자 PC
훅이 비밀·정책 파일 수정, main 커밋, 강제 푸시를 막고 수정 직후 포맷과 글·화면 검사를 실행합니다. pre-commit이 사람의 커밋에도 같은 검사를 적용합니다.
plugins/team-ai-workflow · .claude/settings.json · .pre-commit-config.yaml - 3
GitHub 거버넌스서버
어떤 도구로 만든 코드든 PR, CODEOWNER 승인,
ci-ok를 통과해야 main에 들어갑니다. 보안 스캔도 서버에서 실행됩니다.scripts/rulesets/main.json · .github/CODEOWNERS · .github/ISSUE_TEMPLATE/ - 4
이슈에서 머지까지워크플로 22개
분류, 구현, 초안 PR, 리뷰, 릴리스를 워크플로와 AI 에이전트가 진행합니다. 사람은 두 번 판단합니다.
ai:ready 부여CODEOWNER 승인 - 5
AI 실행 주체선택 사항
기본은 내 자리에서 내 claude 로그인으로 실행합니다. 서버 자동화가 필요하면 사내 로컬 LLM이나 Anthropic을 고릅니다.
- 6
여러 레포 배포허브 1개, 서비스 레포 N개
처음에는 템플릿을 복사하고, 이후에는 플러그인 갱신으로 훅과 스킬을 모든 레포에 맞춥니다.
용어
이 페이지에서 반복해서 쓰는 용어입니다.
- AGENTS.md
- AI 코딩 도구들이 공통으로 읽는 에이전트용 README. 공개 형식이며 이 레포의 팀 규칙이 모두 이 파일에 있습니다.
- 에이전트
- 지시를 받아 파일을 읽고 수정하고 명령을 실행하는 AI. 이 템플릿에서는 이슈를 받아 코드를 작성하고 PR을 엽니다.
- 훅(hook)
- AI가 행동하기 직전이나 직후에 자동으로 실행되는 스크립트. AI가 무시할 수 없습니다. 예:
.env수정 차단 - 스킬(skill)
- 반복 작업의 절차서.
/implement-issue 12처럼 호출하거나 상황에 맞으면 AI가 스스로 불러옵니다. - 서브에이전트
- 한 가지 역할만 맡는 별도 AI. 작업한 AI와 독립된 관점으로 검토할 때 씁니다. 예: security-reviewer
- 플러그인 · 마켓플레이스
- 훅·스킬·서브에이전트를 묶은 패키지와 그 목록. 이 레포 자체가 마켓플레이스 "ai-collab"입니다.
- 워크플로
- 이슈 생성, PR, 푸시 같은 이벤트에 GitHub Actions가 자동으로 실행하는 작업.
.github/workflows/ - 룰셋 · CODEOWNERS
- 룰셋은 브랜치 보호 규칙, CODEOWNERS는 경로별 책임 리뷰어 목록입니다.
- 라벨 상태
- 이슈의 진행 단계를 라벨로 표시하는 방식. 워크플로가 라벨을 보고 실행됩니다.
- claude -p
- 대화창 없이 명령 한 줄로 Claude Code를 실행하는 방식.
make ai-*가 내부에서 사용합니다. - ci-ok
- 린트·타입·테스트 결과를 하나로 모은 검사. 머지 조건으로 지정합니다.
- squash 머지
- PR의 커밋을 하나로 합쳐 반영하는 방식. PR 제목이 main의 커밋 제목이 됩니다.
이슈 하나가 머지되기까지
로그인에 요청 제한을 추가하는 이슈 #42를 예로 듭니다. 사람이 판단하는 지점은 두 곳입니다. 이 작업을 AI에 맡길지, 그리고 결과 코드를 받아들일지입니다. 나머지는 워크플로와 AI 에이전트가 진행합니다.
sequenceDiagram autonumber actor Dev as 팀원 participant GH as GitHub participant AI as AI 에이전트 participant CI as CI · 검사 actor Rev as 리뷰어(CODEOWNER) Dev->>GH: 이슈 #35;42 등록 (양식) GH->>AI: 이슈 생성 이벤트 AI-->>GH: 라벨 제안 + 빠진 정보 댓글 Dev->>GH: 보강 후 ai:ready 라벨 GH->>AI: ai:ready 이벤트 AI->>AI: 테스트 먼저 → 구현 → make check AI-->>GH: 커밋 + 초안 PR (ai:generated) GH->>CI: ci-ok · 제목 · 크기 · AI 공개 · 보안 AI-->>GH: 줄 단위 리뷰 (승인 아님) Rev->>GH: 코드 리뷰 → 승인 GH-->>GH: squash 머지 · 이슈 ai:done · 릴리스 노트
이슈 등록
팀원이 "작업(AI 가능)" 양식으로 #42를 작성합니다. 수용 기준은 "같은 IP에서 1분에 5회 넘게 로그인하면 429 응답", 범위는
src/auth/입니다.AI 분류
AI가
type/feature,area/auth,priority/p2,size/S라벨을 추가하고 "실패 시 응답 본문 형식이 없다"는 댓글을 남깁니다. 이슈를 닫거나 담당자를 바꾸지 않습니다.- 사람
AI 위임 결정
메인테이너가 빠진 내용을 보강하고
ai:ready라벨을 붙입니다. 쓰기 권한이 있는 사람만 붙일 수 있습니다. 보안·개인정보·운영 장애 이슈에는 붙이지 않습니다. AI 구현
라벨이
ai:in-progress로 바뀝니다. AI가 별도 작업 폴더(worktree)의ai/issue-42-…브랜치에서 수용 기준을 테스트로 먼저 작성하고 구현합니다.make check가 통과해야 커밋합니다.초안 PR
"Closes #42"가 들어간 초안 PR이
ai:generated라벨로 열리고 이슈는ai:review가 됩니다. 실패하면 이슈가ai:needs-human이 되고 이유가 댓글로 남습니다.자동 검사와 AI 리뷰
CI(
ci-ok), PR 제목·크기·AI 공개 검사, 보안 스캔이 실행됩니다. AI 리뷰어는 "1분 경계에서 카운터가 초기화되지 않음" 같은 지적을 줄 단위로 남깁니다. AI 리뷰는 승인으로 집계하지 않습니다.- 사람
사람 리뷰와 승인
CODEOWNER가 코드를 읽고 타당한 AI 지적의 반영을 요청한 뒤 승인합니다. 승인 후 새 커밋이 생기면 다시 승인해야 합니다. AI 커밋이 있는 PR은 별도의 사람 승인 검사도 통과해야 합니다.
머지와 릴리스
squash 머지로 PR 제목 "feat(auth): add login rate limit (#42)"가 main의 커밋 제목이 됩니다. 이슈는
ai:done이 되고 release-please가 다음 버전의 변경 기록에 추가합니다.
라벨로 보는 이슈 상태
위 단계에서 이슈 라벨이 바뀝니다. 이슈 목록의 라벨만 보면 누가 무엇을 기다리는지 알 수 있습니다.
| 라벨 | 의미 | 붙이는 주체 |
|---|---|---|
ai:ready | 범위와 수용 기준이 명확해 AI에 맡길 수 있음 | 메인테이너 |
ai:in-progress | 에이전트가 작업 중. 다른 사람은 손대지 않음 | 자동 |
ai:review | 초안 PR이 사람 리뷰를 기다림 | 자동 |
ai:needs-human | 에이전트가 막힘. 이슈를 보강하면 ai:ready로 다시 시작 | 자동 |
ai:done | 에이전트 작업이 머지됨 | 자동 |
ai:assisted · ai:generated | PR 출처. 사람이 AI 도움을 받음 / 에이전트가 작성 | PR 양식의 체크로 자동 |
size/XS~size/XL | 변경 줄 수. 목표는 400줄 이하, XL(800줄 초과)은 분할 요청 | 자동 |
큰 작업은 설계부터, 시작 전에는 겹침 확인
AI가 코드를 빨리 만들수록 두 가지 낭비가 커집니다. 같은 영역을 두 사람의 AI가 따로 구현하는 중복, 그리고 설계 없이 구현한 뒤 리뷰에서 방향을 바꾸는 재작업입니다. 그래서 작업 크기에 따라 선행 작업을 정합니다. 또 시작 전에 다른 사람의 작업과 겹치는지 확인합니다.
flowchart LR
R["요청 / 아이디어"] --> S{"한 문장으로
설명 가능?"}
S -- 예 --> T0["T0: 바로 브랜치"]
S -- 아니오 --> M{"여러 모듈·레포 또는
영역이 모호?"}
M -- 아니오 --> T1["T1: 계획을 PR 본문에"]
M -- 예 --> T2["T2: /design → 설계 PR"]
T0 & T1 & T2 --> O["겹침 확인"]
O -- 겹침 --> TALK["담당자와 협의
합치기 · 영역 나누기"]
O -- 없음 --> W["구현 PR (설계 링크)"]
| 단계 | 기준 | 선행 작업 | 승인 |
|---|---|---|---|
| T0 | 한 문장으로 설명되는 변경 | 이슈와 브랜치. 초안 PR이 작업 선점 표시 | 일반 PR 리뷰 |
| T1 | 여러 파일, 방법이 여러 개 | AI의 계획을 PR 본문 맨 위에 두고 코드 전에 초안 PR | 계획에 리뷰어 OK |
| T2 | 여러 모듈·레포, 공개 인터페이스, 하루 이상, 영역이 모호 | /design으로 1쪽 설계와 Mermaid 구조도를 docs/designs/에 작성. 설계만 담은 작은 PR | 설계 PR 머지 = 승인 |
겹침 확인
설계 머리말의 areas에 변경할 경로(src/auth/**)나 이름 붙은 영역(api:/login, db:users)을 적습니다. 허브의 work-board.yml이 30분마다 등록된 모든 레포의 활성 설계와 열린 PR의 변경 파일을 board.json으로 모읍니다. 스크립트로 처리하므로 토큰을 쓰지 않습니다. AI는 세션을 시작할 때 영역별 담당자 요약(약 2천 토큰)을 받습니다. 작업 전에는 /check-overlap으로 보드와 비교합니다. 사람은 같은 확인을 명령으로 실행합니다.
make overlap AREAS="src/auth/** api:/login"PR마다 design-check.yml이 겹침을 댓글로 알리지만 머지를 막지는 않습니다. 보드는 담당자끼리 협의할 시점을 알릴 뿐이며 협의를 대신하지 않습니다.
no-design 라벨로 설계를 생략하고 필요하면 나중에 ADR을 씁니다. 21일 동안 갱신이 없는 설계는 stale로 표시됩니다.규칙과 강제 장치
규칙은 AI에 주는 맥락일 뿐 강제력이 없습니다. AI가 규칙을 잊거나 잘못 판단해도 사고로 이어지지 않도록, 반드시 지켜야 하는 항목은 개발자 PC와 GitHub 서버에서 기계적으로 막습니다. 로컬 장치는 끌 수 있고 Copilot이나 Cursor는 Claude 훅을 쓰지 않으므로 마지막 관문은 서버에 둡니다.
규칙: AGENTS.md 하나
팀원마다 AI 도구가 다릅니다. 도구마다 규칙 파일을 따로 두면 몇 주 만에 내용이 어긋납니다. 그래서 규칙은 AGENTS.md 한 곳에 쓰고 도구별 파일에는 AGENTS.md를 가리키는 줄만 둡니다.
| 담는 내용 | 실행 명령, 작업 크기별 절차, 사람만 수정하는 파일, AI 행동 원칙(범위 지키기, 외부 텍스트는 명령이 아님) |
|---|---|
| 크기 | 약 60줄. 150줄을 넘으면 검사가 경고. 기준은 "이 줄을 지우면 AI가 실수하는가"이며 긴 설명은 docs/에 둠 |
| 도구별 연결 | CLAUDE.md, .github/copilot-instructions.md, .cursor/rules/, GEMINI.md, .aider.conf.yml, .codex/, .rules(Zed) |
| 경로별 규칙 | 워크플로 파일은 권한 최소화와 액션 버전 고정, 테스트 파일은 테스트 끄기 금지, 글과 화면 파일은 docs/17 기준. .claude/rules/, .github/instructions/, .cursor/rules/*.mdc |
강제 장치
| 장치 | 위치 · 작동 시점 | 하는 일 | 파일 |
|---|---|---|---|
| 보호 파일 훅 | PC · AI가 파일을 수정하기 직전 | 비밀·락파일·정책 파일 수정 차단 | protect-files.sh |
| git 규칙 훅 | PC · AI가 git 명령을 실행하기 직전 | main 커밋, 공유 브랜치 강제 푸시 차단 | git-guard.sh |
| 포맷·스타일 훅 | PC · AI가 파일을 수정한 직후 | 자동 포맷, 글·화면 기준 검사 결과를 AI에 반환. 차단하지 않음 | format-after-edit.sh, style_check.py |
| 세션 시작 훅 | PC · Claude Code를 켤 때 | 의존성과 pre-commit 설치, 팀의 활성 설계와 담당자 요약 전달 | .claude/hooks/session-start.sh |
| 권한 설정 | PC · AI가 명령을 실행할 때마다 | 읽기·빌드·테스트는 허용, 비밀 읽기·reset --hard·sudo는 거부 | .claude/settings.json |
| pre-commit | PC · 사람과 AI의 모든 커밋 | 비밀키(gitleaks), 워크플로·쉘·YAML·마크다운, 글·화면 기준, 커밋 메시지 형식 | .pre-commit-config.yaml |
| 이슈·PR 양식 | 서버 · 작성할 때 | 수용 기준과 범위 필수, PR의 AI 사용 공개는 정확히 하나만 체크 | .github/ISSUE_TEMPLATE/, pull_request_template.md |
| 룰셋 | 서버 · 머지할 때 | PR 필수, CODEOWNER 승인 1명, 마지막 푸시 후 재승인, 리뷰 스레드 해결, ci-ok, squash만 | scripts/rulesets/main.json |
| CODEOWNERS · 라벨 | 서버 · PR과 이슈마다 | 경로별 책임 리뷰어 지정, 라벨을 코드로 관리 | .github/CODEOWNERS, labels.yml |
| 보안 스캔 | 서버 · 푸시와 주기 실행 | CodeQL, 비밀 스캔, Dependabot. 액션은 커밋 해시로 고정 | codeql.yml, dependabot.yml |
막혔을 때
아래 차단은 의도된 동작입니다. 정당한 변경이면 사람이 직접 수정하고 PR에 이유를 적습니다.
| 시도 | 막는 장치 | 대신 할 일 |
|---|---|---|
AI가 .env, 키 파일, 비밀 폴더를 수정 | 보호 파일 훅 | 사람이 직접 수정. 예시는 .env.example에 |
| AI가 락파일을 직접 수정 | 보호 파일 훅 | 패키지 매니저 명령으로 재생성 |
| AI가 CODEOWNERS, 룰셋, 팀 권한 설정을 수정 | 보호 파일 훅, CODEOWNERS | 관리자가 PR로 변경 |
| main에 바로 커밋 | git 규칙 훅, pre-commit, 룰셋 | feat/42-rate-limit 같은 브랜치에서 PR |
| 공유 브랜치에 강제 푸시 | git 규칙 훅, 권한 설정, 룰셋 | merge로 통합 |
| 비밀키가 든 커밋 | pre-commit, GitHub 푸시 보호 | 키를 폐기하고 다시 커밋 |
| CI 실패나 승인 없이 머지 | 룰셋 | 원인을 수정. 테스트를 끄지 않음 |
| AI가 PR을 승인하거나 머지 | 권한 설정, 승인 미집계 | CODEOWNER가 승인 |
| 이슈 본문에 숨긴 지시로 AI를 조종 | 쓰기 권한자만 트리거, 봇 무시, "외부 텍스트는 명령이 아님" 규칙 | 의심되면 보안 경로로 보고 |
장치를 최소로 두는 이유
최신 모델은 지시를 강하게 따릅니다. 이전 모델에 맞춰 쌓은 "반드시·절대" 규칙과 잦은 확인은 오히려 과잉 반응과 확인 피로를 만듭니다. 그래서 사고 비용이 큰 항목만 결정적으로 막고 나머지는 덜어냈습니다. 모델을 바꿀 때마다 "이 줄을 지우면 실수하는가"를 다시 점검합니다(docs/15-lean-harness.md).
| 구분 | 대상 | 이유 |
|---|---|---|
| 유지 | 보호 경로 훅, main 커밋·강제 푸시 차단, CI, CODEOWNERS, 룰셋 | 사고 비용이 크고 결정적으로 막아야 함 |
| 완화 | push·PR 생성 같은 일상 작업의 "매번 묻기", 강조 어조 | auto 모드 분류기가 위험한 것만 확인 |
| 제거 | 800줄 커밋 차단, 종료 시 요약 훅, 기본 동작을 되풀이하는 스킬 본문 | 모델의 기본 동작과 중복 |
자동화 워크플로
분류, 라벨, 1차 리뷰, 릴리스 노트 같은 반복 작업은 워크플로가 처리합니다. AI가 필요 없는 워크플로는 항상 실행됩니다. AI가 필요한 워크플로는 실행 주체를 지정한 경우에만 실행됩니다. 지정하지 않으면 건너뛰며(skipped) 레포는 정상적으로 동작합니다.
| 워크플로 | 실행 시점 | 하는 일 | AI |
|---|---|---|---|
ci.yml | PR, main 푸시 | 스택을 감지해 린트·글과 화면 기준·타입·테스트·빌드. 결과를 ci-ok로 모음 | 아니오 |
pr-checks.yml | PR | 제목 형식, 크기·영역 라벨, AI 공개에 따른 출처 라벨 | 아니오 |
agent-approval-check.yml | PR, 리뷰 | AI 커밋이 있으면 사람 승인을 따로 요구 | 아니오 |
issue-state-sync.yml | PR 열림·머지 | 에이전트 PR에 ai:generated, 머지 시 연결된 이슈를 ai:done으로 변경 | 아니오 |
release-please.yml | main 푸시 | 커밋 제목으로 릴리스 PR과 변경 기록 작성 | 아니오 |
work-board.yml | 30분마다, main 변경 | 팀 작업 보드 수집, 이 페이지와 함께 Pages에 배포 | 아니오 |
design-check.yml | PR | 영역 겹침 댓글, 큰 PR에 설계 링크가 없으면 알림 | 아니오 |
contract-check.yml | 계약 파일이 바뀐 PR | OpenAPI·protobuf의 깨지는 변경은 breaking-change 라벨 없이 실패 | 아니오 |
labels-sync · stale · codeql · dependabot-auto-merge · validate-ai-config · copilot-setup-steps · bootstrap-repo | 각각 | 라벨 동기화, 오래된 이슈 정리, 보안 스캔, 의존성 소규모 갱신 자동 머지, 설정 검증, Copilot 환경 준비, 레포 초기 설정 | 아니오 |
claude-issue-triage.yml | 이슈 생성 | 라벨 제안, 빠진 정보·중복 댓글. 이슈를 닫지 않음 | 예 |
claude-implement-issue.yml | ai:ready 라벨 | 브랜치, 테스트와 구현, 검사 통과 후 초안 PR | 예 |
claude-code-review.yml | PR | 줄 단위 코멘트와 요약. 승인·거절은 하지 않음 | 예 |
claude-ci-fix.yml | CI 실패 | 실패 로그를 읽고 수정 PR 또는 진단 댓글 | 예 |
claude.yml | 댓글의 @claude | 질문 답변, 요청한 수정 | 예 |
claude-maintenance.yml | 매주 월요일 | 유지보수 리포트, 반복된 리뷰 지적을 규칙으로 바꾸자는 제안 | 예 |
ai-local-runner.yml | 위 이벤트 전부 | 사내 서버의 로컬 모델로 같은 작업 수행 | 예(로컬) |
AI 실행 주체
GitHub의 실행 서버는 매번 새로 만들어지는 빈 환경이라 로그인 정보가 없습니다. 그래서 서버에서 AI를 돌리려면 키가 필요합니다. 팀원 PC에는 이미 Claude 로그인이 있으므로 같은 작업을 내 자리에서 실행하면 키가 필요 없습니다. 어느 쪽을 쓸지는 레포 변수 AI_BACKEND 하나로 정합니다.
flowchart TD
Q1{"이벤트 발생 시
AI 자동 반응 필요?"}
Q1 -- 아니오 --> A["내 자리에서 실행
내 claude 로그인 · 설정 없음
사람이 명령할 때만"]
Q1 -- 예 --> Q2{"코드의 외부 전송
금지?"}
Q2 -- 예 --> B["사내 로컬 LLM
llama.cpp 또는 Ollama + 자체 러너
AI_BACKEND=local · 품질은 모델에 따라 다름"]
Q2 -- 아니오 --> C["Anthropic
구독 토큰 또는 API 키
AI_BACKEND=anthropic"]
내 자리에서 실행할 때는 아래 명령을 씁니다. POST=1을 붙일 때만 결과를 GitHub에 기록합니다. 서버 설정은 docs/13-ai-backends.md와 infra/local-llm/README.md에 있습니다.
make ai-triage ISSUE=42 # 분류 결과만 화면에 출력 make ai-triage ISSUE=42 POST=1 # 라벨 적용과 댓글 make ai-review PR=57 POST=1 # 리뷰 댓글 (승인하지 않음) make ai-implement ISSUE=42 POST=1 # 별도 폴더에서 구현 후 초안 PR make ai-queue POST=1 # ai:ready 이슈를 차례로 처리
여러 레포 운영
서비스 레포가 늘어날수록 레포마다 규칙이 달라집니다. 이 레포를 허브로 두고, 처음에는 템플릿 복사로 같은 상태를 만들고 이후에는 플러그인 갱신으로 유지합니다.
flowchart LR
subgraph HUB["허브 (이 레포)"]
T["템플릿 파일
규칙 · 양식 · 워크플로"]
M["플러그인 마켓플레이스
훅 · 스킬 · 서브에이전트"]
end
subgraph ORG["조직 설정 (선택)"]
W["재사용 워크플로 · 조직 룰셋"]
end
S1["svc-payments"]
S2["svc-auth"]
S3["web"]
T -- "make new-repo (처음 1회 복사)" --> S1 & S2 & S3
M -- "plugin update (계속 갱신)" --> S1 & S2 & S3
W -.-> S1 & S2 & S3
| 배포 대상 | 방법 | 갱신 |
|---|---|---|
| 규칙 · 양식 · 워크플로 · Makefile | 템플릿 복사: make new-repo REPO=org/svc | 복사 시점에 고정. 이후 동기화 PR(repo-file-sync, Copier) |
| 훅 · 팀 스킬 · 서브에이전트 | 플러그인 team-ai-workflow. 각 레포 .claude/settings.json에 등록 | 허브에서 버전을 올리면 claude plugin update로 반영 |
| 선택 스킬 | 플러그인 team-ai-community. 원하는 사람만 설치 | 같음 |
| CI 잡 | 재사용 워크플로와 조직 룰셋 "워크플로 통과 필수" | 버전 태그 고정 |
| CONTRIBUTING · SECURITY 등 | 조직의 .github 레포 기본값 | 레포에 같은 파일이 없으면 자동 적용 |
AI는 현재 레포 밖의 파일을 볼 수 없습니다. 여러 레포에 걸친 변경은 T2 설계 하나의 repos에 모든 레포를 적고 구현은 레포별 이슈로 나눕니다. 다른 레포를 함께 참고해야 하면 Claude Code에 --add-dir ../다른레포로 폴더를 추가합니다. 여러 AI를 동시에 돌릴 때는 AI마다 다른 파일을 맡기고 worktree로 작업 폴더를 나눕니다.
팀 규모 운영
AI의 코드 생성이 빨라지면 병목은 리뷰, 레포 간 계약, 반복되는 실수, 스킬 품질로 옮겨갑니다. 사람 리뷰를 어디에 둘지도 레포의 성격에 따라 정합니다.
| 병목 | 장치 | 차단 여부 |
|---|---|---|
| 리뷰 대기 | 1인당 리뷰 대기 PR 상한(기본 3), PR 템플릿의 Reviewer guide(먼저 볼 곳, 확인한 것, 못 한 것) | 알림만 |
| 레포 간 계약 | 설계의 "계약 변화" 절, contract: 영역, contract-check.yml | 깨지는 변경은 breaking-change 라벨 필요 |
| 같은 지적 반복 | 주간 리포트가 지난주 리뷰 댓글을 묶어 2번 이상 나온 주제마다 린트·테스트·규칙 한 줄을 제안 | 제안만 |
| 스킬 품질 | 스킬별 평가(필요할 때 호출하는지, 불필요할 때 호출하지 않는지), make ai-eval | 평가 없는 스킬은 경고 |
| 구분 | 프로토타입 PROFILE=prototype | 운영(기본) |
|---|---|---|
| PR · CI · 히스토리 보호 · 비밀 훅 | 유지 | 유지 |
| 사람 승인 · CODEOWNER · 에이전트 게이트 | 없음 | 1명 이상 |
| 운영 전환 조건 | 실사용자·실데이터, 다른 레포의 API 의존, 장애 호출, 운영 권한. 하나라도 생기면 운영으로 바꾸고 위험 구간 중심으로 한 번 전체 리뷰 | |
코드 리뷰는 없어지지 않고 앞 단계로 옮겨갑니다. 의도(설계·계약), 검증(테스트·계약 diff·평가), 위험 구간의 표본 리뷰가 대상입니다(docs/16-team-scale-ai.md).
글과 화면 기준
AI가 쓴 글과 화면에는 내용이 정확해도 과장된 수식어, 번역투, 보라색 그라데이션, 똑같은 카드 세 장 같은 흔적이 남고, 독자는 그 신호를 보고 내용까지 덜 믿습니다. 그래서 사람이 읽는 글과 사람이 쓰는 화면은 docs/17-writing-and-design-standards.md를 따릅니다.
| 대상 | 기준 | 스킬 |
|---|---|---|
| 글 | 합니다체 하나, 목록과 표는 개조식. 과장·번역투·의인화·독자에게 말 걸기 금지 | polish-writing |
| 내용 형식 | 설명은 짧은 문단, 실행할 것은 복사할 수 있는 명령, 3단계 이상이거나 행위자가 둘 이상이면 도식, 비교는 표 | polish-writing |
| 화면 | 디자인 시스템 "Clear"의 토큰과 컴포넌트만 사용. 라이트는 흰 바탕에 파란 강조색 하나, 다크는 그래파이트. 이 페이지도 같은 시스템 | polish-ui |
스킬은 모델이 필요하다고 판단할 때만 로드되므로 항상 쓰인다는 보장이 없습니다. 대신 기계로 판별할 수 있는 위반은 수정 직후 훅, pre-commit, CI가 같은 규칙으로 검사합니다(강제 장치 표의 포맷·스타일 훅과 pre-commit). 훅이 위반을 돌려주면 AI가 그 자리에서 고치므로 스킬을 부르지 않은 작업에도 기준이 적용됩니다.
두 스킬과 검사 규칙, 디자인 시스템의 원본은 다른 프로젝트에서도 쓸 수 있도록 별도 레포 jungrok5/ai-design에 있습니다. 이 레포는 마켓플레이스에 고정한 커밋 하나를 쓰고, team-ai-workflow를 설치하면 ai-design 플러그인이 의존성으로 함께 설치됩니다.
팀 스킬 추가
스킬은 개인, 커뮤니티, 팀 세 등급으로 추가합니다. 명령 하나가 등급에 맞는 뼈대와 평가 케이스를 만들고, 형식·버전·평가는 CI가 확인합니다(docs/18-adding-skills.md).
make new-skill NAME=x TIER=community DESC="..."
make ai-eval # 호출해야 할 때와 하지 않아야 할 때를 함께 평가시작하기
역할마다 처음 한 번 하는 일입니다. 설정이 끝났는지는 make doctor가 확인하고 남은 항목을 알려 줍니다.
팀원 (10분)
git,gh,jq설치 후 GitHub 로그인- Claude Code 설치 후 한 번 실행해 로그인
- 레포를 클론하고
make setup, "ALL CHECKS PASSED" 확인 - Claude Code에서
/onboard로 레포 구조 확인 - 매일 커밋 전
make check
gh auth login npm i -g @anthropic-ai/claude-code claude # 한 번 실행해 로그인 make setup # ALL CHECKS PASSED 확인
새 서비스 레포
- 허브 클론에서 새 레포 생성
AGENTS.md의 Project 섹션과CODEOWNERS작성labels.yml에area/*추가- 첫 PR로
ci-ok와 PR 검사 확인 - 이슈 하나로 전체 과정 시험
make new-repo REPO=org/svc-x make ai-implement ISSUE=1 POST=1
레포 관리자 (1회)
- Settings에서 기본 브랜치
main, Template repository 체크 - Actions 설정에서 "Allow GitHub Actions to create and approve pull requests" 체크
- squash 전용, 자동 머지, 비밀 스캔, 라벨, 룰셋 적용
- 서버 자동화가 필요하면
AI_BACKEND변수 설정
make github-setup
make doctor # 남은 설정 항목 확인파일 구조
원 숫자는 전체 구조의 층 번호입니다.
자주 묻는 질문
Copilot이나 Cursor만 쓰는 팀원에게도 적용됩니까?
적용됩니다. 두 도구 모두 AGENTS.md를 직접 읽습니다. Claude 훅은 적용되지 않으므로 같은 규칙을 pre-commit과 GitHub 룰셋에서 한 번 더 검사합니다.
훅이 수정을 막았습니다.
보호 경로에 대한 수정입니다. 비밀·락파일·정책 파일은 사람이 직접 수정하고 PR 본문에 이유를 적습니다. 전체 목록은 protect-files.sh에 있습니다.
수정 후 스타일 검사 결과가 나왔습니다. 모두 고쳐야 합니까?
error는 거의 항상 잘못된 표현이고 CI 실패 원인이므로 고칩니다. warning은 맥락을 보고 판단합니다. 나쁜 예시를 일부러 인용했다면 그 줄에 style-ignore를 표시합니다. 규칙이 잘못 잡으면 예외 표시를 늘리지 말고 규칙을 고칩니다.
규칙은 어떻게 바꿉니까?
AGENTS.md를 수정하는 PR을 열고 CODEOWNER 리뷰를 받습니다. 설계 결정이 바뀌면 /write-adr로 ADR도 씁니다. "지우면 AI가 실수하는가"를 통과한 줄만 추가하고 긴 설명은 docs/로 옮깁니다.