jev-enforce
npm
downloads
license
sponsor
Claude Code 플러그인으로, TypeSafe의 Jev를 사용하여 모든 답변과 파일 편집 내용을 사용자의 CLAUDE.md 또는 AGENTS.md와 비교 검사합니다. 규칙을 위반하면 Claude가 해당 내용을 인용하여 같은 턴에 수정합니다.
jev-enforce catching six broken rules in one check
<sub>검사 대상 핸들러는 <a href="demo/src/orders.ts">demo/src/orders.ts</a>입니다.</sub>
왜 필요한가요?
CLAUDE.md는 제약 조건이 아니라 컨텍스트(context)입니다. 이 내용은 몇 턴 동안 유지되다가, 나중에 원시 SQL을 포함하는 핸들러가 나타나면 테스트가 조용히 it.skip으로 바뀝니다. 아무것도 출력을 규칙과 비교하여 확인하지 않기 때문에, 이 플러그인이 그 역할을 합니다.
Jev 덕분에 모든 턴마다 실행하기에 충분히 저렴합니다. 이는 텍스트를 작성하는 대신 타이핑된 예/아니오 질문에 답함으로써 이루어지며, 모두 단일 요청으로 처리됩니다. 규칙당 하나의 질문이며, 약 350ms가 소요되고, 1,000회 검사당 약 3센트입니다.
사용해보기
설치할 것은 없으며, Node 18+와 npx만 있으면 충분합니다:
npx jev-enforce check --as code src/orders.ts
설치
claude plugin marketplace add erkamyaman/jev-enforce
claude plugin install jev-enforce@jev-enforce
키를 추가하세요 (console.typesafe.ai에서 받은) ~/.claude/settings.json 파일에:
{ "env": { "TYPESAFE_API_KEY": "..." } }
키가 없으면 검사가 불가능합니다. 세션을 망가뜨릴 수 없습니다.
작동 방식
- 프로젝트에
CLAUDE.md가 없는 경우, Claude Code와 동일한 우선순위를 맞춰 다음 규칙 파일들을 읽습니다: ~/.claude/CLAUDE.md, CLAUDE.md, .claude/CLAUDE.md, CLAUDE.local.md, .claude/rules/**, 그리고 AGENTS.md. 각 항목은 하나의 규칙입니다.
- 각 규칙을 한 번 정렬하고 캐시합니다: 응답(replies), 코드(code), 둘 다(both), 또는 어느 것도 제약하는지 확인합니다. Git 및 워크플로우 규칙은 어느 쪽에도 해당하지 않아 건너뜁니다.
Stop 훅(hook)은 최종 응답을 확인합니다. PostToolUse 훅은 Edit, Write 및 MultiEdit를 확인합니다.
JEV_ENFORCE_MODE=end를 사용하면, Claude가 작업하는 동안에만 편집 내용이 기록됩니다. Stop 훅은 수정된 모든 파일과 응답을 병렬로 함께 확인하므로, 해당 턴(turn)은 얼마나 많은 수정을 했든 상관없이 한 번의 검사 비용만 지불합니다.
- 규칙 위반 시에는 해당 규칙이 인용된
decision: "block" 형태로 반환되어, 사용자가 보기 전에 Claude가 이를 수정합니다. 턴당 한 번만 발생하므로 루프(loop)할 수 없으며, 이는 수정 자체도 다시 검사되지 않음을 의미합니다.
CLI
플러그인으로 설치하거나 npx jev-enforce를 통해 설치할 수 있습니다:
jev-enforce rules
jev-enforce check --as code src/orders.ts
jev-enforce check --as reply message.txt
이 CLI는 환경 변수에서 TYPESAFE_API_KEY를 읽으므로, 변경된 파일에 대한 규칙 검사로 CI(Continuous Integration)에서 작동합니다.
Settings
| Env | Default | |
|---|
TYPESAFE_API_KEY | none | 필수 |
| ... | | |
Benchmark
스타일과 아키텍처 및 보안을 각각 절반씩 포함한 19개 규칙에 대한 59개의 레이블링된 예시를 테스트했습니다. 전체 결과는 bench/results.md에서 확인 가능하며, npm run bench로 재현할 수 있습니다.
| Threshold | Precision | Recall | Clean texts wrongly flagged |
|---|
| 0.6 | 87.8% | 95.6% | 28개 중 3개 |
| ... | | | |
| 348ms p50, 전체 실행에 $0.0027 소요. | | | |
What it is bad at
- 이것은 보장이 아니라 모델입니다. 기본 임계값에서 약 15개 중 1개의 플래그가 잘못되었고, 약 15개 중 1개의 깨진 규칙이 통과됩니다.
- 정확한 문자 처리. 이것은
2019–2024를 대시(em dash)로 읽었습니다.
- 데이터 흐름(Dataflow).
prefer-const 규칙은 모델이 아니라 린터(linter)가 필요합니다.
- 텍스트 외부의 상태에 의존하는 규칙들. 'npm 종속성 추가 금지(Never add an npm dependency)'는 package.json을 볼 수 없기 때문에 새로운
axios 임포트에서 0.56점을 받았고, 오래된 마이그레이션 편집은 0.06점을 받았습니다.
- 사용자의 답변 텍스트, 수정 사항 및 규칙은 TypeSafe의 API로 전송됩니다.
개발(Development)
TypeScript이며 런타임 종속성이 없습니다. 테스트는 가짜 Jev를 대상으로 오프라인에서 실행됩니다. Claude Code가 저장소(repo)에서 플러그인 후크를 직접 실행하기 때문에, 커밋하기 전에 npm run build를 실행해야 하며 (npm run check-dist로 검증 가능합니다), dist/src/ 폴더는 커밋되어 있습니다.
만약 이것이 또 다른 '내가 하지 말라고 했는데...' 하는 순간을 막아준다면, 작업 후원(sponsor the work)할 수 있습니다.
라이선스(License)
MIT