Devotd Github
새 소식평가

second-time-is-a-bug-book/book-companion — 훅 fail closed 정정

second-time-is-a-bug-book/book-companion이 문서화한 Cursor 훅 래퍼 예제가 종료 코드 0일 때만 허용하는 fail-closed 형태로 바뀌었다.

저장소 정보second-time-is-a-bug-book/book-companion ↗

second-time-is-a-bug-book/book-companion이 문서화한 Cursor 훅 래퍼 예제가 종료 코드 0일 때만 허용하는 fail-closed 형태로 바뀌었다.

GitHub 설명: Companion code for the book "The Second Time Is A Bug"

스타
★ 2
포크
0
언어
TypeScript
라이선스
MIT
원문 보기 ↗GitHub에서 보기 ↗

second-time-is-a-bug-book/book-companion은 책 "The Second Time Is A Bug"의 예제 코드를 담는 저장소다. 2026년 10월 27일 커밋 b0a04d5는 docs/tool-wiring.md 한 파일만 손댔다(4줄 추가, 4줄 삭제). 내용은 Cursor 훅을 감싼 셸 래퍼 예제의 판정 순서를 뒤집은 것이다. 예전에는 가드가 종료 코드 2일 때만 거부하고 나머지는 허용했지만, 이제는 종료 코드 0일 때만 허용하고 그 밖의 경우는 모두 거부한다.

훅(hook)은 에이전트가 셸 명령을 실행하기 전에 사용자가 만든 스크립트를 끼워 넣어 허용과 거부를 판단하는 Cursor 기능이다. 문서는 .cursor/hooks.json에 "version": 1을 두고, preToolUse가 Shell에 걸리면 tool_input.command를, beforeShellExecution은 command를 넘긴다고 설명한다. 종료 코드 2는 기본적으로 차단하지만, 훅이 "failClosed": true를 지정하지 않으면 스크립트가 죽거나 타임아웃이 났을 때 허용으로 넘어간다. 예제는 guards/destructive-command.ts를 호출해 명령을 검사하고, 판단 결과를 JSON으로 출력하는데, 출력이 올바른 JSON이 아니면 차단되고 빈 출력은 허용으로 문서화돼 있지 않다. 그래서 예제는 jq가 필요하다.

판정을 뒤집은 이유가 단순하다. 2가 아니면 허용이라는 규칙에서는 스크립트 실패가 오히려 실행을 통과시키지만, 0 이외는 거부라는 규칙에서는 실패 자체가 차단으로 이어진다. 문서는 그만큼 failClosed를 훅에도 함께 지정하라고 안내한다. 다만 실제 가드 스크립트는 이 저장소에 없다. 주석에도 .cursor/hooks/guard.sh는 축약 예시이며 이 저장소에 포함되지 않는다고 적혀 있다. 확인 가능한 것은 문서가 권하는 설정 방향이 바뀌었다는 사실까지이고, 훅이 실제로 어떻게 동작하는지는 이 커밋 하나로는 판단하기 이르다. 근거는 GitHub 커밋 b0a04d5(2026-10-27)다.