← 목록
기타 2026-07-06 6KB 읽기 6분

team.crowny.org — 새 방 모달 + 새 채팅창 + 크라우니허브 커밋

개요

team.crowny.org(크라우니 팀 협업 채팅, :9978) 3기능 추가. 사용자 요청: "새 방 이름 정하기 → 팝업이 모달로. 새 방은 새 채팅창. 작성하면서 작업내용 커밋하고, 커밋 밑에 멘션/추가커밋본 링크(크라우니허브커밋)."

무엇을 했는지

  1. 새 방 모달 — 브라우저 prompt('새 방 이름') 제거 → 크라우니디자인 토큰 기반 모달(#modal). 이름 설정(rename)도 모달로 통일.
  2. 새 방 = 새 채팅창 — 모달에서 방 이름 입력 → window.open('/?룸=<이름>','_blank')로 새 탭 오픈. 로드 시 ?룸= 쿼리를 읽어 그 창의 대상 방으로 설정(document.title도 방 이름으로).
  3. 크라우니허브 커밋 — 작성창의 💾 버튼 → 작업내용을 크라우니허브 commit team-work 스냅샷 + 실 해시.
- 커밋 카드 밑 액션 2개: +추가커밋본(부모 해시 링크한 후속 커밋), @멘션(코멘트). - 피드 스레딩: §CMT§해시§부모§요약 / §RPL§부모§내용 마커로 WAL 4필드 포맷 무변경(하위호환). 프론트가 해시맵으로 부모 커밋 카드 밑에 자식 커밋·멘션을 중첩 렌더.

관련 파일

  • /Users/ef/crowny-team/팀서버.한선 — API커밋(/api/team/commit), 쉘안전/개행복원/헥스인가/해시추출 헬퍼, 커밋경로, 라우트. (492KB .toau 배포)
  • /Users/ef/crowny-team/팀채팅.html — 서빙본. 모달 시스템, ?룸= 로드, 새방(), commit()/추가커밋()/멘션(), 렌더 스레딩.
  • /Users/ef/crowny-team/크라우니메신저UI.html — 원본 템플릿(동기화됨).
  • 스냅샷: /Users/ef/crowny-data/team/commits/<시각>-<색인>.txt → hub team-work 서비스로 버전관리.

배포/검증

  • LaunchAgent org.crowny.team(KeepAlive) → 팀서버.toau. hanseonc_high 재컴파일 → kickstart -k 재기동.
  • ⚠️ 함정: launchd 제한 PATH엔 node 없음 → hub 호출 시 /opt/homebrew/bin/node 절대경로 필수(상대 node면 해시=nohub).
  • E2E 검증: 커밋→실해시 a1414e8b, 추가커밋본→941fc7ac(부모 링크), 멘션→§RPL§ 저장. hub log team-work에 커밋 이력 반영 확인. HTML node --check 통과.

2차 (같은 날) — 팀 분리 + 회원 로그인 + 초대 + follow-up

무엇을 했는지

  1. 팀별 채팅방 분리 — 메시지에 팀 차원 추가. WAL을 5번째 ^필드(팀)로 확장(하위호환: 4필드 레거시=공용팀 자동배정). 방목록·피드·전송·커밋 전부 필터. 공용=레거시 방(본부/개발/플렉스)이 자동 격리, 새 팀은 자기 방만 보임. 봇(@크라우니)도 발신 팀으로 응답 전파.
  2. 크라우니 회원 로그인 — 별도 계정 안 만들고 crowny-game(:9775) JWT 회원 재사용. team(한선씨 서버)이 /api/auth/{register,login,me}를 crowny-game으로 위임 프록시(curl). Authorization: Bearer 토큰→닉 검증(캐시). send/commit은 토큰이 있으면 검증된 닉으로 발신 강제(위조 차단), 없으면 공용 익명 허용(하위호환).
  3. 멤버 초대 — 팀 워크스페이스(팀.psv/팀원.psv). teamcreate(소유자=생성자), invite(닉네임으로 팀 추가), teams(내 팀+공용), teammembers. 멤버 패널에 초대 UI.
  4. follow-up ① 스냅샷 방별 분리+프룬: commits/<팀>/<룸>/<시각>-<색인>.txt, 디렉토리별 최근 50개만 유지(hub 재귀 스캔이라 하위디렉토리 커밋됨).
  5. follow-up ② 크라우니브라우저용 크라우니메신저UI.한선 double 반영: 커밋/멘션 마커 파싱(§CMT§/§RPL§)·팀/인증 엔드포인트 어댑터 추가. 자가검증 18/18 통과.

관련 파일 (2차)

  • 팀서버.한선 — 인증프록시/헤더토큰/토큰안전/토큰닉(캐시)/API내정보, 팀모델(_팀복원·팀에속했나·팀원추가·API팀생성/내팀들/초대/팀원목록), 메시지 팀차원(_저장·_메모리적재·_복원·봇처리·API전송·커밋·피드·방목록 전부 팀). 파일안전.
  • 팀채팅.html(+크라우니메신저UI.html 동기화) — 로그인 상태·인증()헤더·로그인모달(login/register 토글)·팀바(팀그리기/팀전환/팀생성)·초대하기, 모달 다중필드 지원, 새방 URL에 팀 유지.
  • 크라우니메신저UI.한선 — UI 결정로직 double(마커파싱·엔드포인트).

검증 (2차, E2E)

  • 가입→토큰, /me 닉검증, 팀생성 t<ts>_0, 초대→팀원 2인, 팀방 전송 시 발신='위조'무시→검증닉 강제 ✅
  • 팀 격리: 팀방 기획이 공용 방목록에 안 보임 ✅ / 봇이 팀방에서 팀 유지하며 응답 ✅
  • headless Chrome: 팀바·로그인칩·모달 렌더, 콘솔 에러 0 ✅ / html 31.7KB(<64KB 캡) ✅
  • 한선 double 18/18, 서버 컴파일 exit0.

함정 기록 (2차)

  • launchd 체계() curl은 재시작 직후 레이스로 첫 호출이 빈 응답("연결 실패") 가능 — 워밍업 후 정상. (crowny-game 준비 타이밍)
  • WAL 5필드 확장은 본문정리가 ^→∧ 치환하므로 안전(본문에 ^ 못 들어감). 레거시 4필드는 길이(칸)>=5 체크로 팀=공용 폴백.
  • 라우팅 substring 매칭 주의: /api/team/teammembers/api/team/members를 substring 포함 안 함(직후 문자 't'), teammembers를 teams보다 먼저 체크.

잔여 이슈

  • 멘션은 커밋 해시 기준 스레딩(부모 커밋이 피드 최근 40개 밖이면 top-level 폴백).
  • 초대는 크라우니 회원 존재 검증 없이 닉네임 문자열로 추가(해당 닉 로그인 시 매칭). 오타 초대 가능.
  • send/commit마다 토큰 검증(캐시 후 0비용, 첫 호출만 crowny-game curl). crowny-game 다운 시 로그인/검증 불가(공용 익명은 계속 가능).
  • 팀 삭제·나가기·역할(소유자 외 권한) 미구현.