kiwiz-devkit 0.5.0

키위즈 회사 공통 개발 키트

어느 프로젝트에서 어느 세션이 일해도
같은 파일 · 같은 이름 · 같은 계층.

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/) 프로젝트를 만듭니다.

  1. 준비물

    git · gh(gh auth login 뒤 gh auth setup-git), JDK 17 이상, Docker, Claude Code v2.1.277 이상, python3. Node는 Gradle이 받습니다.

  2. devkit 받기 (한 번만)

    git clone https://github.com/seokan80/kiwiz-devkit.git ~/Developer/kiwiz-devkit
    DEVKIT=~/Developer/kiwiz-devkit
  3. 프로젝트 만들기

    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
    옵션 값 뜻
    --java 17 · 21 · 25(기본) 고객사 JDK에 맞춰 고릅니다. Spring Boot 4와 의존성은 그대로이고 툴체인 · .sdkmanrc · java.md가 그 판으로 들어갑니다
    --router react-router(기본) · tanstack react-router + vite-plugin-pages 또는 TanStack Router(파일 기반). 웹 틀 · 시작 코드 · routing.md가 그 라우터 것으로 들어갑니다
    --with-gradle-config Gradle 골격 — 버전 카탈로그 · 서버 · 웹 빌드(웹 빌드 결과를 서버 jar에 넣음)
    --with-web-config 웹 설정 — package.json(정확한 판) · ESLint · Prettier · tsconfig · Vite
    --with-web-starter 웹 시작 코드 — 라우터 · 로그인 가드 · 페이지 · ApiError · 시험

    이미 있는 파일은 건드리지 않으므로 다시 돌려도 됩니다.

  4. 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을 봅니다.

  5. Claude Code 열기

    claude   # 이 폴더에서 열고 "이 폴더를 신뢰" → 마켓플레이스 kiwiz 등록 · 플러그인 kiwiz 켜짐

    세션에서 /plugin을 열어 kiwiz@kiwiz가 켜졌는지 봅니다. /kiwiz:api · /kiwiz:screen · /kiwiz:setup이 보이면 됩니다.

  6. 채우고 첫 커밋

    • 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처럼 씁니다.

kiwiz:api

Spring Boot API 하나

시험 먼저 → 오류 코드 → record → 서비스 → 컨트롤러 → 계약 → 문서 → 검증. 점검표가 함께 있습니다.

kiwiz:screen

React 화면 하나

명세 · 시안 → 페이지 파일 · 데이터 훅 · 로직 훅 · 그리기 · 문구 · 시험. 목록 · 상세 · 폼 등 화면 유형 5종.

kiwiz:setup

붙이기 · 갱신 · 검사

폴더 · 옵션을 사람에게 확인받고 init-project.sh · sync-rules.sh를 돌립니다.

hook

저장할 때 서식

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