키위즈 회사 공통 개발 키트
어느 프로젝트에서 어느 세션이 일해도
같은 파일 · 같은 이름 · 같은 계층.
Claude Code 플러그인 kiwiz, 회사 공통 경로 규칙, 프로젝트 틀과 시작 도구, 개발 가이드를 저장소 하나에
모았습니다. 새 프로젝트는 명령 한 줄로 시작하고, 이미 있는 프로젝트에도 붙일 수 있습니다.
- Spring Boot 4
- Java 17 · 21 · 25
- Gradle Kotlin DSL
- React 19 · TypeScript · Vite
- react-router 또는 TanStack Router
- PostgreSQL
- Claude Code
왜 만들었나
앱이 의존성으로 받는 라이브러리(jar · npm 패키지)가 아닙니다. 사람과 LLM이 같은 방식으로 일하게 하는 규칙과 도구입니다.
같은 일엔 같은 결과
규칙 없이 LLM에게 반복 작업을 시키면 세션마다 파일 위치 · 이름 · 계층이 달라졌습니다.
프로젝트마다 다시 정하지 않게
서식 · 폴더 · 라우팅 · 상태 관리 · 오류 모양을 매번 고르면 사람도 LLM도 매번 새로 배워야 합니다.
회사 역량으로
LLM 개발 방식을 한 사람의 요령이 아니라 저장소로 남깁니다. 폐쇄망 현장에서도 같은 규칙을 씁니다.
4층 구조
Claude Code 플러그인으로 줄 수 있는 것은 스킬 · hook · 에이전트 · MCP뿐입니다. 그래서 경로 규칙은 판을 고정한 사본으로 프로젝트에 넣습니다.
| 층 | 어디에 | 언제 읽히나 | 무엇 |
|---|---|---|---|
| ① 상시 규칙 | 프로젝트 AGENTS.md |
세션을 시작할 때 | 하지 않는 것 · 작업 흐름 · 코드 규칙 요약 |
| ② 경로 규칙 | .claude/rules/kiwiz/(사본) + .claude/rules/project/(고유) |
그 경로의 파일을 다룰 때 | 서버 · 마이그레이션 · 웹 · 라우팅 · Java 판 · 문서 영역에서 늘 지킬 것 |
| ③ 스킬 | 플러그인 kiwiz |
그 일을 할 때 | kiwiz:api · kiwiz:screen · kiwiz:setup — 순서 · 만들 파일 · 점검표 |
| ④ 기계 검사 | 플러그인 hook + 프로젝트 린트 · 시험 | 늘 | 저장할 때 Prettier · ESLint, 색 리터럴 · 기능 경계 린트, 규칙 사본 검사 |
Java 판과 웹 라우터처럼 프로젝트마다 다른 규칙은 고른 값 하나만 사본으로 들어갑니다(java.md ·
routing.md). 고른 값은 kiwiz.lock에 남고, 다음 갱신도 그 값을 씁니다.
새 프로젝트 시작하기
빈 폴더에서 Spring Boot + React 멀티모듈(backend/ · frontend/) 프로젝트를 만듭니다.
-
준비물
git · gh(
gh auth login뒤gh auth setup-git), JDK 17 이상, Docker, Claude Code v2.1.277 이상, python3. Node는 Gradle이 받습니다. -
devkit 받기 (한 번만)
git clone https://github.com/seokan80/kiwiz-devkit.git ~/Developer/kiwiz-devkit DEVKIT=~/Developer/kiwiz-devkit -
프로젝트 만들기
mkdir -p ~/Developer/work/my-app && cd ~/Developer/work/my-app git init -b main $DEVKIT/plugins/kiwiz/scripts/init-project.sh . --name my-app --java 25 --router react-router \ --with-gradle-config --with-web-config --with-web-starter옵션 값 뜻 --java17·21·25(기본)고객사 JDK에 맞춰 고릅니다. Spring Boot 4와 의존성은 그대로이고 툴체인 · .sdkmanrc·java.md가 그 판으로 들어갑니다--routerreact-router(기본) ·tanstackreact-router + vite-plugin-pages 또는 TanStack Router(파일 기반). 웹 틀 · 시작 코드 · routing.md가 그 라우터 것으로 들어갑니다--with-gradle-configGradle 골격 — 버전 카탈로그 · 서버 · 웹 빌드(웹 빌드 결과를 서버 jar에 넣음) --with-web-config웹 설정 — package.json(정확한 판) · ESLint · Prettier · tsconfig · Vite--with-web-starter웹 시작 코드 — 라우터 · 로그인 가드 · 페이지 · ApiError· 시험이미 있는 파일은 건드리지 않으므로 다시 돌려도 됩니다.
-
Gradle 래퍼 · 웹 확인
gradle wrapper --gradle-version 9.8.1 --distribution-type bin \ --gradle-distribution-sha256-sum dce76f55f8e251a3a1f130eb120f30b3d271de2b76c9b0729d316b5a1b6dc01f cd frontend && npm install && npm run check # 타입 · 린트 · 서식 · 시험 cd .. && ./gradlew build # 서버 시험 + 웹 검사 + 웹 빌드 + jar서버 시작 코드(
Application·package-info· 모듈 시험)는 아직 손으로 만듭니다. 자세한 것은 문서 01을 봅니다. -
Claude Code 열기
claude # 이 폴더에서 열고 "이 폴더를 신뢰" → 마켓플레이스 kiwiz 등록 · 플러그인 kiwiz 켜짐세션에서
/plugin을 열어kiwiz@kiwiz가 켜졌는지 봅니다./kiwiz:api·/kiwiz:screen·/kiwiz:setup이 보이면 됩니다. -
채우고 첫 커밋
AGENTS.md의TODO를 채웁니다(설계 문서 위치 · 검증 명령 · 병합 절차).- 검증 스크립트에
./gradlew build와scripts/kiwiz/check-rules.sh를 넣습니다. - 첫 화면 · 첫 API가 병합되면
.claude/rules/project/의 정답 파일 표에 등록합니다. CLAUDE.md는 개인 메모라 커밋하지 않습니다. 공유 규칙은AGENTS.md에 둡니다.
기존 프로젝트에 붙이기
이미 있는 파일은 덮어쓰지 않습니다. 규칙 사본(.claude/rules/kiwiz/)과 검사 스크립트만 devkit 것을
넣습니다. 작업 브랜치에서 합니다.
| 저장소 모양 | 명령 |
|---|---|
| 서버 · 웹 멀티모듈 | $DEVKIT/plugins/kiwiz/scripts/init-project.sh . |
| 웹만 있는 저장소 | init-project.sh . --web . --server none |
| 서버만 | init-project.sh . --web none |
| 폴더 이름이 다름 | init-project.sh . --web web --server api |
- Java 판은
gradle/libs.versions.toml의java에서, 라우터는 웹package.json의 의존성에서 알아냅니다. 다르게 적어야 할 때만--java·--router를 줍니다. .claude/settings.json에는 마켓플레이스kiwiz와kiwiz@kiwiz켜기만 더해지고, 다른 키는 그대로 둡니다.- 프로젝트에 있던 경로 규칙 · 스킬 · 서식 hook은 회사 공통과 겹치는 부분을 지우고, 프로젝트 고유만
.claude/rules/project/와 프로젝트 스킬에 남깁니다.
스킬 · hook
Claude는 스킬 설명을 늘 보고 있다가 일이 맞으면 스스로 엽니다. 직접 부를 때는 /kiwiz:screen처럼
씁니다.
Spring Boot API 하나
시험 먼저 → 오류 코드 → record → 서비스 → 컨트롤러 → 계약 → 문서 → 검증. 점검표가 함께 있습니다.
React 화면 하나
명세 · 시안 → 페이지 파일 · 데이터 훅 · 로직 훅 · 그리기 · 문구 · 시험. 목록 · 상세 · 폼 등 화면 유형 5종.
붙이기 · 갱신 · 검사
폴더 · 옵션을 사람에게 확인받고 init-project.sh · sync-rules.sh를 돌립니다.
저장할 때 서식
Claude가 웹 파일을 고치면 그 웹 폴더의 Prettier · ESLint로 맞춥니다. 남은 린트 오류는 Claude에게 보여 다음 수정에서 고칩니다.
hook을 끄려면 개인 설정 .claude/settings.local.json에
{ "env": { "KIWIZ_FORMAT": "off" } }를 넣습니다. 완료 판정은 hook이 아니라 늘 프로젝트 검증
스크립트로 합니다.
규칙 갱신 · 판 관리
스킬 · hook은 플러그인 판이 오르면 팀원 PC에 퍼집니다. 규칙 사본은 각 프로젝트가 sync-rules.sh를
돌려 PR로 받을 때만 바뀝니다.
# 새 판 받기 — Java 판 · 라우터 · 폴더는 kiwiz.lock의 값을 씁니다
$DEVKIT/plugins/kiwiz/scripts/sync-rules.sh .
git diff .claude/rules/kiwiz
# 검사 — 프로젝트 검증 스크립트에 넣습니다
scripts/kiwiz/check-rules.sh
팀원 PC의 플러그인은 Claude Code 세션에서 /plugin marketplace update kiwiz로 새 판을 받습니다. 자동
갱신을 켜 두면 세션을 시작할 때 저절로 받습니다.
| 검사 결과 | 뜻 | 할 일 |
|---|---|---|
| 0 그대로 | 사본이 lock의 판 그대로 | — |
| 1 고쳐짐 · 모르는 파일 | 누가 사본을 고쳤거나 다른 .md가 있음 | 프로젝트 고유는 .claude/rules/project/로 옮기고 sync로 되돌립니다. 회사 공통이어야 하면 kiwiz-devkit에 PR |
| 2 lock이 없음 | devkit을 붙이지 않았거나 옛 이름의 lock | init-project.sh 또는 sync-rules.sh |
옛 이름 kiwiz-core에서 옮기기 (0.5.0)
0.4.0까지는 저장소와 플러그인 이름이 kiwiz-core였습니다. sync-rules.sh를 한 번 돌리면
lock 이름(kiwiz.lock), settings의 플러그인 키(kiwiz@kiwiz), 저장소 주소가 새 이름으로
바뀝니다. 문서의 스킬 이름(kiwiz-core:api → kiwiz:api)은 손으로 고칩니다.
git remote set-url origin https://github.com/seokan80/kiwiz-devkit.git # 받아 둔 devkit 사본
claude plugin uninstall kiwiz-core@kiwiz # 팀원 PC — 옛 플러그인 지우기
문제 풀기
| 증상 | 확인 |
|---|---|
| 스킬이 안 보인다 | /plugin에서 kiwiz@kiwiz가 켜졌는지, 폴더를 신뢰했는지 봅니다(신뢰 전에는 프로젝트 settings의 마켓플레이스를 쓰지 않습니다) |
| "enabled … but isn't installed" | claude plugin install kiwiz@kiwiz --scope project |
| 마켓플레이스를 못 받는다 | 비공개 저장소라 읽기 권한이 필요합니다. gh auth login → gh auth setup-git, SSH 키가 없으면 CLAUDE_CODE_PLUGIN_PREFER_HTTPS=1 |
| 새 판이 안 온다 | /plugin marketplace update kiwiz 또는 claude plugin update kiwiz@kiwiz. 자동 갱신은 /plugin → Marketplaces → kiwiz |
| 인터넷이 막힌 현장 | 사내 git · 공유 폴더 마켓플레이스 · 미리 채운 플러그인 폴더 — 문서 06 |
문서
저장소가 비공개라 문서를 열려면 GitHub 읽기 권한이 필요합니다. 권한은 저장소 주인에게 받습니다.