TL;DR

  • Levenshtein은 여러 Go 저장소에서 동일한 도구 버전과 규칙을 적용하고 검증 가능한 코드 변경을 지원하는 엄선된 린트 규칙 및 CI 검사 모음임.
  • Staticcheck, Go 분석기, Modernize, go vet, 모듈 검사 등을 기본 검사로 제공하며 Go 취약점 검사는 main에서만 실행됨.
  • 레이스 감지, HTTP·SQL 리소스 검사, 워크플로 보안, 비밀정보 검사, 의존성 취약점 검사 등은 선택 사항임.
  • 저장소별 설정에 사용자 지정 린트 규칙과 명령을 추가할 수 있으며, 단일 Go 모듈은 설정 없이 ./verify를 실행할 수 있음.
  • Go 1.21 이상에서 린트 규칙을 시험할 수 있고, 검사 도구는 첫 실행 때 내려받아 빌드되며 파일을 변경하지 않고 문제를 보고함.

Levenshtein

  • Levenshtein은 모든 Go 저장소에 쉽게 연결할 수 있는 엄선된 Go 린트 규칙과 검증 검사 모음임.
  • 코딩 에이전트가 작성하는 코드가 늘어나는 상황에서 가능한 한 많은 코드를 검증할 수 있도록 하는 것이 목적임.
  • 좋은 린트 규칙과 자동 검사는 작업 중인 에이전트에 활용 가능한 피드백을 제공하고, 변경 사항이 준비됐다는 에이전트의 말 외에 추가 근거를 제공함.
  • 여러 Go 저장소를 새로 설정하면서 저장소마다 분석기를 조사하고 린트 설정을 복사하는 대신, 신뢰할 수 있는 고품질 규칙을 한곳에 모으기 위해 구축함.
  • 각 저장소는 Levenshtein 리비전을 고정하고 ./verify를 실행해 모든 저장소에서 동일한 규칙과 도구 버전을 사용하며, 업데이트를 쉽게 배포함.
  • 저장소 설정에서 기본 검사와 함께 사용자 지정 린트 규칙이나 명령을 추가할 수 있음.

검사 항목

  • Levenshtein은 Staticcheck, 기존 Go 분석기, 자체 규칙 일부를 결합함.
  • 규칙은 버그를 찾아내고 읽기 쉬운 코드를 장려하며, 대부분의 명명 및 주석 스타일 선호 사항은 제외함.

기본 검사

  • ./verify와 병합 전 검사에서 다음 항목을 실행함. Go 취약점 검사는 main에서만 실행하며, 이 경우 캐시 결과를 사용하지 않고 검사도 다시 실행함.
  • Staticcheck: os.Open의 성공 여부를 확인하기 전에 f.Close()를 지연 호출하는 것과 같은 닫기 순서 문제를 찾음.
  • 버그 탐지 분석기: file.Write(data)의 실패 여부를 확인하지 않는 오류 검사 누락을 찾음.
  • Modernize: maps.Copy로 대체할 수 있는 수동 맵 복사를 찾음.
  • Levenshtein 자체 규칙: 문자열을 형식이 지정된 상수 대신 "done", "failed"와 비교하는 형식 없는 상태 표현을 찾음.
  • go vet (go-vet): 정수를 요구하는 fmt.Printf("%d", ...)에 "hello"를 전달하는 서식 불일치를 찾음.
  • 모듈 검사 (go-mod): go.mod에 모듈이 누락된 상태로 패키지를 가져오는 의존성 누락을 찾음.
  • Go 취약점 검사 (go-vuln, main 전용): 코드가 알려진 보안 결함이 있는 의존성 함수에 도달할 수 있는지 검사함.

