Issue Linker 디렉터스 컷. 흩어진 이슈를 한 화면에서 보고, 내 PC에서 고친다.
Sentry부터 Grafana까지 6곳의 이슈를 한 화면에 모으고, 내 PC의 Claude Code로 이슈별 코드 수정 → 로컬 커밋 → push·MR 초안까지. 머지는 사람이 한다. 2026년 9월 3일부터 10월 14일까지, 6주의 제작기입니다.
- Night Shift
- 니가해라 코드수정
- Issue assemble
- Issue Linker
LOGLINE · 한눈에 보기
한눈에 보기
Sentry · GitLab · WorxBoard · Notion · Jira · Grafana의 이슈를 한 화면에서 보고, 내 PC의 Claude Code로 코드 수정 → 로컬 커밋 → push·MR 초안까지. 머지는 사람이 한다.
- 사내 웹은 조회 전용. 쓰기는 PC 로컬에서만, 서비스 토큰은 Keychain에만 둔다.
- 실행 엔진은 Claude Code CLI 하나. 터미널 CLI와 같은 설정·플러그인·MCP로 돈다.
- 사람이 승인하는 단계는 모두 버튼. 커밋·push·MR은 각각 확인 화면을 거친다.
- 타겟 동기화는 머지 커밋으로. rebase·reset·강제 push는 하지 않는다.
숫자 2026-10-14 기준
필름 스트립 날짜를 누르면 그 장면으로
CHAPTER 01 · PROLOGUE · 09·03
이슈는 여섯 군데에 흩어져 있었다
에러는 Sentry에, 업무는 WorxBoard에, 검수는 Jira에, 로그는 Grafana에, 표는 Notion에, 이슈와 MR은 GitLab에. 화면도 토큰도 필터도 제각각이고, 정작 고치는 곳은 또 따로인 내 PC의 저장소였다. 9월 3일, 첫 커밋.
- Sentry에러 · 다중 프로젝트
- GitLab이슈 · MR
- WorxBoard업무 목록 · 상세
- NotionDB · 상태 필터
- Jira검수 · 부작업
- Grafana로그 · 대시보드
CHAPTER 02 · NIGHT SHIFT · 09·07–09·09
야간 러너를 꺼내 PC에 연결하다
시작은 한 업무 저장소 안에 있던 무인 야간 러너였다. 9월 7일, 이를 저장소와 무관한 코어로 일반화하고 — 모든 상수는 config.mjs 한 곳 — 사내 웹과 PC 로컬 서비스를 pairing으로 잇는 구조를 세웠다. 같은 날 pnpm으로 옮겼다. 커밋 하나에 57파일, +5,996줄.
사내 웹 조회 전용
정적 작업함. 서버·로그·URL·localStorage 어디에도 서비스 토큰을 두지 않는다. 임의 셸 명령 API도 없다.
PC 로컬 서비스 쓰기는 여기서만
loopback(127.0.0.1)에만 바인딩된 Node 서비스. 기본 모듈만 쓴다.
- 일회용 코드5분 안에만 유효한 pairing 코드ISSUED
- loopback 바인딩PC 밖에서는 닿지 않는 127.0.0.1BOUND
- Origin · Host 검사CORS만으로 인증을 대신하지 않는다CHECKED
- 8시간 세션토큰 원문은 Keychain 밖으로 나오지 않는다PAIRED
09·08 연결 슬롯 3 → 5
저장소 폴더와 서비스 토큰 묶음을 슬롯 단위로 저장한다. 같은 날 Sentry 다중 프로젝트, WorxBoard 목록·상세·필터, Notion 상태 필터, 현재 브랜치 수동 수정이 붙었다(49파일, +4,042줄).
09·09 고칠 때 필요한 맥락
- ⌘V이미지 첨부 — 스크린샷을 붙여 넣어 수정 요청에 함께 보낸다
- RUN실행 상태 표시 — 수정이 어디까지 왔는지 화면에서 본다
- WHO담당자 이름 가져오기 — ID만 보이던 목록에 이름을
- CHIPNotion 상태 칩 — 원본과 같은 색으로
웹은 조회 전용, 쓰기는 PC 로컬에서만.
토큰은 Keychain에만 둔다. 그리고 판단은 스킬(LLM)에게, 결정론적인 것 — 큐 순서·브랜치·락 — 은 코드가 확정한다. 상수는 config.mjs 한 곳.
INTERMISSION · 09·08 그날, 제목이 두 번 바뀌었다
Night Shift
야간 러너에서 온 이름. 낮에도 쓰는 도구가 되면서 어색해진다.
CHAPTER 03 · DIALOGUE · 09·16–09·17
고치고, 이어 말하고, 버튼으로 올린다
이슈 하나에 수정 한 번으로 끝나지 않는다. 작업 대화를 보관·복원하고, 커밋이나 브랜치가 바뀐 뒤에도 같은 대화에서 후속 수정을 이어 간다. 커밋과 MR 문구는 저장소의 스킬 규칙을 따르고, 올리는 순간은 사람이 버튼으로 정한다.
미커밋 diff와 커밋 메시지를 보여 준 뒤
COMMITTED타겟과 포함 커밋을 보여 준 뒤. 담당자는 올린 사람, 리뷰어는 지정하지 않는다
MR DRAFT자동 머지는 없다. 최종 승인과 머지는 GitLab에서 사람이 한다
HUMAN사람이 승인하는 단계는 버튼으로. 로컬 커밋, push·MR 각각 확인 화면과 버튼을 둔다. 동의 체크박스는 두지 않는다(2026-10-14). 자동 머지는 없다.
CHAPTER 04 · EXPANSION · 09·17 → 10·14
Jira, Grafana, Notion — 캐스트가 늘어난다
9월 중순, 조회 대상이 셋 더 붙었다. 서비스마다 저장을 따로 하게 바꾸고, 각자의 화면을 원문에 들어가지 않아도 될 만큼 채웠다. 탭을 눌러 서비스별 장면을 보세요.
JIRA
검수 목록에서 코드 수정까지- 09·18검수 URL·토큰 연결, 조회와 부작업 전체 목록
- 10·07부모 요약 카드 · 부작업 행 · 이미지 첨부, 그리고 Jira 이슈에서도 코드 수정 허용 (75파일, +6,096줄)
- 10·14검수 목록 전체 이어 받기(부모 1,000건) · 상태/담당자/제목 필터
- 10·14상태 전환 · 담당자 변경 · 댓글 등록 — PC 로컬에서만
GRAFANA
원문에 들어가지 않고 오류를 본다- 09·17전용 토큰 · 다중 대시보드 연결
- 09·18Explore · 짧은 링크, 로그 이슈 조회, 단건/주변 로그, 분석 우선 탭
- 10·13대시보드 패널 쿼리를 그대로 실행해 요약 stat · 오류 추이 시계열 · 4xx/5xx 오류 목록
- 10·13오류 로그 한 줄씩 보기 · 요청/응답 본문, 기간 탭, 오류 로그 일괄 분석, 유형별 버튼
NOTION
표를 표답게- 09·08상태 필터
- 09·09상태 칩을 원본 색으로
- 09·18커넥터로 전체 속성 표 · 동적 헤더 필터, 서비스별 개별 저장
- 10·13자체 MCP 클라이언트 + OAuth로 전환 → 06장
SENTRY · GITLAB · WORXBOARD
9월 초부터 있던 배역- 09·08Sentry 다중 프로젝트 조회
- 09·08WorxBoard 목록·상세·필터, 09·09 담당자 이름
- 09·17GitLab MR 관계 그래프 · 최신 타겟 수신 · 완료 후 PR 확인 링크
- 10·13WorxBoard 403 → 회사 계정 OAuth MCP → 06장
CHAPTER 05 · THE SWITCH · 10·12–10·13
엔진을 갈아 끼운다: Claude Code
전사 표준이 Claude로 바뀌었다. Codex 경로를 남기지 않고 실행 엔진을 Claude Code CLI 하나로 바꾸는 일을 별도 브랜치 feat/claude-only-migration에서 설계 문서부터 단계별로 진행한 뒤 master에 머지했다.
Codex는 안 쓴다, 전부 Claude 전용으로— 사용자 요청 · 2026-10-13 작업 기록
- 전환 설계 문서 (10·12)
- PC 인증 상태를 Claude Code 기준으로
- 스트림 이벤트 → 작업 대화 기록
- 이슈 코드 수정 실행기 교체
- 커밋·MR 초안 작성 교체
- dry-run 사전 검사 + 분석 모드 샌드박스
10·13 터미널 CLI와 같아야 한다
안전경계 필요없어, CLI에서 쓰는 것은 똑같이 쓸 수 있어야 해— 사용자 결정 · 작업 대화에서 Figma가 안 읽히던 날
그래서 이슈 수정 실행기를 터미널 CLI와 같은 설정·플러그인·MCP로 실행한다. Figma MCP도 그대로 쓴다. 입력창에서 /를 치면 저장소·PC 공통·플러그인 스킬과 CLI 내장 명령이 자동완성된다. 10월 14일에는 앱이 Git·브랜치·MR·스킬을 따로 막지 않는다는 원칙과 함께, MR 최종 승인은 사람이 한다는 결정이 계약에 들어갔다.
권한 매트릭스 누가 무엇을 할 수 있나
실행 엔진은 Claude Code CLI 하나. 터미널 CLI와 동치(설정·플러그인·MCP·스킬·훅). 분석 모드만 샌드박스로 저장소 쓰기와 셸 네트워크를 막고, 커밋·MR 문구를 쓰는 초안 Claude에는 commit/push/MR 권한을 주지 않는다.
CHAPTER 06 · PLOT TWIST · 10·13
문이 닫히면, 공식 문으로
외부 서비스의 인증 방식은 우리 일정과 상관없이 바뀐다. WorxBoard는 9월 28일 개인 PAT의 통합 API 접근을 끝냈고, 목록은 403을 돌려줬다. Notion도 같은 날 커넥터를 다시 짰다. 두 곳 모두 공식 OAuth MCP로 옮겼다.
개인 토큰의 종료
- 09·28개인 PAT 통합 API 접근 종료 (WorxBoard 측 변경)
- 10·13회사 계정 로그인 OAuth MCP로 전환. 읽기 도구
tasks.list·tasks.get만 허용
커넥터를 직접 쓰다
- 10·13MCP Streamable HTTP 클라이언트를 직접 구현, OAuth(PKCE) 로그인과 토큰 보관
- FIXSSE 응답 즉시 처리 · 토큰 갱신 single-flight (동시에 여러 번 갱신하지 않도록)
- UX실패 화면의 재인증 버튼이 로그인 → 승인 창 → 목록 재조회까지 한 번에
재인증 시퀀스 두 서비스가 공유하는 흐름
- 01로그인 버튼설정 또는 실패 화면에서
- 02승인 창회사 계정으로 승인
- 03PKCE 교환코드 + verifier로 토큰
- 04Keychain토큰은 PC에만
- 05갱신 1회refresh는 single-flight
- 06읽기 도구만허용한 도구만 호출
외부 인증이 바뀌면 우회하지 않고 공식 길로. 403을 만나도 재시도나 권한 우회는 하지 않았다. Notion·WorxBoard 모두 공식 OAuth MCP(PKCE, refresh 1회, 읽기 도구만 허용)로 옮겼다.
CHAPTER 07 · MOTION LAB · 10·13
밝은 작업함, 호박색 터미널
같은 날 화면 전체를 Motion Lab · Light로 바꿨고, 서비스 이름은 Issue Linker로 확정됐다. 업무 화면은 밝게, 작업 대화만 호박색 CRT 셸로. 아래는 그 모션 문법을 재연한 작은 랩입니다. 직접 눌러 보세요.
내 작업함
TESTS 686상세
상세를 열면 실행 대상(폴더·브랜치·미커밋)을 자동으로 확인합니다(10·14). 열릴 때 위에서 아래로 스캔 빔이 지나갑니다.
작업 대화 오른쪽에는 이슈 상세가 1:1로 분할되어 붙습니다.
- MONO KICKER · GRID모노 키커와 그리드 배경으로 화면의 뼈대를 보여 준다
- DECODE · COUNT-UP실제 글자는 바꾸지 않고 덮개(
data-fx)로만 → 테스트·스크린리더 안전 - SPOTLIGHT카드 위 포인터를 따라 빛이 움직인다 (카드에 마우스를 올려 보세요)
- CRT SHELL스캔라인·비네트·
you@issue-linker:~$. 어디서든 ‘현재 페이지’ 대화
모션은 접근성 안전하게. 디코드·카운트업은 실제 텍스트 위의 덮개로만 그리고, prefers-reduced-motion이면 전부 끈다. 이 문서의 챕터 디코드와 숫자 카운트업도 같은 방식으로 만들었다.
CHAPTER 08 · THE MERGE · 10·14
역사를 다시 쓰지 않고 합친다
PR을 올리기 전 선택한 타겟을 매번 fetch해 비교한다. 받아야 하면 저장소마다 다른 스킬을 따르지 않고 모든 저장소 공통으로 merge --no-ff 머지 커밋을 만든다. 충돌은 해소 Claude가 공통 기준으로 충돌 파일만 고치고, 앱이 검사한 뒤에야 커밋한다.
내 브랜치에 로컬 커밋 A, B가 있다.
해소 Claude의 공통 기준 충돌 유형을 골라 보세요
앱의 검사 통과해야 머지 커밋
- HEAD와 MERGE_HEAD가 그대로인가
- 충돌 파일 밖의 index·작업트리·미추적 파일이 그대로인가
- 충돌 표시가 남아 있지 않은가
- 통과하면 충돌 파일만 staging해 머지 커밋, push는 결과 화면의 버튼으로
충돌이 너무 많거나 바이너리·심볼릭 링크·서브모듈이면 해소를 시도하지 않고 merge --abort. 커밋 100개·파일 500개 같은 크기 제한은 없앴다.
하지 않는 것 미커밋·stale·다른 Git 작업·불명확한 실패는 중단
타겟 동기화는 머지 커밋으로. 공개된 커밋을 다시 쓰는 rebase는 협업 중 충돌과 유실을 만든다. 충돌은 AI가 해소하되, 범위와 결과는 앱이 검사한다.
CHAPTER 09 · EPILOGUE · TO BE CONTINUED
아직 찍지 않은 장면들
원래 이름은 Night Shift였지만, 정작 밤에 혼자 도는 장면은 아직 없다. 지금의 Issue Linker는 사람이 눌러야 움직이는 도구다. 정직하게 남은 것들.
- 미연결야간 자동 실행 · 예약웹과 서비스에서 야간 실행을 트리거하지 않는다. 자동 시작 등록도 사용자 요청 없이는 하지 않는다.
- 미이관Sentry 자동 트리아지조회는 되지만 자동 분류는 아직 옮겨 오지 않았다.
- 미구현서명된 배포 설치기지금의 로컬 설치는 개발용이다.
- 일부 미확인Jira 상태·댓글 등록, WorxBoard OAuth 로그인의 실서버 반영기능은 들어갔지만 실제 서버에서 끝까지 확인하지 못한 부분이 있다.
- 측정 전정량 효과처리한 이슈 건수, 줄어든 시간 같은 숫자는 아직 재지 않았다. 이 문서에도 없는 숫자는 쓰지 않았다.
감독 코멘터리 6주 동안 지킨 여덟 가지
- 웹은 조회 전용, 쓰기는 PC에서만토큰은 Keychain에. 임의 셸 명령 API 없음. pairing + 세션.
→ 02장 - 판단은 스킬, 결정은 스크립트큐 순서·브랜치·락은 코드가 확정. 상수는 config.mjs 한 곳.
→ 02장 - 승인은 버튼으로커밋, push·MR 각각 확인 화면. 담당자=올린 사람, 자동 머지 없음.
→ 03장 - 엔진은 Claude Code CLI 하나터미널 CLI와 동치. 분석 모드만 샌드박스.
→ 05장 - 동기화는 머지 커밋rebase 없이. 충돌은 AI가, 검사는 앱이.
→ 08장 - 인증 변화엔 공식 OAuth MCPPKCE, refresh 1회, 읽기 도구만.
→ 06장 - 모션은 접근성 안전하게덮개로만 그리고, 모션 줄이기면 전부 끈다.
→ 07장 - 세션 간 인계는 문서로AGENTS.md · summary · 날짜별 기록 · items.yaml(바뀐 사실은 삭제 대신 superseded). 테스트 먼저.