프로젝트 소개

AI Shipcheck는 주로 AI 코딩 도구로 작성된 앱을 대상으로 하는 로컬 우선 프로덕션 준비 스캐너입니다. 전제는 이렇습니다. AI 어시스턴트는 실행되는 코드를 만드는 데는 능하지만 프로덕션에서 살아남는 코드를 만드는 데는 덜 능하며, 어느 경우든 작업을 완료했다고 보고합니다. Shipcheck는 반복적이고 지루한 격차를 찾습니다. 행 수준 보안이 없는 Supabase 테이블, 호출자를 확인하지 않고 쓰는 라우트 핸들러, 비밀을 담은 NEXT_PUBLIC_ 변수, 속도 제한이나 토큰 상한이 없는 LLM 엔드포인트 같은 것들입니다. 사용법은 단일 명령입니다: npx ai-shipcheck . 가입도, API 키도, 소스 업로드도 없습니다. Node.js 22 이상이 필요합니다. 옵션으로는 --fail-on(예: critical), --min-score, --format(json, markdown, sarif), 그리고 규칙이 존재하는 이유와 수정 방법을 문서화하는 explain 하위 명령이 있습니다. 발견 사항만으로 명령이 실패하지는 않습니다. 임계값은 선택 사항이므로 기존 파이프라인에 추가해도 되돌릴 수 있습니다. 종료 코드는 임계값 충족, 미충족, 사용 오류, 내부 오류를 구분합니다. 검사 항목 9개 범주가 독립적으로 점수화되며, 63개 규칙이 이를 뒷받침합니다. 각 규칙에는 문서, 취약한 픽스처, 안전한 픽스처, 테스트가 있습니다: - 보안: 하드코딩된 자격 증명, NEXT_PUBLIC_ 뒤의 비밀, eval, 셸 주입, 오픈 리다이렉트, 허용적 CORS, 비활성화된 TLS 검증, 약한 암호화. - 인증: 권한 부여 검사 없는 쓰기 라우트, 인증되지 않은 서버 액션, 브라우저 전용 권한 검사, 검증되지 않은 웹훅, 서명되지 않은 JWT, 노출된 서비스 역할 키. - 데이터베이스: 행 수준 보안 없는 테이블, USING (true) 정책, 보간으로 구성된 SQL, 필터 없는 삭제, 파괴적 마이그레이션. - 신뢰성: 삼켜진 오류, 요청 경로의 누락된 타임아웃, 처리되지 않은 거부, 백오프 없는 재시도, 타입 오류를 무시하는 빌드. - 테스트: 테스트 없음, 테스트/빌드/타입체크가 빠진 CI, 커밋된 .only, 참조 테스트가 없는 서버 코드. - 관측성: 오류 모니터링 없음, 콘솔 전용 서버 로깅, React 오류 경계 없음. - 성능: 무제한 쿼리, 핸들러의 동기 I/O, N+1 형태, 무거운 클라이언트 임포트. - 접근성: 누락된 대체 텍스트, 비대화형 요소의 클릭 핸들러, 레이블 없는 폼 컨트롤, 양수 tabIndex. - AI 비용: 인증이나 속도 제한 없는 LLM 엔드포인트, 토큰 상한 없음, 요청으로 제어되는 모델 선택, 브라우저의 제공자 키. 감지되는 스택에는 Next.js(두 라우터 모두), React, Vite, Express, Fastify, Hono, NestJS, Remix, Astro, SvelteKit, Nuxt, Supabase, Firebase, Prisma, Drizzle, Mongoose, Stripe, OpenAI, Anthropic, Vercel AI SDK, LangChain, tRPC 및 일반적인 테스트 러너가 포함됩니다. 프레임워크별 규칙은 프레임워크가 감지될 때만 실행되며 모노레포도 포함됩니다. 출력 및 통합 보고서는 점수, 판정, 범주별 막대, 그리고 파일, 줄, 규칙, 심각도, 신뢰도를 포함한 발견 사항을 보여줍니다. 차단 요소는 점수와 무관하게 NOT READY를 강제합니다. 평가할 수 없는 범주는 공짜 100점을 주는 대신 제외됩니다. GitHub Action은 diff에 발견 사항을 인라인으로 주석 처리하고, 작업 요약에 Markdown 보고서를 작성하며, 코드 스캔용 SARIF를 생성하고, score, verdict, critical-count, high-count를 출력합니다. 단일 커밋된 파일로 번들되어 태그로 고정된 워크플로가 정확히 그 코드를 실행합니다. 신뢰와 범위 이 도구는 네트워크 호출을 하지 않고 텔레메트리를 보내지 않습니다. 스캔된 저장소의 어떤 것도 실행되지 않습니다. 파일은 바이트로 읽히고 어휘적으로 분석됩니다. 비밀은 출력될 수 있는 모든 곳에서 마스킹되고, 스캔은 제한되며 잘렸을 때 그렇게 알립니다. 런타임 의존성은 하나입니다. 명시된 한계는 분명합니다. JavaScript와 TypeScript만 지원합니다. 분석은 의미론적이 아니라 어휘적이며, 파일 간 추론이나 타입 정보가 없고 오염 추적은 값을 한 홉만 따라가므로 인식하지 못하는 사용자 정의 인증 래퍼는 거짓 양성을 낼 수 있습니다. Express와 Fastify 라우트는 인증 규칙의 적용을 받지 않으며, 이는 가장 큰 알려진 격차로 설명됩니다. 인프라는 보이지 않으므로 대시보드에서 RLS가 활성화되었지만 마이그레이션에는 없는 테이블은 안전이 아니라 미평가로 보고됩니다. 깨끗한 보고서는 이 도구가 할 줄 아는 검사가 아무것도 찾지 못했다는 뜻이지 코드가 올바르다는 뜻이 아닙니다. 규칙은 커밋 SHA로 고정된 20개 공개 저장소에 대해 검증되었습니다. 그 출력을 분류한 결과 발견 사항이 5,710개에서 2,819개로 줄었고 여러 줄 주석이 있는 파일의 줄 번호에 영향을 주는 렉서 버그가 드러났다고 합니다. 문서는 규칙, CLI 계약, 구성, 점수화, 신뢰 모델, 한계, 위협 모델, 아키텍처, 규칙 추가, 릴리스, 거버넌스를 다룹니다. 라이선스는 MIT입니다.