Skip to content

PR 봇을 Slack 에서 Discord 로 이관#308

Merged
sevineleven merged 3 commits into
devfrom
chore/307-discord-pr-bot-migration
Jul 4, 2026
Merged

PR 봇을 Slack 에서 Discord 로 이관#308
sevineleven merged 3 commits into
devfrom
chore/307-discord-pr-bot-migration

Conversation

@sevineleven

@sevineleven sevineleven commented Jul 4, 2026

Copy link
Copy Markdown
Collaborator

Situation

  • 서버(PIKI-Server)의 PR·배포 알림을 오늘 Slack 에서 Discord 로 이관 완료했다. 클라(PIKI-Client)도 PR 알림이 아직 Slack 이라 통일이 필요했다.

Task

  • 클라 PR 봇을 Slack 에서 Discord 로 이관한다.
  • 단순 복사가 아니라, 클라가 slack 봇에 쌓아온 특화를 보존한다 (서버 검증본엔 없는 것).

Action

이관

  • slack-pr-bot.yml 제거 + discord-pr-bot.yml 추가 (서버 검증본 기반).
  • 리뷰어 멘션(initial_reviewers + requested_reviewers)·연관 이슈(close #N)·PR 요약·스레드 구조는 서버 Discord 봇과 동일.
  • secret: DISCORD_BOT_TOKEN(서버 공유)·DISCORD_PR_CHANNEL_ID(클라 전용 채널)·DISCORD_USER_MAP(FE 5인) 설정 완료.

클라 특화 보존 (slack 커밋 이력 #14·#17·#18·#20 추적)

단순 복사면 놓쳤을, 클라가 slack 봇에 쌓은 수정을 반영했다:

클라 slack 수정 이관본 반영
reopened 트리거·부모조건 (#17) ready_for_reviewreopened
요약 섹션명 작업 요약 (#20, 클라 템플릿이 ## 작업 요약) Task작업 요약
요약에서 중첩 리스트( -) skip (#18) 추가
  • 덤으로 클라 slack 의 잠복 버그도 수정: 요약 함수가 2개인데 섹션명이 작업 내용/작업 요약 으로 불일치(chore: Web 추가 기초 설정 #20 이 한쪽만 고침)해 부모 메시지 요약이 항상 "요약 없음" 이 되던 걸, 이관본은 둘 다 작업 요약 으로 통일해 함께 고쳤다.

범위 밖

  • alert-direct-push(main 직접 push 경고) job 제외 — 클라 기존 slack 봇에 없던 것.
  • 배포 알림 — 클라는 배포가 Vercel 이라 GitHub Actions 에 배포 워크플로가 없다. Discord 배포 알림을 원하면 Vercel 대시보드에서 별도 설정.

Result

  • 클라 PR 알림이 Discord 로 발송된다. slack 에 있던 부모 메시지 요약 버그는 이관 과정에서 함께 고쳐졌다.
  • 머지 후 확인(환경 — 코드 아님): (1) repo Actions workflow permissions 가 pull-requests write 허용, (2) 공유 봇이 클라 전용 PR 채널에 메시지 권한, (3) secret 3종 설정 완료.
  • 테스트: GitHub Actions 는 PR 이벤트를 base 브랜치 워크플로로 처리한다. 그래서 이 PR 머지 후 다음 PR 부터 Discord 알림이 동작한다. 머지 후 테스트 PR 하나로 채널 표시를 확인하면 된다.

연관 이슈

Summary by CodeRabbit

  • New Features
    • PR 이벤트 발생 시 Discord로 자동 알림을 보내며, 새 PR에는 부모 메시지와 스레드를 생성합니다.
    • PR 제목/요약 및 관련 이슈 정보를 함께 표시해 알림 내용을 더 풍부하게 합니다.
    • 이후 PR 진행 상황(닫힘/리뷰 요청/동기화 등)에 맞춰 Discord 메시지가 갱신되고 스레드에 후속 답글이 추가됩니다.
  • Chores
    • 기존 Slack 알림 워크플로우를 제거했습니다.

slack-pr-bot.yml 제거 + discord-pr-bot.yml 추가 (서버 PIKI-Server 검증본 기반).
리뷰어 멘션(initial_reviewers + requested_reviewers)·연관 이슈(close #N) 로직 동일.

클라 slack 커밋 이력(#14·#17·#18·#20)을 추적해 서버와 다른 클라 특화를 반영:
- 트리거·부모 메시지 조건: ready_for_review → reopened (#17, 기존 slack 봇과 동일).
- 요약 파싱 섹션명: Task → 작업 요약 (클라 PR 템플릿이 '## 작업 요약'). 클라 slack 은 두 요약 함수의
  섹션명이 '작업 내용'/'작업 요약' 으로 불일치(#20 이 한쪽만 수정)해 부모 메시지 요약이 항상 비던 버그가
  있었는데, 이관본은 둘 다 '작업 요약' 으로 통일해 함께 고친다.
- 요약에서 중첩 리스트('  -') skip (#18).

alert-direct-push job 제외(클라 범위 밖). 배포는 클라가 Vercel 이라 이 이관 범위 밖.
secret(DISCORD_BOT_TOKEN 공유·DISCORD_PR_CHANNEL_ID 전용·DISCORD_USER_MAP) 설정 완료.
@sevineleven sevineleven self-assigned this Jul 4, 2026
@vercel

vercel Bot commented Jul 4, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
depromeet Ready Ready Preview, Comment Jul 4, 2026 8:49am

@github-actions

github-actions Bot commented Jul 4, 2026

Copy link
Copy Markdown

Discord 스레드 연동용 메타데이터입니다. discord-pr-bot 워크플로가 자동 생성하며, 수정·삭제하면 PR 과 Discord 알림 연동이 끊깁니다.

@github-actions
github-actions Bot requested review from iOdiO89 and soyeong0115 July 4, 2026 05:44
@coderabbitai

coderabbitai Bot commented Jul 4, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 51817d8c-1924-4d13-96f3-ce489ba7549b

📥 Commits

Reviewing files that changed from the base of the PR and between 6baed7c and 7f4e465.

📒 Files selected for processing (1)
  • .github/workflows/discord-pr-bot.yml
🚧 Files skipped from review as they are similar to previous changes (1)
  • .github/workflows/discord-pr-bot.yml

📝 Walkthrough

Walkthrough

기존 Slack PR 봇 워크플로우를 제거하고, PR 이벤트를 Discord 메시지와 스레드로 반영하는 새 워크플로우를 추가한다. PR 메타를 추출·복원하고, 신규 PR은 부모 메시지/스레드를 생성하며, 이후 이벤트는 기존 메시지와 스레드를 갱신한다.

Changes

Discord PR 봇 워크플로우 추가

Layer / File(s) Summary
워크플로우 트리거 및 PR 데이터 추출
.github/workflows/discord-pr-bot.yml
워크플로우 트리거, 최소 권한, 동시성, 실행 환경을 정의하고, PR 메타를 출력한 뒤 기존 Discord 메타를 PR 코멘트에서 복원한다.
Discord 부모 메시지 생성 및 스레드 생성
.github/workflows/discord-pr-bot.yml
신규 비드래프트 PR에서 PR 본문을 조합해 Discord 부모 메시지를 전송하고 스레드를 만든 뒤, 식별자를 숨김 메타 주석으로 저장한다.
Discord 메시지 갱신 및 스레드 응답
.github/workflows/discord-pr-bot.yml
opened가 아닌 이벤트에서 부모 메시지를 갱신하고, 스레드가 있으면 리뷰 요청·동기화·닫힘 상태에 따라 답글을 게시한다.

Estimated code review effort: 4 (Complex) | ~60 minutes

Possibly related PRs

  • depromeet/PIKI-Client#14: Slack PR 알림 워크플로우를 추가한 변경으로, 이번 PR의 Slack→Discord 이관과 직접 연결된다.

Suggested reviewers: iOdiO89

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed Slack에서 Discord로 PR 봇을 이관한다는 핵심 변경을 간결하게 잘 요약합니다.
Linked Issues check ✅ Passed 단일 이슈 #307의 요구사항인 Discord 전환, reopened/작업 요약 보존, 중첩 리스트 제외, 시크릿 반영이 모두 반영된 것으로 보입니다.
Out of Scope Changes check ✅ Passed 변경 내용은 PR 봇 이관과 후속 동기화 개선에 집중되어 있고, 범위를 벗어난 배포 알림 추가는 보이지 않습니다.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (1)
.github/workflows/discord-pr-bot.yml (1)

279-346: 📐 Maintainability & Code Quality | 🔵 Trivial | 🏗️ Heavy lift

중복된 헬퍼 함수를 공용 스크립트로 추출하는 것을 권장합니다.

mention_discord_user, build_reviewer_text, build_issue_text, build_summary 가 Post parent 스텝(126-198)과 이 스텝(279-346)에 완전히 동일하게 중복되어 있습니다. 두 사본이 어긋나면 이번 PR이 수정했다는 요약 섹션명(작업 요약) 불일치 같은 버그가 재발할 수 있습니다. .github/scripts/ 하위 셸 스크립트로 추출해 각 스텝에서 source 하거나 composite action으로 묶으면 단일 소스로 유지됩니다.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/discord-pr-bot.yml around lines 279 - 346, The helper
functions are duplicated across workflow steps, so extract mention_discord_user,
build_reviewer_text, build_issue_text, and build_summary into a shared script
under .github/scripts and have both steps source it (or wrap them in a composite
action). Keep the logic in a single place so changes to symbols like
build_summary and build_issue_text stay consistent and don’t drift between the
parent and child steps.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/discord-pr-bot.yml:
- Around line 362-377: The update message in the `TEXT` heredoc of the Discord
PR bot workflow uses label formatting that differs from the initial post
message, causing the first refresh to look inconsistent. Align the labels in
this update block with the parent message format by matching the same bolding
and capitalization used in the posting step for the issue, summary, branch, and
reviewer fields. Keep the wording and style consistent between the two message
निर्माण paths so both the initial post and later updates render identically.
- Around line 435-438: The commit count and last-commit message logic in the
workflow step using COMMITS_URL, COMMITS, LAST_COMMIT_MSG, and COMMIT_COUNT is
only reading the first API page, so it becomes inaccurate for PRs with more than
30 commits. Update the step to use the webhook payload’s pull_request.commits
for the commit count, and change the last-commit lookup to fetch the actual
final page of commits (or otherwise paginate through all pages) before taking
the last message.
- Around line 18-20: The concurrency setup in discord-pr-bot workflow can drop
intermediate reply events because pending runs in the same group may be
replaced. Update the concurrency strategy around the discord-pr-bot job so
review_requested, synchronize, and review_request_removed events are not lost;
either split reply posting into a separate workflow/group or switch to a
queueing configuration such as max-based queuing. Use the concurrency group
configuration in the discord-pr-bot workflow to locate the change.

---

Nitpick comments:
In @.github/workflows/discord-pr-bot.yml:
- Around line 279-346: The helper functions are duplicated across workflow
steps, so extract mention_discord_user, build_reviewer_text, build_issue_text,
and build_summary into a shared script under .github/scripts and have both steps
source it (or wrap them in a composite action). Keep the logic in a single place
so changes to symbols like build_summary and build_issue_text stay consistent
and don’t drift between the parent and child steps.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 3a88cd10-96e7-4608-8a03-c5a4abbc60d9

📥 Commits

Reviewing files that changed from the base of the PR and between f72a2c1 and 6baed7c.

📒 Files selected for processing (2)
  • .github/workflows/discord-pr-bot.yml
  • .github/workflows/slack-pr-bot.yml
💤 Files with no reviewable changes (1)
  • .github/workflows/slack-pr-bot.yml

Comment thread .github/workflows/discord-pr-bot.yml
Comment thread .github/workflows/discord-pr-bot.yml
Comment thread .github/workflows/discord-pr-bot.yml Outdated
부모(최초) 메시지는 '🔥 연관 이슈'·'**branch**' 처럼 볼드 없는 소문자였고
갱신 메시지는 '🔥 **연관 이슈**'·'**Branch**' 로 달라, 첫 갱신 때 라벨 서식이
바뀌어 보였다. 부모 쪽을 갱신 쪽 서식에 맞춰 일치시킨다.
PR 커밋 API 는 30개/페이지(오래된→최신 순)라 첫 페이지만 받아 length 로 세면
31개 이상 PR 에서 커밋 수가 30 으로 잘리고, 첫 페이지 .[-1] 도 최신 커밋이 아니었다.
커밋 수는 이벤트 payload 의 .pull_request.commits 로, 최신 커밋은 마지막 페이지
(per_page=1 & page=총개수)로 집어 정확하게 만든다.
@sevineleven
sevineleven merged commit 66947a7 into dev Jul 4, 2026
6 checks passed
@sevineleven
sevineleven deleted the chore/307-discord-pr-bot-migration branch July 4, 2026 09:18
iOdiO89 pushed a commit that referenced this pull request Jul 6, 2026
* chore: PR 봇을 Slack 에서 Discord 로 이관

slack-pr-bot.yml 제거 + discord-pr-bot.yml 추가 (서버 PIKI-Server 검증본 기반).
리뷰어 멘션(initial_reviewers + requested_reviewers)·연관 이슈(close #N) 로직 동일.

클라 slack 커밋 이력(#14·#17·#18·#20)을 추적해 서버와 다른 클라 특화를 반영:
- 트리거·부모 메시지 조건: ready_for_review → reopened (#17, 기존 slack 봇과 동일).
- 요약 파싱 섹션명: Task → 작업 요약 (클라 PR 템플릿이 '## 작업 요약'). 클라 slack 은 두 요약 함수의
  섹션명이 '작업 내용'/'작업 요약' 으로 불일치(#20 이 한쪽만 수정)해 부모 메시지 요약이 항상 비던 버그가
  있었는데, 이관본은 둘 다 '작업 요약' 으로 통일해 함께 고친다.
- 요약에서 중첩 리스트('  -') skip (#18).

alert-direct-push job 제외(클라 범위 밖). 배포는 클라가 Vercel 이라 이 이관 범위 밖.
secret(DISCORD_BOT_TOKEN 공유·DISCORD_PR_CHANNEL_ID 전용·DISCORD_USER_MAP) 설정 완료.

* PR 봇 부모 메시지 라벨을 갱신 메시지와 같은 볼드·대문자 서식으로 통일

부모(최초) 메시지는 '🔥 연관 이슈'·'**branch**' 처럼 볼드 없는 소문자였고
갱신 메시지는 '🔥 **연관 이슈**'·'**Branch**' 로 달라, 첫 갱신 때 라벨 서식이
바뀌어 보였다. 부모 쪽을 갱신 쪽 서식에 맞춰 일치시킨다.

* synchronize 알림의 커밋 수·최신 커밋을 페이지네이션에 견고하게 계산

PR 커밋 API 는 30개/페이지(오래된→최신 순)라 첫 페이지만 받아 length 로 세면
31개 이상 PR 에서 커밋 수가 30 으로 잘리고, 첫 페이지 .[-1] 도 최신 커밋이 아니었다.
커밋 수는 이벤트 payload 의 .pull_request.commits 로, 최신 커밋은 마지막 페이지
(per_page=1 & page=총개수)로 집어 정확하게 만든다.
iOdiO89 pushed a commit that referenced this pull request Jul 10, 2026
* chore: PR 봇을 Slack 에서 Discord 로 이관

slack-pr-bot.yml 제거 + discord-pr-bot.yml 추가 (서버 PIKI-Server 검증본 기반).
리뷰어 멘션(initial_reviewers + requested_reviewers)·연관 이슈(close #N) 로직 동일.

클라 slack 커밋 이력(#14·#17·#18·#20)을 추적해 서버와 다른 클라 특화를 반영:
- 트리거·부모 메시지 조건: ready_for_review → reopened (#17, 기존 slack 봇과 동일).
- 요약 파싱 섹션명: Task → 작업 요약 (클라 PR 템플릿이 '## 작업 요약'). 클라 slack 은 두 요약 함수의
  섹션명이 '작업 내용'/'작업 요약' 으로 불일치(#20 이 한쪽만 수정)해 부모 메시지 요약이 항상 비던 버그가
  있었는데, 이관본은 둘 다 '작업 요약' 으로 통일해 함께 고친다.
- 요약에서 중첩 리스트('  -') skip (#18).

alert-direct-push job 제외(클라 범위 밖). 배포는 클라가 Vercel 이라 이 이관 범위 밖.
secret(DISCORD_BOT_TOKEN 공유·DISCORD_PR_CHANNEL_ID 전용·DISCORD_USER_MAP) 설정 완료.

* PR 봇 부모 메시지 라벨을 갱신 메시지와 같은 볼드·대문자 서식으로 통일

부모(최초) 메시지는 '🔥 연관 이슈'·'**branch**' 처럼 볼드 없는 소문자였고
갱신 메시지는 '🔥 **연관 이슈**'·'**Branch**' 로 달라, 첫 갱신 때 라벨 서식이
바뀌어 보였다. 부모 쪽을 갱신 쪽 서식에 맞춰 일치시킨다.

* synchronize 알림의 커밋 수·최신 커밋을 페이지네이션에 견고하게 계산

PR 커밋 API 는 30개/페이지(오래된→최신 순)라 첫 페이지만 받아 length 로 세면
31개 이상 PR 에서 커밋 수가 30 으로 잘리고, 첫 페이지 .[-1] 도 최신 커밋이 아니었다.
커밋 수는 이벤트 payload 의 .pull_request.commits 로, 최신 커밋은 마지막 페이지
(per_page=1 & page=총개수)로 집어 정확하게 만든다.
iOdiO89 added a commit that referenced this pull request Jul 10, 2026
* docs: 역할 분배 문서 추가

* docs: 현재 api 에러 대응 현황 문서 추가

* docs: 에러 처리 정책 문서 추가

* feat: 공통 API 에러 메시지 유틸 추가

* feat: 전역 mutation/query 에러 안전망 도입

* refactor: 비어있는 개별 onError 삭제 (전역 안전망 위임)

* refactor: 개별 훅 5xx 토스트 분기 제거 (이중 토스트 방지)

* PR 봇을 Slack 에서 Discord 로 이관 (#308)

* chore: PR 봇을 Slack 에서 Discord 로 이관

slack-pr-bot.yml 제거 + discord-pr-bot.yml 추가 (서버 PIKI-Server 검증본 기반).
리뷰어 멘션(initial_reviewers + requested_reviewers)·연관 이슈(close #N) 로직 동일.

클라 slack 커밋 이력(#14·#17·#18·#20)을 추적해 서버와 다른 클라 특화를 반영:
- 트리거·부모 메시지 조건: ready_for_review → reopened (#17, 기존 slack 봇과 동일).
- 요약 파싱 섹션명: Task → 작업 요약 (클라 PR 템플릿이 '## 작업 요약'). 클라 slack 은 두 요약 함수의
  섹션명이 '작업 내용'/'작업 요약' 으로 불일치(#20 이 한쪽만 수정)해 부모 메시지 요약이 항상 비던 버그가
  있었는데, 이관본은 둘 다 '작업 요약' 으로 통일해 함께 고친다.
- 요약에서 중첩 리스트('  -') skip (#18).

alert-direct-push job 제외(클라 범위 밖). 배포는 클라가 Vercel 이라 이 이관 범위 밖.
secret(DISCORD_BOT_TOKEN 공유·DISCORD_PR_CHANNEL_ID 전용·DISCORD_USER_MAP) 설정 완료.

* PR 봇 부모 메시지 라벨을 갱신 메시지와 같은 볼드·대문자 서식으로 통일

부모(최초) 메시지는 '🔥 연관 이슈'·'**branch**' 처럼 볼드 없는 소문자였고
갱신 메시지는 '🔥 **연관 이슈**'·'**Branch**' 로 달라, 첫 갱신 때 라벨 서식이
바뀌어 보였다. 부모 쪽을 갱신 쪽 서식에 맞춰 일치시킨다.

* synchronize 알림의 커밋 수·최신 커밋을 페이지네이션에 견고하게 계산

PR 커밋 API 는 30개/페이지(오래된→최신 순)라 첫 페이지만 받아 length 로 세면
31개 이상 PR 에서 커밋 수가 30 으로 잘리고, 첫 페이지 .[-1] 도 최신 커밋이 아니었다.
커밋 수는 이벤트 payload 의 .pull_request.commits 로, 최신 커밋은 마지막 페이지
(per_page=1 & page=총개수)로 집어 정확하게 만든다.

* PR 봇 서버 개선 반영 (상태 리액션·부모 고정·스레드 정리·라벨·헬퍼 공유) (#310)

* PR 봇에 상태 리액션·부모 고정·스레드 정리·라벨 표시·헬퍼 공유 반영

이관 이후 서버 봇에 쌓인 개선을 클라 봇에 맞춰 반영한다.

- 상태 리액션: 부모 메시지에 열림/작업중/머지/종료를 이모지로 전환 표시(429 rate limit 재시도 포함)
- 부모 고정: 열린(리뷰 대기) PR 부모를 채널 상단에 고정, 종료 시 해제
- 스레드 정리: 종료 시 스레드명에 결과 프리픽스(✅/🗑️)+archive+lock
- 부모 카드에 라벨 표시(build_label_text)
- find_meta 가 메타 주석을 JSON 마커로 정확히 매칭 — 파일명을 언급한 리뷰 코멘트를
  집어 THREAD_ID 를 못 읽고 이후 스텝이 전부 skip 되던 버그(머지 알림 누락) 해소
- 헬퍼 4개를 $RUNNER_TEMP 공유 스크립트로 추출해 스텝 간 중복 제거(checkout 불필요)
- 커밋 수는 .pull_request.commits 로 정확화

클라 적응: push 트리거·alert-direct-push 잡 제외, ready_for_review→reopened,
작업 요약 섹션 매칭+중첩 불릿 스킵, 부모 카드 라벨 서식을 갱신 카드와 통일.
최신 커밋 메시지는 contents:read 없이 동작하도록 PR commits 엔드포인트로 조회.

* 재오픈된 PR 의 부모 재고정·스레드 복구 (reopened 흐름 정상화)

reopened 는 메타 주석이 이미 있어 post_parent 스텝이 스킵되는데, 부모 고정·상태
복구가 그 스텝 출력에만 의존해 재오픈 시 깨졌다. reopened 는 서버 봇엔 없고 클라
트리거라, 이 흐름 버그는 클라 전용이다.

- 부모 재고정: pin 스텝의 부모 id 를 post_parent → find_meta 로 폴백하고 조건도
  find_meta.message_id 를 포함하도록 넓혀, 재오픈 시 상단 고정이 복구되게 한다.
- 스레드 복구: 종료 시 archived·locked 로 잠그고 이름에 🗑️ 프리픽스를 다는데,
  재오픈 시 되돌리는 경로가 없어 이후 synchronize 답글이 잠긴 스레드라 실패했다.
  reopened 에 unarchive·unlock + 이름 원복 스텝을 추가한다.

* fix: 게스트 인증 플로우 버그 2건 수정 + 관련 UX 개선 (#291)

* fix: 게스트 MEMBER_ONLY 접근 시 로그인 무한 루프 수정

회원(MEMBER) 토큰일 때만 로그인 페이지를 건너뛰도록 제한.
게스트는 로그인에 남아 archive↔login 무한 루프 방지.

* fix: 게스트 자동 로그인 시 현재 요청부터 token 적용되도록 수정

* refactor: 로그인 약관 안내 문구를 page로 분리

* feat: 게스트 세션 살아있는 경우 게스트 로그인 선택 시 리프레시 진행

* style: 토스트 위치 오류 수정

* feat: 게스트 로그인 redirect path가 /archive인 경우 /home으로 이동 및 안내 토스트 노출

* fix: 앱 부팅 시 refresh cookie 죽는 문제 해결

* fix: proxy에서 앱 auth token 도 처리 가능하도록 수정

* refactor: 앱 token refresh timeout 추가

* fix: 앱 토큰 만료(401) 시 WebView 쿠키도 정리

* fix: 앱 refresh 응답 snake_case 파싱 수정

* chore: proxy.ts refresh 401 임시 안전망 제거 (백엔드 rotation grace 적용) (#295)

* chore: proxy.ts refresh 401 임시 안전망 제거 (백엔드 rotation grace 적용) (#295)

* fix: iOS 26 Safari 노치 영역이 흰색으로 보이는 문제 수정 (#293)

Co-authored-by: Jung Sun A <amber0809@naver.com>

* refactor: 로그인 후 리다이렉트 로직 유틸로 추출

- 로그인 성공 후 경로 계산 중복 제거 (getPostLoginRedirectPath)

* fix: 공유 위시 등록 시 refresh 401이면 죽은 토큰 정리

Share Extension이 만료된 토큰으로 재시도를 반복하지 않도록 refresh 401 시 clearTokens 호출

---------

Co-authored-by: 조영찬 <tigerbone@naver.com>

* feat: Sentry 에러 모니터링 도입 (#296)

* feat: web Sentry 에러 모니터링 도입

* feat: app Sentry 에러 모니터링 도입

* feat: web/app sentry 에러 로깅 규약 추가

- app: @sentry/react-native 셋업(_layout init+wrap, metro, 플러그인, eas 환경별 주입)
- 공용 captureError 유틸(web/app) — 태그/컨텍스트 일관 부착
- API 5xx·네트워크 에러 중앙 수집(axios 인터셉터 / app fetch)
- 유저 식별 setUser(id), 세션 만료 시 해제
- error.tsx 캡처, ignoreErrors 노이즈 필터
- app WebView onError/onHttpError, 백그라운드 FCM 핸들러 수집

* test: 에러 검증용 테스트 페이지 생성

* fix: SENTRY_AUTH_TOKEN turbo passThroughEnv 추가 (소스맵 업로드)

* feat: Session Replay 마스킹 완화 (이메일만 마스킹, 나머지 노출)

* feat: API 에러 리포트 제목을 'API {status} {method} {path}' 형식으로 개선

* Revert "test: 에러 검증용 테스트 페이지 생성"

This reverts commit 87f9e53.

* fix: 소셜 로그인 5xx 응답 JSON 파싱 실패 시 Sentry 수집 누락 수정

* fix: 로그아웃 시 Sentry 유저 컨텍스트 해제

* fix: Session Replay 타이핑 입력창만 마스킹 (maskAllInputs)

* fix: 소셜 로그인 2xx 응답 본문 파싱 실패도 Sentry 수집

* feat: mutation 오류 발생 시 Sentry 로깅 추가

* docs: 역할정리 수정

* docs: 역할 관련 문서 업데이트

---------

Co-authored-by: sevineleven <117634128+sevineleven@users.noreply.github.com>
Co-authored-by: 조영찬 <tigerbone@naver.com>
iOdiO89 added a commit that referenced this pull request Jul 11, 2026
* docs: 역할 분배 문서 추가

* docs: 현재 api 에러 대응 현황 문서 추가

* docs: 에러 처리 정책 문서 추가

* feat: 공통 API 에러 메시지 유틸 추가

* feat: 전역 mutation/query 에러 안전망 도입

* refactor: 비어있는 개별 onError 삭제 (전역 안전망 위임)

* refactor: 개별 훅 5xx 토스트 분기 제거 (이중 토스트 방지)

* PR 봇을 Slack 에서 Discord 로 이관 (#308)

* chore: PR 봇을 Slack 에서 Discord 로 이관

slack-pr-bot.yml 제거 + discord-pr-bot.yml 추가 (서버 PIKI-Server 검증본 기반).
리뷰어 멘션(initial_reviewers + requested_reviewers)·연관 이슈(close #N) 로직 동일.

클라 slack 커밋 이력(#14·#17·#18·#20)을 추적해 서버와 다른 클라 특화를 반영:
- 트리거·부모 메시지 조건: ready_for_review → reopened (#17, 기존 slack 봇과 동일).
- 요약 파싱 섹션명: Task → 작업 요약 (클라 PR 템플릿이 '## 작업 요약'). 클라 slack 은 두 요약 함수의
  섹션명이 '작업 내용'/'작업 요약' 으로 불일치(#20 이 한쪽만 수정)해 부모 메시지 요약이 항상 비던 버그가
  있었는데, 이관본은 둘 다 '작업 요약' 으로 통일해 함께 고친다.
- 요약에서 중첩 리스트('  -') skip (#18).

alert-direct-push job 제외(클라 범위 밖). 배포는 클라가 Vercel 이라 이 이관 범위 밖.
secret(DISCORD_BOT_TOKEN 공유·DISCORD_PR_CHANNEL_ID 전용·DISCORD_USER_MAP) 설정 완료.

* PR 봇 부모 메시지 라벨을 갱신 메시지와 같은 볼드·대문자 서식으로 통일

부모(최초) 메시지는 '🔥 연관 이슈'·'**branch**' 처럼 볼드 없는 소문자였고
갱신 메시지는 '🔥 **연관 이슈**'·'**Branch**' 로 달라, 첫 갱신 때 라벨 서식이
바뀌어 보였다. 부모 쪽을 갱신 쪽 서식에 맞춰 일치시킨다.

* synchronize 알림의 커밋 수·최신 커밋을 페이지네이션에 견고하게 계산

PR 커밋 API 는 30개/페이지(오래된→최신 순)라 첫 페이지만 받아 length 로 세면
31개 이상 PR 에서 커밋 수가 30 으로 잘리고, 첫 페이지 .[-1] 도 최신 커밋이 아니었다.
커밋 수는 이벤트 payload 의 .pull_request.commits 로, 최신 커밋은 마지막 페이지
(per_page=1 & page=총개수)로 집어 정확하게 만든다.

* PR 봇 서버 개선 반영 (상태 리액션·부모 고정·스레드 정리·라벨·헬퍼 공유) (#310)

* PR 봇에 상태 리액션·부모 고정·스레드 정리·라벨 표시·헬퍼 공유 반영

이관 이후 서버 봇에 쌓인 개선을 클라 봇에 맞춰 반영한다.

- 상태 리액션: 부모 메시지에 열림/작업중/머지/종료를 이모지로 전환 표시(429 rate limit 재시도 포함)
- 부모 고정: 열린(리뷰 대기) PR 부모를 채널 상단에 고정, 종료 시 해제
- 스레드 정리: 종료 시 스레드명에 결과 프리픽스(✅/🗑️)+archive+lock
- 부모 카드에 라벨 표시(build_label_text)
- find_meta 가 메타 주석을 JSON 마커로 정확히 매칭 — 파일명을 언급한 리뷰 코멘트를
  집어 THREAD_ID 를 못 읽고 이후 스텝이 전부 skip 되던 버그(머지 알림 누락) 해소
- 헬퍼 4개를 $RUNNER_TEMP 공유 스크립트로 추출해 스텝 간 중복 제거(checkout 불필요)
- 커밋 수는 .pull_request.commits 로 정확화

클라 적응: push 트리거·alert-direct-push 잡 제외, ready_for_review→reopened,
작업 요약 섹션 매칭+중첩 불릿 스킵, 부모 카드 라벨 서식을 갱신 카드와 통일.
최신 커밋 메시지는 contents:read 없이 동작하도록 PR commits 엔드포인트로 조회.

* 재오픈된 PR 의 부모 재고정·스레드 복구 (reopened 흐름 정상화)

reopened 는 메타 주석이 이미 있어 post_parent 스텝이 스킵되는데, 부모 고정·상태
복구가 그 스텝 출력에만 의존해 재오픈 시 깨졌다. reopened 는 서버 봇엔 없고 클라
트리거라, 이 흐름 버그는 클라 전용이다.

- 부모 재고정: pin 스텝의 부모 id 를 post_parent → find_meta 로 폴백하고 조건도
  find_meta.message_id 를 포함하도록 넓혀, 재오픈 시 상단 고정이 복구되게 한다.
- 스레드 복구: 종료 시 archived·locked 로 잠그고 이름에 🗑️ 프리픽스를 다는데,
  재오픈 시 되돌리는 경로가 없어 이후 synchronize 답글이 잠긴 스레드라 실패했다.
  reopened 에 unarchive·unlock + 이름 원복 스텝을 추가한다.

* fix: 게스트 인증 플로우 버그 2건 수정 + 관련 UX 개선 (#291)

* fix: 게스트 MEMBER_ONLY 접근 시 로그인 무한 루프 수정

회원(MEMBER) 토큰일 때만 로그인 페이지를 건너뛰도록 제한.
게스트는 로그인에 남아 archive↔login 무한 루프 방지.

* fix: 게스트 자동 로그인 시 현재 요청부터 token 적용되도록 수정

* refactor: 로그인 약관 안내 문구를 page로 분리

* feat: 게스트 세션 살아있는 경우 게스트 로그인 선택 시 리프레시 진행

* style: 토스트 위치 오류 수정

* feat: 게스트 로그인 redirect path가 /archive인 경우 /home으로 이동 및 안내 토스트 노출

* fix: 앱 부팅 시 refresh cookie 죽는 문제 해결

* fix: proxy에서 앱 auth token 도 처리 가능하도록 수정

* refactor: 앱 token refresh timeout 추가

* fix: 앱 토큰 만료(401) 시 WebView 쿠키도 정리

* fix: 앱 refresh 응답 snake_case 파싱 수정

* chore: proxy.ts refresh 401 임시 안전망 제거 (백엔드 rotation grace 적용) (#295)

* chore: proxy.ts refresh 401 임시 안전망 제거 (백엔드 rotation grace 적용) (#295)

* fix: iOS 26 Safari 노치 영역이 흰색으로 보이는 문제 수정 (#293)

Co-authored-by: Jung Sun A <amber0809@naver.com>

* refactor: 로그인 후 리다이렉트 로직 유틸로 추출

- 로그인 성공 후 경로 계산 중복 제거 (getPostLoginRedirectPath)

* fix: 공유 위시 등록 시 refresh 401이면 죽은 토큰 정리

Share Extension이 만료된 토큰으로 재시도를 반복하지 않도록 refresh 401 시 clearTokens 호출

---------

Co-authored-by: 조영찬 <tigerbone@naver.com>

* feat: Sentry 에러 모니터링 도입 (#296)

* feat: web Sentry 에러 모니터링 도입

* feat: app Sentry 에러 모니터링 도입

* feat: web/app sentry 에러 로깅 규약 추가

- app: @sentry/react-native 셋업(_layout init+wrap, metro, 플러그인, eas 환경별 주입)
- 공용 captureError 유틸(web/app) — 태그/컨텍스트 일관 부착
- API 5xx·네트워크 에러 중앙 수집(axios 인터셉터 / app fetch)
- 유저 식별 setUser(id), 세션 만료 시 해제
- error.tsx 캡처, ignoreErrors 노이즈 필터
- app WebView onError/onHttpError, 백그라운드 FCM 핸들러 수집

* test: 에러 검증용 테스트 페이지 생성

* fix: SENTRY_AUTH_TOKEN turbo passThroughEnv 추가 (소스맵 업로드)

* feat: Session Replay 마스킹 완화 (이메일만 마스킹, 나머지 노출)

* feat: API 에러 리포트 제목을 'API {status} {method} {path}' 형식으로 개선

* Revert "test: 에러 검증용 테스트 페이지 생성"

This reverts commit 87f9e53.

* fix: 소셜 로그인 5xx 응답 JSON 파싱 실패 시 Sentry 수집 누락 수정

* fix: 로그아웃 시 Sentry 유저 컨텍스트 해제

* fix: Session Replay 타이핑 입력창만 마스킹 (maskAllInputs)

* fix: 소셜 로그인 2xx 응답 본문 파싱 실패도 Sentry 수집

* feat: mutation 오류 발생 시 Sentry 로깅 추가

* docs: 역할정리 수정

* docs: 역할 관련 문서 업데이트

---------

Co-authored-by: sevineleven <117634128+sevineleven@users.noreply.github.com>
Co-authored-by: 조영찬 <tigerbone@naver.com>
iOdiO89 added a commit that referenced this pull request Jul 11, 2026
* chore: iOS Smart Banner 설정

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* feat: iOS Universal Link 설정 및 딥링크 라우팅 확장

- AASA 파일 추가 (콜백/api 경로는 exclude)
- iOS associatedDomains 설정
- Universal Link/Smart Banner app-argument의 https URL을 WebView 경로로 라우팅

* feat: android app link 관련 config 추가

* chore: proxy.ts refresh 401 임시 안전망 제거 (백엔드 rotation grace 적용) (#295)

* fix: iOS 26 Safari 노치 영역이 흰색으로 보이는 문제 수정 (#293)

Co-authored-by: Jung Sun A <amber0809@naver.com>

* PR 봇을 Slack 에서 Discord 로 이관 (#308)

* chore: PR 봇을 Slack 에서 Discord 로 이관

slack-pr-bot.yml 제거 + discord-pr-bot.yml 추가 (서버 PIKI-Server 검증본 기반).
리뷰어 멘션(initial_reviewers + requested_reviewers)·연관 이슈(close #N) 로직 동일.

클라 slack 커밋 이력(#14·#17·#18·#20)을 추적해 서버와 다른 클라 특화를 반영:
- 트리거·부모 메시지 조건: ready_for_review → reopened (#17, 기존 slack 봇과 동일).
- 요약 파싱 섹션명: Task → 작업 요약 (클라 PR 템플릿이 '## 작업 요약'). 클라 slack 은 두 요약 함수의
  섹션명이 '작업 내용'/'작업 요약' 으로 불일치(#20 이 한쪽만 수정)해 부모 메시지 요약이 항상 비던 버그가
  있었는데, 이관본은 둘 다 '작업 요약' 으로 통일해 함께 고친다.
- 요약에서 중첩 리스트('  -') skip (#18).

alert-direct-push job 제외(클라 범위 밖). 배포는 클라가 Vercel 이라 이 이관 범위 밖.
secret(DISCORD_BOT_TOKEN 공유·DISCORD_PR_CHANNEL_ID 전용·DISCORD_USER_MAP) 설정 완료.

* PR 봇 부모 메시지 라벨을 갱신 메시지와 같은 볼드·대문자 서식으로 통일

부모(최초) 메시지는 '🔥 연관 이슈'·'**branch**' 처럼 볼드 없는 소문자였고
갱신 메시지는 '🔥 **연관 이슈**'·'**Branch**' 로 달라, 첫 갱신 때 라벨 서식이
바뀌어 보였다. 부모 쪽을 갱신 쪽 서식에 맞춰 일치시킨다.

* synchronize 알림의 커밋 수·최신 커밋을 페이지네이션에 견고하게 계산

PR 커밋 API 는 30개/페이지(오래된→최신 순)라 첫 페이지만 받아 length 로 세면
31개 이상 PR 에서 커밋 수가 30 으로 잘리고, 첫 페이지 .[-1] 도 최신 커밋이 아니었다.
커밋 수는 이벤트 payload 의 .pull_request.commits 로, 최신 커밋은 마지막 페이지
(per_page=1 & page=총개수)로 집어 정확하게 만든다.

* PR 봇 서버 개선 반영 (상태 리액션·부모 고정·스레드 정리·라벨·헬퍼 공유) (#310)

* PR 봇에 상태 리액션·부모 고정·스레드 정리·라벨 표시·헬퍼 공유 반영

이관 이후 서버 봇에 쌓인 개선을 클라 봇에 맞춰 반영한다.

- 상태 리액션: 부모 메시지에 열림/작업중/머지/종료를 이모지로 전환 표시(429 rate limit 재시도 포함)
- 부모 고정: 열린(리뷰 대기) PR 부모를 채널 상단에 고정, 종료 시 해제
- 스레드 정리: 종료 시 스레드명에 결과 프리픽스(✅/🗑️)+archive+lock
- 부모 카드에 라벨 표시(build_label_text)
- find_meta 가 메타 주석을 JSON 마커로 정확히 매칭 — 파일명을 언급한 리뷰 코멘트를
  집어 THREAD_ID 를 못 읽고 이후 스텝이 전부 skip 되던 버그(머지 알림 누락) 해소
- 헬퍼 4개를 $RUNNER_TEMP 공유 스크립트로 추출해 스텝 간 중복 제거(checkout 불필요)
- 커밋 수는 .pull_request.commits 로 정확화

클라 적응: push 트리거·alert-direct-push 잡 제외, ready_for_review→reopened,
작업 요약 섹션 매칭+중첩 불릿 스킵, 부모 카드 라벨 서식을 갱신 카드와 통일.
최신 커밋 메시지는 contents:read 없이 동작하도록 PR commits 엔드포인트로 조회.

* 재오픈된 PR 의 부모 재고정·스레드 복구 (reopened 흐름 정상화)

reopened 는 메타 주석이 이미 있어 post_parent 스텝이 스킵되는데, 부모 고정·상태
복구가 그 스텝 출력에만 의존해 재오픈 시 깨졌다. reopened 는 서버 봇엔 없고 클라
트리거라, 이 흐름 버그는 클라 전용이다.

- 부모 재고정: pin 스텝의 부모 id 를 post_parent → find_meta 로 폴백하고 조건도
  find_meta.message_id 를 포함하도록 넓혀, 재오픈 시 상단 고정이 복구되게 한다.
- 스레드 복구: 종료 시 archived·locked 로 잠그고 이름에 🗑️ 프리픽스를 다는데,
  재오픈 시 되돌리는 경로가 없어 이후 synchronize 답글이 잠긴 스레드라 실패했다.
  reopened 에 unarchive·unlock + 이름 원복 스텝을 추가한다.

* fix: 게스트 인증 플로우 버그 2건 수정 + 관련 UX 개선 (#291)

* fix: 게스트 MEMBER_ONLY 접근 시 로그인 무한 루프 수정

회원(MEMBER) 토큰일 때만 로그인 페이지를 건너뛰도록 제한.
게스트는 로그인에 남아 archive↔login 무한 루프 방지.

* fix: 게스트 자동 로그인 시 현재 요청부터 token 적용되도록 수정

* refactor: 로그인 약관 안내 문구를 page로 분리

* feat: 게스트 세션 살아있는 경우 게스트 로그인 선택 시 리프레시 진행

* style: 토스트 위치 오류 수정

* feat: 게스트 로그인 redirect path가 /archive인 경우 /home으로 이동 및 안내 토스트 노출

* fix: 앱 부팅 시 refresh cookie 죽는 문제 해결

* fix: proxy에서 앱 auth token 도 처리 가능하도록 수정

* refactor: 앱 token refresh timeout 추가

* fix: 앱 토큰 만료(401) 시 WebView 쿠키도 정리

* fix: 앱 refresh 응답 snake_case 파싱 수정

* chore: proxy.ts refresh 401 임시 안전망 제거 (백엔드 rotation grace 적용) (#295)

* chore: proxy.ts refresh 401 임시 안전망 제거 (백엔드 rotation grace 적용) (#295)

* fix: iOS 26 Safari 노치 영역이 흰색으로 보이는 문제 수정 (#293)

Co-authored-by: Jung Sun A <amber0809@naver.com>

* refactor: 로그인 후 리다이렉트 로직 유틸로 추출

- 로그인 성공 후 경로 계산 중복 제거 (getPostLoginRedirectPath)

* fix: 공유 위시 등록 시 refresh 401이면 죽은 토큰 정리

Share Extension이 만료된 토큰으로 재시도를 반복하지 않도록 refresh 401 시 clearTokens 호출

---------

Co-authored-by: 조영찬 <tigerbone@naver.com>

* feat: Sentry 에러 모니터링 도입 (#296)

* feat: web Sentry 에러 모니터링 도입

* feat: app Sentry 에러 모니터링 도입

* feat: web/app sentry 에러 로깅 규약 추가

- app: @sentry/react-native 셋업(_layout init+wrap, metro, 플러그인, eas 환경별 주입)
- 공용 captureError 유틸(web/app) — 태그/컨텍스트 일관 부착
- API 5xx·네트워크 에러 중앙 수집(axios 인터셉터 / app fetch)
- 유저 식별 setUser(id), 세션 만료 시 해제
- error.tsx 캡처, ignoreErrors 노이즈 필터
- app WebView onError/onHttpError, 백그라운드 FCM 핸들러 수집

* test: 에러 검증용 테스트 페이지 생성

* fix: SENTRY_AUTH_TOKEN turbo passThroughEnv 추가 (소스맵 업로드)

* feat: Session Replay 마스킹 완화 (이메일만 마스킹, 나머지 노출)

* feat: API 에러 리포트 제목을 'API {status} {method} {path}' 형식으로 개선

* Revert "test: 에러 검증용 테스트 페이지 생성"

This reverts commit 87f9e53.

* fix: 소셜 로그인 5xx 응답 JSON 파싱 실패 시 Sentry 수집 누락 수정

* fix: 로그아웃 시 Sentry 유저 컨텍스트 해제

* fix: Session Replay 타이핑 입력창만 마스킹 (maskAllInputs)

* fix: 소셜 로그인 2xx 응답 본문 파싱 실패도 Sentry 수집

* fix: 페이지별 토스트 위치 커스터마이즈 (탭바 페이지 토스트 겹침 수정) (#309)

* feat: 토스트 offset 페이지별 override 메커니즘 추가

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix: 홈 탭바 위로 토스트 위치 조정

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix: 보관 페이지 하단 바 위로 토스트 위치 조정

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* chore: 토스트 offset 수치 조정

* refactor: 토스트 offset zustand 스토어를 CSS :has() 마커 방식으로 대체

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* feat: 딥링크 전환 로딩 오버레이 추가

* feat: 앱 링크 접속시 warm start 기능 추가

* PR 봇 스레드를 팀 전원이 볼 수 있게 (스레드 멤버 자동 추가) (#313)

* PR 봇 스레드에 팀원 자동 추가로 팀 전원 사이드바 노출

Discord 공개 스레드는 멤버(생성자·초대·멘션된 사람)만 사이드바에 뜬다. 부모 카드가
작성자만 @멘션해 작성자만 자기 PR 스레드가 보이고 남의 스레드는 안 떴다.

- 스레드 생성 직후 DISCORD_USER_MAP 의 팀원 전원을 thread-members 로 추가해 새 PR
  스레드가 팀 전원 사이드바에 뜨게 한다(멘션과 달리 조용히 목록에만 올림).
- 이 변경 이전 열린 PR 스레드용으로 backfill-thread-members 잡을 추가한다
  (workflow_dispatch 수동 실행). notify-discord 는 pull_request 로 가드해 dispatch 시엔 안 돈다.

* 연관 이슈 링크의 Discord 임베드 카드 억제

부모 카드의 연관 이슈 링크가 GitHub 임베드 카드로 커지게 떠서 본문(작업 요약 등)을
아래로 밀어냈다. 이슈 URL 을 <> 로 감싸 임베드만 억제하고 클릭 링크는 유지한다.
PR 타이틀 링크는 그대로 둬 PR 카드는 계속 뜬다.

* 작업 요약 추출이 STAR 의 Task 섹션도 인식

FE 팀 PR 은 ## 작업 요약, 서버 STAR 로 쓴 PR 은 ## Task 를 쓴다. build_summary 가
작업 요약만 찾아 STAR PR 은 '요약 없음'이 됐다. 두 섹션명을 모두 인식하게 해
어느 관례로 쓰든 요약이 채워지게 한다.

* 작업 요약의 Task 섹션 인식 제거

FE 팀은 ## 작업 요약을 쓰고 봇이 이미 이를 매칭하므로, STAR 의 ## Task 인식 추가는
불필요해 되돌린다. 요약은 PR 본문에 ## 작업 요약 을 두는 팀 관례로 채운다.

* PR 봇 재싱크: 머지 스레드 잠금 해제 + 종합 백필 (서버 #703 반영) (#315)

서버 봇(#703)과 갈라진 두 가지를 클라에도 반영해 동작을 일치시킨다.

- 머지 시 close 정리에서 locked 제거(archived 만) — 닫히되 글을 쓸 수 있게(archived 만이라
  글을 쓰면 다시 열림). 머지된 PR 스레드가 잠겨 글을 못 쓰던 문제 해소.
- 백필 잡을 종합형(backfill-threads)으로 교체: 열린 PR→팀원 추가+열림, 머지 PR→✅+닫힘,
  미머지 닫힘→🗑️+닫힘. 기존엔 열린 스레드 팀원 추가만 했다. 과거 find_meta 버그로 안 닫힌
  스레드까지 소급 정리(멱등).

* refactor: 링크 입력창 모바일 키보드를 일반 텍스트 키보드로 변경 (#325)

* feat: 전역 API 에러 안전망 도입 및 개별 훅 에러 처리 정리 (#311)

* docs: 역할 분배 문서 추가

* docs: 현재 api 에러 대응 현황 문서 추가

* docs: 에러 처리 정책 문서 추가

* feat: 공통 API 에러 메시지 유틸 추가

* feat: 전역 mutation/query 에러 안전망 도입

* refactor: 비어있는 개별 onError 삭제 (전역 안전망 위임)

* refactor: 개별 훅 5xx 토스트 분기 제거 (이중 토스트 방지)

* PR 봇을 Slack 에서 Discord 로 이관 (#308)

* chore: PR 봇을 Slack 에서 Discord 로 이관

slack-pr-bot.yml 제거 + discord-pr-bot.yml 추가 (서버 PIKI-Server 검증본 기반).
리뷰어 멘션(initial_reviewers + requested_reviewers)·연관 이슈(close #N) 로직 동일.

클라 slack 커밋 이력(#14·#17·#18·#20)을 추적해 서버와 다른 클라 특화를 반영:
- 트리거·부모 메시지 조건: ready_for_review → reopened (#17, 기존 slack 봇과 동일).
- 요약 파싱 섹션명: Task → 작업 요약 (클라 PR 템플릿이 '## 작업 요약'). 클라 slack 은 두 요약 함수의
  섹션명이 '작업 내용'/'작업 요약' 으로 불일치(#20 이 한쪽만 수정)해 부모 메시지 요약이 항상 비던 버그가
  있었는데, 이관본은 둘 다 '작업 요약' 으로 통일해 함께 고친다.
- 요약에서 중첩 리스트('  -') skip (#18).

alert-direct-push job 제외(클라 범위 밖). 배포는 클라가 Vercel 이라 이 이관 범위 밖.
secret(DISCORD_BOT_TOKEN 공유·DISCORD_PR_CHANNEL_ID 전용·DISCORD_USER_MAP) 설정 완료.

* PR 봇 부모 메시지 라벨을 갱신 메시지와 같은 볼드·대문자 서식으로 통일

부모(최초) 메시지는 '🔥 연관 이슈'·'**branch**' 처럼 볼드 없는 소문자였고
갱신 메시지는 '🔥 **연관 이슈**'·'**Branch**' 로 달라, 첫 갱신 때 라벨 서식이
바뀌어 보였다. 부모 쪽을 갱신 쪽 서식에 맞춰 일치시킨다.

* synchronize 알림의 커밋 수·최신 커밋을 페이지네이션에 견고하게 계산

PR 커밋 API 는 30개/페이지(오래된→최신 순)라 첫 페이지만 받아 length 로 세면
31개 이상 PR 에서 커밋 수가 30 으로 잘리고, 첫 페이지 .[-1] 도 최신 커밋이 아니었다.
커밋 수는 이벤트 payload 의 .pull_request.commits 로, 최신 커밋은 마지막 페이지
(per_page=1 & page=총개수)로 집어 정확하게 만든다.

* PR 봇 서버 개선 반영 (상태 리액션·부모 고정·스레드 정리·라벨·헬퍼 공유) (#310)

* PR 봇에 상태 리액션·부모 고정·스레드 정리·라벨 표시·헬퍼 공유 반영

이관 이후 서버 봇에 쌓인 개선을 클라 봇에 맞춰 반영한다.

- 상태 리액션: 부모 메시지에 열림/작업중/머지/종료를 이모지로 전환 표시(429 rate limit 재시도 포함)
- 부모 고정: 열린(리뷰 대기) PR 부모를 채널 상단에 고정, 종료 시 해제
- 스레드 정리: 종료 시 스레드명에 결과 프리픽스(✅/🗑️)+archive+lock
- 부모 카드에 라벨 표시(build_label_text)
- find_meta 가 메타 주석을 JSON 마커로 정확히 매칭 — 파일명을 언급한 리뷰 코멘트를
  집어 THREAD_ID 를 못 읽고 이후 스텝이 전부 skip 되던 버그(머지 알림 누락) 해소
- 헬퍼 4개를 $RUNNER_TEMP 공유 스크립트로 추출해 스텝 간 중복 제거(checkout 불필요)
- 커밋 수는 .pull_request.commits 로 정확화

클라 적응: push 트리거·alert-direct-push 잡 제외, ready_for_review→reopened,
작업 요약 섹션 매칭+중첩 불릿 스킵, 부모 카드 라벨 서식을 갱신 카드와 통일.
최신 커밋 메시지는 contents:read 없이 동작하도록 PR commits 엔드포인트로 조회.

* 재오픈된 PR 의 부모 재고정·스레드 복구 (reopened 흐름 정상화)

reopened 는 메타 주석이 이미 있어 post_parent 스텝이 스킵되는데, 부모 고정·상태
복구가 그 스텝 출력에만 의존해 재오픈 시 깨졌다. reopened 는 서버 봇엔 없고 클라
트리거라, 이 흐름 버그는 클라 전용이다.

- 부모 재고정: pin 스텝의 부모 id 를 post_parent → find_meta 로 폴백하고 조건도
  find_meta.message_id 를 포함하도록 넓혀, 재오픈 시 상단 고정이 복구되게 한다.
- 스레드 복구: 종료 시 archived·locked 로 잠그고 이름에 🗑️ 프리픽스를 다는데,
  재오픈 시 되돌리는 경로가 없어 이후 synchronize 답글이 잠긴 스레드라 실패했다.
  reopened 에 unarchive·unlock + 이름 원복 스텝을 추가한다.

* fix: 게스트 인증 플로우 버그 2건 수정 + 관련 UX 개선 (#291)

* fix: 게스트 MEMBER_ONLY 접근 시 로그인 무한 루프 수정

회원(MEMBER) 토큰일 때만 로그인 페이지를 건너뛰도록 제한.
게스트는 로그인에 남아 archive↔login 무한 루프 방지.

* fix: 게스트 자동 로그인 시 현재 요청부터 token 적용되도록 수정

* refactor: 로그인 약관 안내 문구를 page로 분리

* feat: 게스트 세션 살아있는 경우 게스트 로그인 선택 시 리프레시 진행

* style: 토스트 위치 오류 수정

* feat: 게스트 로그인 redirect path가 /archive인 경우 /home으로 이동 및 안내 토스트 노출

* fix: 앱 부팅 시 refresh cookie 죽는 문제 해결

* fix: proxy에서 앱 auth token 도 처리 가능하도록 수정

* refactor: 앱 token refresh timeout 추가

* fix: 앱 토큰 만료(401) 시 WebView 쿠키도 정리

* fix: 앱 refresh 응답 snake_case 파싱 수정

* chore: proxy.ts refresh 401 임시 안전망 제거 (백엔드 rotation grace 적용) (#295)

* chore: proxy.ts refresh 401 임시 안전망 제거 (백엔드 rotation grace 적용) (#295)

* fix: iOS 26 Safari 노치 영역이 흰색으로 보이는 문제 수정 (#293)

Co-authored-by: Jung Sun A <amber0809@naver.com>

* refactor: 로그인 후 리다이렉트 로직 유틸로 추출

- 로그인 성공 후 경로 계산 중복 제거 (getPostLoginRedirectPath)

* fix: 공유 위시 등록 시 refresh 401이면 죽은 토큰 정리

Share Extension이 만료된 토큰으로 재시도를 반복하지 않도록 refresh 401 시 clearTokens 호출

---------

Co-authored-by: 조영찬 <tigerbone@naver.com>

* feat: Sentry 에러 모니터링 도입 (#296)

* feat: web Sentry 에러 모니터링 도입

* feat: app Sentry 에러 모니터링 도입

* feat: web/app sentry 에러 로깅 규약 추가

- app: @sentry/react-native 셋업(_layout init+wrap, metro, 플러그인, eas 환경별 주입)
- 공용 captureError 유틸(web/app) — 태그/컨텍스트 일관 부착
- API 5xx·네트워크 에러 중앙 수집(axios 인터셉터 / app fetch)
- 유저 식별 setUser(id), 세션 만료 시 해제
- error.tsx 캡처, ignoreErrors 노이즈 필터
- app WebView onError/onHttpError, 백그라운드 FCM 핸들러 수집

* test: 에러 검증용 테스트 페이지 생성

* fix: SENTRY_AUTH_TOKEN turbo passThroughEnv 추가 (소스맵 업로드)

* feat: Session Replay 마스킹 완화 (이메일만 마스킹, 나머지 노출)

* feat: API 에러 리포트 제목을 'API {status} {method} {path}' 형식으로 개선

* Revert "test: 에러 검증용 테스트 페이지 생성"

This reverts commit 87f9e53.

* fix: 소셜 로그인 5xx 응답 JSON 파싱 실패 시 Sentry 수집 누락 수정

* fix: 로그아웃 시 Sentry 유저 컨텍스트 해제

* fix: Session Replay 타이핑 입력창만 마스킹 (maskAllInputs)

* fix: 소셜 로그인 2xx 응답 본문 파싱 실패도 Sentry 수집

* feat: mutation 오류 발생 시 Sentry 로깅 추가

* docs: 역할정리 수정

* docs: 역할 관련 문서 업데이트

---------

Co-authored-by: sevineleven <117634128+sevineleven@users.noreply.github.com>
Co-authored-by: 조영찬 <tigerbone@naver.com>

* refactor: 게스트 참여 dead code 제거 (#321)

* refactor: 게스트 참여 dead code 제거

* refactor: 게스트 참여 dead code 제거 2

---------

Co-authored-by: Jung Sun A <amber0809@naver.com>

* chore: update app version

* chore: eas config 삭제

* refactor: 링크 입력 시 텍스트에서 URL 자동 추출 (#323)

* refactor: 링크 입력 시 텍스트에서 URL 자동 추출

* fix: URL 패턴 anchor 추가로 트레일링 텍스트 제출 방지

* fix: warm start 딥링크 보류 처리

* fix: 앱 내비게이션 타이머 갱신

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: 조영찬 <tigerbone@naver.com>
Co-authored-by: sevineleven <117634128+sevineleven@users.noreply.github.com>
Co-authored-by: kanghaeun <145974230+kanghaeun@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

PR 봇을 Slack 에서 Discord 로 이관

1 participant