선택 검사

  • 다음 검사는 저장소 설정에 추가해 실행함.
  • 레이스 감지기 (go-test): 두 고루틴이 동기화 없이 공유 맵을 갱신하는 동시 쓰기를 찾음.
  • HTTP 리소스 (go-http): HTTP 요청 후 resp.Body를 닫지 않고 반환하는 경우를 찾음.
  • SQL 리소스 (go-sql): 데이터베이스 행을 읽은 뒤 닫지 않는 경우를 찾음.
  • GitHub Actions 린트 (workflow-lint): 존재하지 않는 속성을 참조하는 워크플로 표현식을 찾음.
  • 워크플로 보안 (workflow-security): PR 제목을 워크플로의 셸 명령에 직접 삽입하는 셸 인젝션을 찾음.
  • ShellCheck (shell-lint): 실패를 중단하거나 처리하지 않고 cd "$dir"를 실행하는 디렉터리 변경 문제를 찾음.
  • 비밀정보 검사 (secrets): 추적 대상 설정 파일에 커밋된 API 키를 찾음.
  • 기타 의존성 취약점 검사 (deps-vuln): package-lock.json에 고정된 알려진 보안 결함 버전을 찾음.
  • 가져오기 경계 (go-imports): 계층 규칙을 위반해 도메인 패키지가 데이터베이스 패키지를 가져오는 경우를 찾음.
  • 생성 파일 (go-generate): go generate 실행 결과가 달라지는 오래된 커밋 파일을 찾음.
  • API 호환성 (go-apidiff): 기존 호출자를 깨뜨리는 공개 함수 삭제를 찾음.
  • 변이 테스트 (go-mutation): >를 >=로 바꿔도 테스트가 실패하지 않아 경계 버그를 놓치는 경우를 찾음.
  • 의미 린트 (semantic-lint): 호출자가 문제 해결 방법을 알 수 없는 모호한 오류 메시지를 찾으며, Jev를 통한 검토 권고를 제공함.
  • 사용자 지정 명령 (command): 저장소의 테스트 스크립트가 오류와 함께 종료되는 통합 테스트 실패를 찾음.
  • self-test는 공유 검사를 개발할 때 Levenshtein 자체의 픽스처를 테스트함.
  • 린트 및 CI/CD 규칙 색인은 각 규칙, 검사, CI 정책과 채택하거나 제외한 이유를 설명함. Go 린트 경고의 의미는 Go 린트 규칙에서 확인할 수 있음.

빠른 시작

  • Go 린트 규칙은 Go 1.21 이상에서 모듈 루트에서 다음 명령을 실행해 시험할 수 있음: go run github.com/wangjohn/levenshtein/runner/lint/cmd/levenshtein-lint@latest ./...
  • 기본 검사는 macOS 또는 Linux에서 Go와 Docker 호환 런타임을 사용해 실행함.
  • 저장소를 복제하는 명령은 git clone --depth 1 --branch v0.2.0 https://github.com/wangjohn/levenshtein이며, 이어서 ./levenshtein/verify --source ./myapp --format text를 실행함.
  • 단일 Go 모듈에는 설정이 필요 없음. 첫 실행 때 도구를 내려받아 빌드하며, verify는 파일을 변경하지 않고 문제를 보고함.
  • 사전 요구 사항과 이름이 지정된 실행 방식은 설정 문서에서 확인할 수 있음.
  • CI 설정: GitHub Actions 및 기타 제공자.
  • 코딩 에이전트: 에이전트 작업 중 검사를 실행하는 지침과 훅.
  • 설정: 여러 모듈, 추가 검사, 사용자 지정 명령.
  • 기준선 및 커뮤니티 규칙: 검사를 점진적으로 도입하거나 자체 분석기를 추가하는 방식.

문서

  • 설정, 규칙 색인, 구성, CLI 참조, 코딩 에이전트, 문제 해결, 전체 문서를 제공함.
  • 저장소에서 사용하는 버전을 업데이트하기 전에 변경 기록과 버전 관리 정책을 확인함.
  • 단일 저장소의 golangci-lint 설정에 만족한다면 Levenshtein이 필요하지 않을 수 있으며, FAQ에서 두 방식을 비교함.

기여 및 보안

  • John Wang (@wangjohn)이 유지 관리함.
  • 질문이나 버그는 이슈로 등록함.
  • 기여 지침은 CONTRIBUTING.md에 있으며, 보안 취약점은 SECURITY.md의 안내에 따라 비공개로 보고함.
  • Apache License 2.0으로 배포하며 자세한 내용은 NOTICE에서 확인할 수 있음.