insane-review
왜 존재하나: GPT Pro(최신 플래그십 모델의 Pro 추론)는 웹(구독)에서만 쓸 수 있고 API가 없다. 그래서 Codex CLI·omc ask·agent-council의 기존 API provider로는 못 부른다. 이 스킬은 구독 ChatGPT 웹을 자동화해 Pro를 Claude Code 안으로 끌어오는 유일한 경로다. API 비용 0, 사용자의 요금제로 동작.
핵심 가치는 "통째 패킹"이 아니라 "의도 파악 → 관련 타겟만 정밀 선별 → 그것만 패킹" 이다. 이 선별을 Claude(너)가 수행하는 것이 이 도구의 차별점이다.
선행 조건 — 선택지 기반 온보딩 (사용자에게 CLI 타이핑 금지)
커맨드 Step 0이 이걸 자동화한다. Claude가 --check-env를 직접 돌려 마지막 STATUS node=… deps=… browser=… login=…을
파싱하고, 막힌 단계마다 AskUserQuestion 선택지로 물어본 뒤 Claude가 대신 실행한다(--install, 브라우저 실행, 재점검).
초보자는 클릭만으로 따라온다.
- deps(
playwright·pyperclip): 없으면 "지금 자동 설치" 선택 →--check-env --install. (npx/repomix는npx -y로 완전 자동.) - browser: 크로미움 계열 브라우저가 디버그포트(9222)에 전용 프로필로 떠 있어야 함(주 브라우저와 격리; Chrome 136+는 전용 프로필 없으면 CDP가 안 열림). 없으면
--check-env의BROWSERS …목록으로 브라우저를 고르게 한 뒤 Claude가pack_and_ask.py --launch-browser "<이름>"(크로스플랫폼 mac/win/linux·전용 프로필·선택 자동 저장)을 실행. 1개뿐이면 전용 브라우저 1개 설치를 권장. (쿠키는 전용 프로필에 보존 → 로그인 유지.) - launch_mode(최초 1회 질문): STATUS에
launch_mode=unset이면 AskUserQuestion으로 한 번 물어--set-launch-mode <값>으로 저장한다(이후 재질문 없음). 선택지는background(권장·기본) /foreground둘을 앞에 두고,headless는 "권장 안 함" 표기와 함께 마지막에 둔다. 사용자가 답을 안 주거나 넘기면 background로 진행한다(미설정 기본값도 background라 그대로 동작). 값이 이미 있으면 묻지 말 것. 나중에 바꾸려면--set-launch-mode <값>(envINSANE_REVIEW_LAUNCH_MODE가 config보다 우선). 세 모드의 실측 결과(2026-08-26, macOS):background(기본):open -g로 띄우고, playwright가 새 탭을 만들 때 앱이 앞으로 나오므로 탭 생성 직후 다시 숨긴다. ChatGPT는 정상 브라우저로 인식 → 왕복 성공. 포커스를 안 뺏어 작업 흐름이 안 끊긴다.foreground: 창이 뜨고 앞으로 나온다. 왕복은 되지만 하던 일이 끊긴다. 진행 상황을 눈으로 보고 싶을 때만.headless(--headless=new): 창이 아예 없다. 하지만 ChatGPT가 컴포저를 안 내줘 전송이 실패한다(쿠키가 유효해도ChatGPT 컴포저 미확인으로 재시도 소진 — CF 챌린지 추정). 권장하지 않음; 굳이 쓰려면--check-env로login=ok를 확인하고, 실패하면 즉시 background로 되돌릴 것.
- login:
--check-env의 로그인 프로브가login=no면, "방금 연 브라우저에서 chatgpt.com 로그인 + Pro 추론 선택" 후 "로그인 완료" 선택 → 재점검. 로그인은 자동 불가 → 반드시 사용자에게 요청(에러로 끝내지 말 것). - 모델 Pro 티어: 스크립트
--model pro가 추론단계 Pro를 자동선택·검증한다. Pro 티어는 플래그십 모델에만 존재하므로, 모델명을 못박지 않아도 "현 최신 플래그십 + 최대 추론"이 보장된다(GPT 버전이 올라가도 자동 추종). 안 되면 사용자가 1회 수동 설정하면 새 채팅이 상속. (특정 모델명으로 고정하려면--require-model "<이름>"옵션을 추가.)
핵심 절차 (검토/수정/리뷰 요청을 받았을 때)
1) 의도 파악
사용자가 GPT Pro에게 무엇을 묻고 싶은지 한 문장으로 정리한다. (버그 원인? 설계 리뷰? 리팩터 방향? 특정 함수 검증?)
2) 타겟 선별 — 완전한 관련 집합을 네가(Claude) 판단 (사용자가 누락을 잡아주는 구조면 안 된다)
"repomix로 무엇을 넣을지 = 무엇이 완전한 관련 집합인지", "repomix만으로 충분한지 vs 관련 파일을 다 넣어야 하는지"의 판단은 네 책임이다. 기본은 "넓게, 빠짐없이":
- 단일 모듈/플러그인/기능 리뷰면 그 디렉토리를 통째로 넣어라(
--target <dir>,--include생략 또는 광범위). 코드 한 파일만 넣으면 실행지시서·설정·통합 맥락이 빠진다(실측:bin/**만 넣어 3파일 → README/command/config 누락). - 더 넓은 범위면 지목 파일에서 import/require·호출자·피호출자(grep/LSP
find_references/goto_definition)·테스트·타입·설정까지 추적해 집합을 닫는다. - 패킹 후
📦 패킹 포함 N개 파일감사 목록이 네가 의도한 완전한 집합을 담았는지 직접 확인한다(§3.5). 사용자가 지적하기 전에 네가 잡아라. - 결과를 정확한 파일 목록(→
--stdin) 또는 글롭(→--include "src/auth/**,*.test.ts")으로 만든다. - 코드 리뷰/원인분석은 풀 코드로 보내라 —
--compress쓰지 마라. 압축은 함수 본문(조건·early return·예외·루프 = 버그 판단 근거)을 제거해 리뷰 AI가 구현을 상상하게 만든다(실측: 본문 58% 손실 → false-positive·fail-open 폭증). 멀티 AI 합의(GPT-5.5 Pro·codex·agy·gjc)로 확정. - 타겟이 너무 커서 컨텍스트를 넘기면 압축하지 말고
--include로 관련 파일만 좁혀 풀로 보낸다.--compress는 오직 "큰 레포 개요"(정확성 리뷰 아님)용.
3) 패킹 + 투입 + 회수 — 스크립트 실행
python3 <plugin>/bin/pack_and_ask.py \
--target <repo_root> --include "<관련 파일 글롭>" \
--model pro \
--prompt "<의도를 담은 정확한 질문 — '판정마다 파일/라인/코드조각을 인용하라'를 반드시 포함>"
또는 정확한 파일 목록을 직접 줄 때(레포를 cwd로):
printf "src/a.ts\nsrc/b.ts\n" > /tmp/files.txt
# (현재 스크립트는 --include 기반; 정밀 목록은 --include 글롭으로 대체하거나 repomix --stdin 직접 사용)
레포 없이 순수 질문(의견)만: --target 생략 → 프롬프트만 전송.
python3 <plugin>/bin/pack_and_ask.py --model pro --force-answer-after 90 \
--prompt "<질문>"
3.5) 누락 검증 — 빠진 파일 없는지 감사
패킹 직후 출력의 📦 패킹 포함 N개 파일: ... 목록이 의도한 관련 파일을 전부 담았는지 확인한다. 빠진 게 있으면 repomix가 떨어뜨린 것 — 원인별 대응:
🔒 secretlint: 의심 파일 N개 제외→ 시크릿 든 파일이 통째 빠짐(숨은 누락). 그 파일이 리뷰 대상이면 시크릿을 가린 사본을 따로 넣거나--no-security-check(외부 유출 주의).- 기본 ignore/
.gitignore가 떨어뜨림 →--no-default-patterns/--no-gitignore. - 서브모듈 파일이 빠짐(부모서 패킹) → 서브모듈 안에서
--target. ⚠️ pack이 큼(truncation)경고 → ChatGPT가 잘라먹을 수 있으니--include로 더 좁히거나 여러 번 나눠 보낸다.- 손실 플래그 금지:
--compress/--remove-comments/--remove-empty-lines는 내용을 누락시키니 리뷰엔 쓰지 않는다. 라인번호는 기본 ON(인용용).
4) 회수 & 반영
- 응답은 **현재 프로젝트의
.insane-review/response_*.md**에 저장되고, stdout 끝에 미리보기가 나온다. - 그 의견을 읽고 GPT Pro의 의견임을 명시하여 사용자에게 반영/요약한다(모델명은 리포트 상단
- 모델:라인의 실제 검증된 이름을 인용). 동의/이견을 너의 판단과 함께 제시하라.
주의/가드 (실측 기반)
- git submodule: 부모 레포 루트에서 서브모듈 파일은 repomix가 제외한다. 서브모듈 안에서 실행하거나
--target <submodule>또는--no-gitignore --no-default-patterns. - 압축은 코드 파일만 줄인다(마크다운/문서 위주 폴더엔 무효).
- 정밀 리뷰엔
--force-answer-after를 쓰지 마라 — Pro 추론을 중간에 끊어 "다 생각 안 한 채" 답하게 만든다(gjc 지적, fail-open과 곱해져 미완성 답을 정답 저장). 완전 추론이 더 정확. 안전장치는--max-wait(기본 20분, env/--max-wait로 조절)만. force-answer는 빠른 의견·짧은 질문에만. - fail-closed: 첨부 미확인 / 모델·추론단계 미검증(
--model pro검증 실패, 또는--require-model사용 시 모델명 불일치) / timeout·빈 응답은 성공 저장 안 하고 중단·재시도한다(잘못된 컨텍스트나 미완성 답을 리뷰로 저장하지 않음). - 큰 콘텐츠는 파일 첨부로 들어간다(붙여넣기 X). 스크립트가 자동 처리.
- 실패 시
--retries N으로 전송/회수를 재시도.
채팅 정리 — 폴더명 ChatGPT 프로젝트 (기본 on)
매 실행이 일반 채팅 목록에 쌓이지 않도록, 현재 폴더명과 같은 이름의 ChatGPT 프로젝트 안에 채팅을 정리한다. 폴더당 프로젝트 1개로 묶여 일반 목록이 깨끗하게 유지된다.
- 폴더명→프로젝트URL은 per-repo 캐시(
.insane-review/projects.json)에 저장 → 다음 실행부턴 사이드바를 안 건드리고 바로 그 프로젝트로 들어간다(견고). - 프로젝트가 없으면 자동 생성, 있으면 재사용(중복 생성 안 함). 프로젝트 미지원 플랜이거나 UI가 바뀌어 실패해도 하드중단 없이 일반 채팅으로 폴백.
- 이름 바꾸려면
--project "<이름>", 끄려면--no-project.
주요 플래그
--target(생략=프롬프트only) · --include(정밀 글롭) · --compress · --model pro · --force-answer-after N · --retries N · --style xml|markdown|plain · --browser <이름|경로>(전용 프로필; 생략=config→첫 감지) · --launch-browser <이름>(전용 프로필 실행+저장) · --list-browsers · --project "<이름>"(기본=폴더명) · --no-project · --pack-only · --council
agent-council 멤버로 쓰기
references/council-setup.md 참고. --council 모드는 프롬프트를 위치인자로 받고 응답만 stdout으로 내보내(진행로그는 stderr) council worker가 그대로 캡처한다. Pro를 웹 전용 council 멤버로 등록하면 다른 모델들과 토론에 참여시킬 수 있다.