-
Notifications
You must be signed in to change notification settings - Fork 0
알고리즘 패턴 태깅 #4
Copy link
Copy link
Open
Description
개요
DaleStudy/leetcode-study 저장소에 올라오는 PR의 각 솔루션 파일을 OpenAI로 분석하여, 해당 파일에 사용된 알고리즘 패턴을 PR 파일 코멘트(line comment)로 자동으로 남긴다.
배경
현재 PR에는 언어 레이블(py, java, ts 등)만 자동으로 붙는다. 스터디원들이 서로의 코드를 리뷰할 때 어떤 알고리즘 패턴을 사용했는지 한눈에 파악할 수 있도록, 파일 단위로 패턴 분석 결과를 코멘트로 제공한다.
트리거
pull_request이벤트의opened,synchronize액션 (PR 생성 및 커밋 push 시마다 실행)- 동일 파일에 Bot이 이전에 작성한 패턴 태그 코멘트가 있으면 삭제 후 새로 작성
- 다른 사람이 남긴 코멘트는 절대 삭제하지 않음
동작 방식
1. 변경 파일 수집
PR에서 변경된 파일 목록을 GitHub REST API로 조회한다.
GET /repos/DaleStudy/leetcode-study/pulls/{pr_number}/files
{problem-name}/{username}.{extension}패턴의 파일만 처리ADDED,MODIFIED상태인 파일만 대상 (삭제된 파일 제외)
2. 파일별 OpenAI 분석
각 파일의 내용을 가져와 OpenAI API로 분석한다.
분석 요청 내용:
- 파일 전체 코드
- 문제 이름 (폴더명, 예:
best-time-to-buy-and-sell-stock)
감지 대상 알고리즘 패턴 (예시):
- Two Pointers
- Sliding Window
- Fast & Slow Pointers
- BFS
- DFS
- Backtracking
- Dynamic Programming
- Binary Search
- Monotonic Stack
- Heap / Priority Queue
- Hash Map / Hash Set
- Greedy
- Divide and Conquer
- Union Find
- Trie
- Bit Manipulation
3. PR 파일 코멘트 작성
분석 결과를 해당 파일의 첫 번째 줄에 PR review comment로 작성한다.
코멘트 형식 (예시):
<!-- dalestudy-pattern-tag -->
### 🏷️ 알고리즘 패턴 분석
- **패턴**: Sliding Window, Hash Map
- **설명**: 윈도우 내 최댓값을 추적하기 위해 Deque를 활용한 슬라이딩 윈도우 기법을 사용했습니다.
- HTML 주석
<!-- dalestudy-pattern-tag -->를 포함하여 Bot이 작성한 코멘트를 식별 - 동일 파일에 Bot이 작성한 기존 패턴 태그 코멘트만 삭제 후 새로 작성
- 다른 사람이 남긴 코멘트는 건드리지 않음
구현 위치
- 핸들러:
handlers/tag-patterns.js(신규 생성) - 엔드포인트: 웹훅에서 내부 호출 (별도 REST 엔드포인트 불필요)
- 웹훅 연동:
handlers/webhooks.js에서pull_request이벤트의opened/synchronize액션 시 호출
필요한 GitHub App 권한
pull_requests: write(이미 있음 - review comment 작성에 사용)contents: read(이미 있음 - 파일 내용 조회)
필요한 Secrets
OPENAI_API_KEY(이미 등록됨)
스킵 조건
maintenance라벨이 붙은 PR- Draft 상태의 PR
- 변경 파일이
{problem-name}/{username}.{extension}패턴이 아닌 경우 (예: README, 설정 파일)
응답 형식 (웹훅 처리 결과 로그)
{
"action": "tag-patterns",
"pr": 1970,
"files_analyzed": 3,
"files_skipped": 1,
"results": [
{ "file": "sliding-window-maximum/juhui-jeong.java", "patterns": ["Sliding Window", "Monotonic Stack"], "commented": true },
{ "file": "coin-change/juhui-jeong.java", "patterns": ["Dynamic Programming"], "commented": true }
]
}Reactions are currently unavailable