체크리스트 시스템
코드 수정 시 자동으로 품질/보안/문서 검증을 수행하고, 프로젝트별 리포트를 관리하며, /-msk-checklist-review로 미해결 항목을 검토하는 시스템입니다.
전체 흐름
코드/문서 수정
↓ PostToolUse Hook
↓ checklist-validator.sh 실행
↓ validators/*.sh (자동 검사)
↓ projects/{project}/latest.json 저장
↓
다음 턴
↓ <checklist-review> 태그로 AI에게 주입
↓ tmux 4줄: [code]15/35 +20r [doc]3/5 +2r 13:21
↓
사용자: /-msk-checklist-review
↓ 항목별 AI 설명 → 승인/수정/보류
↓ 리포트 갱신
41항목 7분류
보안 (Security) — 9항목
| ID | 항목 | 자동 | 설명 |
|---|---|---|---|
| S1 | 하드코딩 시크릿 | ✅ | API키, 비밀번호, 토큰 패턴 탐지 |
| S2 | SQL Injection | ✅ | Raw SQL, 바인딩 미사용 |
| S3 | XSS | ✅ | {!! !!}, dangerouslySetInnerHTML |
| S4 | Authorization | AI | CRUD+READ 전체 권한 검사. 타 테넌트 자원은 404 반환 |
| S5 | 테넌트 격리 | ✅+AI | Global Scope 적용, cross-tenant 차단 |
| S6 | 입력 검증 | ✅ | FormRequest 존재, $request->all() 금지 |
| S7 | CSRF/CORS | ✅ | CSRF 토큰, CORS 과다 허용 방지 |
| S8 | 에러 정보 노출 방지 | ✅ | production stack trace, internal path 차단 |
| S9 | 의존성 취약점 | ✅ | composer audit + npm audit |
테넌트 격리 (S5)
Multi-tenant SaaS에서 가장 치명적인 사고는 cross-tenant 데이터 유출입니다. 모든 Eloquent 모델에 tenant scope가 적용되어 있는지 확인합니다.
안정성/운영 (Reliability) — 5항목
| ID | 항목 | 자동 | 설명 |
|---|---|---|---|
| R1 | 에러 핸들링 패턴 | AI | try-catch 일관성, 사용자 친화적 에러 메시지 |
| R2 | 구조화 로깅 | ✅+AI | Log:: 호출에 context array 포함, 계층적 로그 채널 |
| R3 | PII 마스킹 | ✅ | 로그에 비밀번호, 토큰, 이메일 노출 금지 |
| R4 | Rate Limiting | ✅ | 인증 엔드포인트에 throttle 미들웨어 |
| R5 | 트랜잭션/멱등성 | AI | DB::transaction, 중복 요청 방지 |
데이터/성능 (Data & Performance) — 5항목
| ID | 항목 | 자동 | 설명 |
|---|---|---|---|
| D1 | N+1 쿼리 방지 | AI | Eager loading 사용 |
| D2 | DB 마이그레이션 안전성 | ✅ | drop/rename 탐지, down() 존재, large table lock 경고 |
| D3 | 인덱스 검토 | AI | 쿼리 패턴 대비 인덱스 존재 |
| D4 | 캐싱 전략 | AI | TTL, invalidation, Redis fallback |
| D5 | 환경 설정 정합성 | ✅ | .env.example 키 vs config/ env() 교차 검증 |
품질 (Quality) — 7항목
| ID | 항목 | 자동 | 설명 |
|---|---|---|---|
| Q1 | SOLID 원칙 | AI | 단일 책임, 인터페이스 분리, 의존성 역전 |
| Q2 | DRY 원칙 | AI | 중복 코드 탐지 |
| Q3 | 아키텍처 적절성 | AI | Core/Plugin/프로젝트 계층 준수 |
| Q4 | 하드코딩 방지 | ✅ | config(), env() 사용, magic number 금지 |
| Q5 | 타입 힌트 | ✅ | 함수 파라미터/리턴 타입 |
| Q6 | 디버그 코드 제거 | ✅ | dd(), dump(), console.log |
| Q7 | 외부 패키지 검토 | AI | 직접 구현 전 기존 솔루션 확인. 필요시 웹 검색 후 건의 |
국제화 (i18n) — 4항목
| ID | 항목 | 자동 | 설명 |
|---|---|---|---|
| I1 | 하드코딩 문자열 금지 | ✅ | __(), trans() 사용 확인 |
| I2 | 타임존 처리 | ✅+AI | DB=UTC 저장, 표시=DISPLAY_TIMEZONE |
| I3 | 언어팩 구조 | AI | 번역 키 일관성, 누락 키, namespace 분리 |
| I4 | 날짜/숫자 포맷 | AI | Carbon locale, Number::format locale 기반 |
글로벌 제품 지향
모든 프로젝트는 글로벌 출시를 전제합니다. UI 문자열은 반드시 번역 함수를 통해 표시하고, 날짜/시간은 UTC 저장 + 사용자 타임존 표시 원칙을 따릅니다.
테스트 (Testing) — 5항목
| ID | 항목 | 자동 | 설명 |
|---|---|---|---|
| T1 | 테스트 파일 존재 | ✅ | 새 코드에 대응 테스트 |
| T2 | 테스트 커버리지 | ✅ | 최소 기준 충족 |
| T3 | 엣지 케이스 | AI | 경계값, null, 빈 배열, 권한 없는 사용자 |
| T4 | 코드와 함께 테스트 | ✅ | 파일 생성 시 테스트도 함께 |
| T5 | TDD (보안/Core) | AI | Core/Permission, Core/Tenant는 테스트 먼저 |
문서 (Documentation) — 6항목
| ID | 항목 | 자동 | 설명 |
|---|---|---|---|
| DC1 | README 업데이트 | AI | 기능 추가/변경 시 반영 |
| DC2 | API 문서화 | AI | 엔드포인트 추가 시 문서 |
| DC3 | 문서 형식 | ✅ | Markdown 구조, frontmatter |
| DC4 | 문서 정합성 | AI | 코드↔CLAUDE.md/AGENTS.md 동기화 |
| DC5 | 설계 문서 유지 | AI | _docs/design/ 과 코드 일치 |
| DC6 | Git 커밋 메시지 | ✅ | type(scope): subject 형식 |
검증 레벨
새 작업 시작
│
├─ 파일 3개 이하 & 10줄 미만?
│ YES → 🟢 minimal (~10항목)
│
├─ 기존 기능 수정/확장?
│ YES → 🟡 standard (~25항목)
│
└─ 새 기능/아키텍처/DB 변경?
YES → 🔴 full (41항목)
레벨은 변경된 파일 수와 종류에 따라 자동 감지됩니다.
tmux 표시
상태바 4줄 우측에 프로젝트별 체크리스트 상태:
[code]15/35 ok [doc]3/5 +2r 13:21
[code]= 보안 + 안정성 + 데이터 + 품질 + 국제화 + 테스트[doc]= 문서- 색상: 초록(
ok), 노랑(+Nr), 빨강(!Nf) - 프로젝트별 독립 표시 (tmux 세션 기준)
수동 리뷰 (/-msk-checklist-review)
tmux에서 +Nr이 표시될 때 실행:
사용자: /-msk-checklist-review
↓
AI: [1/N] SOLID 원칙 — 설명 + 관련 파일 + 분석
→ 선택: 1)통과 2)수정 3)보류 4)중단
↓
사용자: 1 (통과)
→ 리포트 갱신, 다음 항목으로
↓
... 반복 ...
↓
AI: 완료 보고 — CK 15/35 +20r → 25/35 +10r
자동 검사 스크립트
| 스크립트 | 검사 항목 |
|---|---|
coding.sh | 하드코딩, 타입힌트, 디버그코드 |
security.sh | 시크릿, SQLi, XSS |
validation.sh | FormRequest 존재, $request->all() 금지 |
dependency.sh | composer audit + npm audit |
migration.sh | drop/rename 탐지, down() 존재 |
documentation.sh | 문서 형식 |
git.sh | 커밋 메시지 |
testing.sh | 테스트 존재, 커버리지 |
위치: .ai-core/scripts/validators/
설정
.ai-core/config/global.json:
{
"checklist": {
"enabled": true,
"level": "standard",
"code_extensions": "php|js|jsx|ts|tsx|py|go|java|rb|sh|rs|...",
"doc_extensions": "md|mdx|txt|rst|adoc"
}
}