{
  "$schema": "https://unpkg.com/knip@5/schema.json",
  "entry": [
    "src/app/main.tsx",
    // 공개 API 표면 — 외부 소비 전제라 export가 미사용이어도 정상
    "src/entities/*/index.ts",
    // shared 세그먼트의 입구. 없으면 새 모듈을 추가할 때마다 직접 경로로 참조하게 되고
    // steiger(no-public-api-sidestep)가 막는다 — 입구가 먼저 있어야 막히지 않는다.
    "src/shared/api/index.ts",
    // shadcn·orval 생성물 — export 심사 제외(코드는 project로 여전히 추적)
    "src/shared/ui/**",
    "src/shared/api/_generated/**",
    "steiger.config.ts",
  ],
  "project": ["src/**/*.{ts,tsx}"],
  "ignore": [
    "src/pages/_gate-selftest/**",
    "src/shared/lib/_gate-selftest/**",
    // Result는 첫 사용처보다 먼저 있어야 하는 계약이다(.claude/rules/error-types.md).
    // 도메인이 필요해진 뒤에 만들면 그 슬라이스 안에 선언되고, 두 번째 도메인은
    // cross-slice import가 막혀 재선언한다 — 모양이 갈리면 공용 헬퍼를 영영 못 쓴다.
    "src/shared/lib/result.ts",
    // 골든샘플은 라우트에서 내려도 코드로 남는다(AI 참조 + 나머지 게이트가 계속 검증).
    // knip만 빼는 이유: 라우트 등록이 유일한 참조라, 첫 실제 화면이 루트를 가져가는 순간
    // 죽은 파일로 잡힌다. 그렇다고 라우트를 남기면 이번엔 배포 안전망이 "샘플이 외부에
    // 보인다"고 막는다 — 같은 파일에 정반대를 요구하는 두 규칙이라 한쪽을 놓아야 한다.
    "src/pages/sample-table/**",
  ],
  // 연결 대기 스텁은 /** @public */ 태그로 예외 (사유 주석 필수)
  "tags": ["-public"],
  "ignoreDependencies": [
    // 사전 탑재 스택 — 필요 시점의 임의 선택을 막기 위해 미리 결정·설치해 둔 라이브러리 (.claude/rules/dependencies.md)
    "dayjs",
    "es-toolkit",
    "@tanstack/react-table",
    "zustand",
    "qs",
    "@types/qs",
    // postinstall(scripts/ensure-hooks.sh) 안에서 호출 — 쉘 스크립트라 knip이 못 본다
    "husky",
    // CSS·플러그인 경유라 정적 분석에 안 걸리는 실사용 의존성
    "tailwindcss",
    "tw-animate-css",
    "@typescript-eslint/utils",
  ],
}
