GitHub 이슈·PR 기반의 월간 작업일지 자동 생성 Claude 스킬 만들기
시리즈 Claude Code 워크플로 현재 위치 29 / 29
- git worktree로 AI 세션 여러 개를 동시에 돌리기: 브랜치 충돌과 stash 공유 사고를 피하는 운영 규칙
- AI에게 기억을 심는 법: 메모리 파일로 삽질 교훈을 세션 간에 유지하기
- 스킬로 반복 작업 자동화: 이슈 착수부터 종료까지 한 명령으로 묶은 dev-issue 사례
- 코드 그래프(graft)로 AI의 탐색 비용 줄이기: grep/read 대비 토큰 절감 체감
- AI 코드 리뷰를 규칙으로 고정하기
- 반복되는 Git 워크플로우와 브랜치 정리 자동화
- 같은 요청을 여러 저장소에 반복하는 법: 한 줄 프롬프트 + 기준 문서 하나
- 이슈 하나를 한 줄로 개발 끝내는 법 — 내가 가장 많이 쓰는 Claude Code 스킬들
- 블로그 글을 스무 번 부탁하고 나서, 스킬로 만들었다
- 마라톤 세션이 토큰을 먹는 구조: 로그로 찾고, /compact와 서브에이전트로 줄이기
- 1인 개발자가 클로드코드로 SaaS 11개 만든 기록
- 이슈 하나에 30~60분, 어디서 새고 있었나: skill-creator로 dev-issue 스킬을 만든 과정
- 도면을 AI에게 읽히려다 AI를 뺀 이야기
- 스쿼시 머지 vs 머지 커밋: 1인 개발자의 PR 전략
- "난이도가 높아서 오래 걸리는 거야?" — AIFid 개발 기록으로 따져 본 소요 시간
- 엑셀 간편장부를 웹 ERP로 옮기기 (AICassa)
- Impeccable 스킬 적용한 게시글 상세 화면 구조 개선
- CLAUDE.md로 팀 규칙을 AI에게 가르치는 법
- AI티 나는 디자인 패턴 걷어내기: overused-font 훅 오탐 처리와 접근성 대비 수정
- CI4 브랜드 에러 페이지: 설계서 한 장에서 구현까지
- Claude에 MCP로 디자인 툴 붙이기 — DesignCraft·PhotoCraft 설치부터 명함, 카툰 효과까지
- AI 실수 복구: 메인 체크아웃을 dev 상태로 되돌린 기록
- 870줄 CLAUDE.md를 116줄로 줄인 실전 리팩터링
- AI로 AI 강의안을 만들다 — 실용인문학 5·6강 준비기
- Claude Code 토큰 절감 실전: 3개월 로그 분석과 5단계 전략
- 개발 기록을 재료로 AI가 쓰는 블로그 글 만들기
- Claude Vision으로 영수증·세금계산서 자동 장부 입력 구현
- AI가 만든 실제 실수 4가지 패턴과 교훈
- GitHub 이슈·PR 기반의 월간 작업일지 자동 생성 Claude 스킬 만들기
시리즈 제품 개발기 현재 위치 20 / 20
- 엑셀 간편장부를 웹 ERP로 옮기기 (AICassa)
- 혼자 쓰는 맛집 앱 Pagus 만들기
- 감으로 잡던 견적을 코드로: CNC 목공과 AILign 개발 이야기
- AIPicto: 도연님의 그림책을 위한 온라인 구독 플랫폼
- PHP 개발자, TypeScript와 R3F로 3D 가구 배치 앱 만들기
- 녹화형 AI 화상면접 솔루션 기획 노트 — AILego
- AIvance 제품 이름은 왜 라틴어일까: Cassa에서 Cella까지
- 1인 개발자가 11개 SaaS를 운영하는 비밀: 공통 골격과 MSA 분할 전략
- "난이도가 높아서 오래 걸리는 거야?" — AIFid 개발 기록으로 따져 본 소요 시간
- 개별로는 통과하는데 전체에서만 죽는다 — AIFid 테스트 스위트가 composer test를 멈춘 날들
- 1인 개발자가 클로드코드로 SaaS 11개 만든 기록
- 도면을 AI에게 읽히려다 AI를 뺀 이야기
- 팬리스 우분투로 DC 모터를 인터넷에서 제어하기
- 저장소 아키텍처를 archify로 그려 README에 링크한 날
- Apache 403 해결과 php spark 로 슈퍼관리자 자동 발급하기
- UX와 보안을 동시에 잡는 그림책 게스트 열람 방안
- 혼자 하는 유지보수, 단가와 한도를 어떻게 정할까
- SEO + GEO 동시 적용: 정적 페이지에서 AI 검색 노출까지 한 방법
- 코어를 건드리지않고 확장하는 CodeIgniter 4 플러그인 구조와 핵심 설계 포인트
- GitHub 이슈·PR 기반의 월간 작업일지 자동 생성 Claude 스킬 만들기
요약: 매달 저장소별 작업일지를 손으로 쓰는 일을
ghCLI와 Claude 스킬로 자동화했다. 스크립트가 닫힌 이슈와 이슈 없는 PR을 KST 기준으로 모으고, 모델은 일자별 요약만 맡는다. 저장소명 대소문자,gh repo view의 엉뚱한 결과, 작업 중인 브랜치를 건드리지 않고dev에 푸시하는 문제를 겪고 해결했다.
무엇을 만들었나
요구는 단순했다. 저장소 하나를 지정하면 그 달에 닫힌 이슈와, 이슈 없이 머지된 PR을 모아 일자별 작업일지로 정리하고 docs/workLog/YYYY-MM-저장소명-작업일지.md로 저장한다. 월마다 파일 1개, 안에서는 날짜별 요약이다.
스킬은 두 부분으로 나눴다.
scripts/fetch.sh:gh로 데이터를 모아 JSON으로 출력한다. 결과가 매번 같아야 하는 부분이다.SKILL.md: JSON을 일자별 문서로 쓰고 커밋·푸시하는 절차. 요약처럼 판단이 필요한 부분이다.

