feat(mail): 쪽지함 — 크루 우편함을 화면으로(사장 발신·대기·배달 기록·실패함 재투입) - #292
Merged
Conversation
…d + 배달 기록(.log.jsonl), 수신 slug 저장 관문 검증 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…실패 기록 삭제 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…), 사이드바 항목·i18n ko/en Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…I 실측 2회 연속 이중 배달)
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
무엇
크루 우편함(
src/crewmail.mjs,mail/)은 지금까지 send_to_crew·회의실 cc로만 채워지고 화면이 없었다. 사이드바 "쪽지함" 페이지로 드러낸다.src/crewmail.mjs:listMail(pending·dead·log) /cancelMail(대기만,.claimed는 거부) /requeueDead(attempts 0·lastError 제거로 복귀, .corrupt 불가) /deleteDead. 배달 기록mail/.log.jsonl— 성공·실패·소진·취소 시 한 줄 append(실패는 배달을 막지 않음), 2000줄 초과 시 읽을 때 최근 1000줄로 절단(ponytail:주석).mail/은 sync EXCLUDE라 동기화 미영향(기존 테스트로 잠겨 있음).sendCrewMail이 수신 slug·cc를 검증(/·\·..·dot 접두 거부). 격리 재현에서 API로to:"../x"를 넘기자<ws root>/x/에 파일이 생겼다 — 사장 발신 API가 화면 입력을 그대로 넘기므로 저장 관문에서 막았다.app/api/companies/[ws]/mail/route.js: GET/POST(사장 발신 — room.mjs cc와 같은from:'captain', fromRole:'captain', 이름은 회사 언어별 '사장'/'the captain')/DELETE(?to=&id=)/PATCH({op:'requeue'|'deleteDead', file}). guardCompany·에러 형식은 routines 라우트 동일.app/c/[ws]/mail/page.jsx: 보내기(수신 DropUp·참조 칩 토글 ≤4·textarea) / ① 대기 중(수신·발신·종류·시각·시도·배달 중 칩·취소) / ② 배달 기록(성공·실패·취소 점 + 수신 크루 대화 Link) / ③ 실패함(재투입·삭제 — ConfirmModal). 5초 폴링. 사이드바 항목 +mail아이콘, i18n ko/en 34키.검증
node --test test/crewmail.test.mjs23/23 (신규 7: listMail 구조·cancel의 .claimed 거부·배달 로그 성공/실패·requeueDead·deleteDead(.corrupt)·경로 검증·sendCrewMail slug 관문)npm test922 tests / 917 pass / 0 fail / 5 skipped ·npx next build통과artifacts/mail-light.png,artifacts/mail-dark.png(로컬, 미커밋).artifacts/mail-dead.png,artifacts/mail-delete-modal.png.to:"../x"→ 400잘못된 크루 slug.미검증
🤖 Generated with Claude Code