데이터 수집에서 막힌 곳
1. 월 경계는 KST로 잘라야 한다
GitHub 검색의 closed: 날짜는 UTC 기준이다. 11월 1일 새벽(KST)에 닫은 이슈는 UTC로는 10월 31일이다. 그래서 조회는 월 경계 앞뒤 하루씩 여유를 두고 하고, 응답의 시각을 KST로 바꿔 날짜를 계산한 뒤 jq에서 정확히 필터링했다.
KST='(fromdateiso8601 + 32400 | strftime("%Y-%m-%d"))'
gh issue list -R "$NWO" --state closed --search "closed:$FROM..$TO" \
--json number,title,closedAt,url | jq "[.[] | .day = (.closedAt | $KST)]"
2. 이슈 없는 PR 판정
closingIssuesReferences가 비어 있고, 제목·본문에 자기 번호가 아닌 #N 참조도 없는 PR만 "이슈 없는 PR"로 본다. dev 브랜치에서 올라온 PR은 배포 PR로 따로 분리해 그날 목록의 마지막에 적는다.
3. gh repo view가 다른 저장소를 알려줬다
저장소의 owner를 알아내려고 gh repo view --json nameWithOwner를 썼더니, AILign 디렉터리에서 aivance-kr/AICreo가 나왔다. 기본 저장소 설정이 따로 잡혀 있었던 것으로 보인다. 믿을 수 있는 값은 git remote get-url origin이라 URL에서 owner/repo를 뽑는 방식으로 바꿨다.
4. 저장소명 대소문자
/work-log aicura로 실행하니 AICura를 찾지 못했다. 비교를 소문자로 맞추고, 현재 디렉터리와 하위 디렉터리들의 origin을 훑도록 고쳤다. 저장소명을 생략하면 현재 디렉터리의 origin을 쓰고, 첫 인자가 YYYY-MM이나 all이면 월 인자로 해석한다.
커밋과 푸시: 작업 중인 브랜치를 건드리지 않기
작업일지는 문서만 바뀌므로 dev에 직접 푸시하는 예외 규칙을 적용했다. 문제는 실제로 돌려 보니 대상 저장소가 다른 feature 브랜치에 있고, 무관한 미커밋 변경이 잔뜩 있었다는 점이다. git checkout dev를 하면 변경이 섞이거나 충돌한다.
해결은 임시 워크트리다. origin/dev 기준으로 만들고, 작업일지 파일 하나만 복사해 커밋·푸시한 뒤 지운다.
git fetch origin dev -q
git worktree add -q --detach "$W" origin/dev
cp docs/workLog/2026-11-AICura-작업일지.md "$W/docs/workLog/"
git -C "$W" add docs/workLog/2026-11-AICura-작업일지.md
git -C "$W" commit -m "📝 docs: 2026-11 작업일지 추가"
git -C "$W" push origin HEAD:dev
git worktree remove --force "$W"

여기에 규칙도 스킬에 못 박았다. 커밋·푸시 대상은 스킬이 만든 작업일지 파일뿐이고, git add -A, git add ., git commit -a는 금지한다. 경로를 명시해서 add 한다. 스킬이 다른 변경까지 실수로 올리는 일을 막기 위해서다.
전체 기간 옵션
두 번째 인자로 all을 주면 이슈·PR이 있는 모든 달을 대상으로 달마다 파일을 하나씩 만든다. 스크립트는 기간 제한 없이 최대 1000건을 가져오고, 각 항목의 날짜 앞 7자리(YYYY-MM)로 달을 나눈다. 한 저장소에서 확인해 보니 이슈 61건, 이슈 없는 PR 39건, 배포 PR 19건이 6개월에 걸쳐 나왔다. 커밋은 파일들을 한 번에 묶는다.
배운 점
- 결과가 결정적이어야 하는 부분(수집, 날짜 변환, 분류)은 스크립트로, 요약처럼 판단이 필요한 부분만 모델에 맡기면 스킬이 안정적이다.
- 타임존과
gh의 기본 저장소 같은 환경 의존 값은 직접 확인한 값(originURL, 명시적 KST 변환)으로 바꿔야 한다. - 자동 커밋을 하는 스킬에는 "무엇을 커밋하지 않는가"를 명시해야 한다. 작업 중인 브랜치가 있는 저장소에서는 임시 워크트리가 안전하다.

댓글 0
아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.