# 2026-04-05 작업일지 ## 오늘 작업 - Plan 작업 등록 시 `메인까지 자동등록` 옵션 추가 및 자동 main 반영 흐름 연결 - 대기성 알림을 줄이고 실제 자동화 시작/핵심 단계 중심 알림으로 재정렬 - 기본 진입 화면을 Plans로 조정하고 알림 진입 시 plan 상세 연결 개선 - Plan 성과 차트를 보드 하단에서 별도 사이드 메뉴(차트) 화면으로 분리 - 작업 ID 기본값일 때 알림 제목을 `#채번번호` 기준으로 표기 - Codex Live 채팅 기능 추가 후 별도 Chat 메뉴/사이드바로 분리 - 채팅을 폴링 기반에서 `work-server /ws/chat` WebSocket 기반으로 전환 - Vite 개발 환경에 `/ws/chat` 프록시 추가 및 재연결 안정화 - 채팅 UI를 하단 입력 고정형으로 개편하고 진단/오프라인 폴백 개선 - 진행 알림(1분/3분) 메시지에 현재 처리 단계/요약 반영 - 재처리/재시작 알림 조건 정교화(실제 재실행 예약 시만 노출) - Web Push 알림 태그 충돌(덮어쓰기) 방지 처리 - Noti 토큰 관리 UI 및 전송 조건(토큰 등록 시) 정리 - Docs 기본 선택을 `worklogs`로 조정 - Plan 목록에서 `정상처리 구분(상/중/하)` 즉시 변경 기능 추가 ## 이슈 및 메모 - 채팅 연결 이슈는 프론트 코드보다 프록시/업그레이드 헤더/URL 계산의 영향이 큼 - 진행 알림은 내용 품질이 낮으면 오히려 운영 피로도를 높임 - Web Push는 `tag` 충돌 시 중요한 이벤트가 사라질 수 있어 이벤트 키 설계가 중요 - 재처리 알림은 "실행 예약"과 "단순 응답" 구분이 필요 ## 결정 사항 - 채팅은 WebSocket 기본, 실패 시 진단 가능 메시지와 폴백 제공 - 진행 알림은 `1분 후`, 이후 `3분마다` 유지하되 현재 단계 중심 문구 사용 - 알림 제목은 사용자 입력값보다 채번 ID 우선 전략 유지 - 재시작 알림은 실제 재실행이 예약된 경우에만 발송 - Docs 진입 기본 탭은 작업일지 우선 ## 상세 작업 내역 - Plan/Chat 네비게이션을 재구성해 상단 메뉴-사이드바-콘텐츠 관계를 명확히 분리 - 워커 알림 체계를 시작/경과/완료/재시작으로 세분화하고 노이즈 이벤트를 제거 - 채팅은 UI 레이아웃, 연결 안정성, 진단 문구, 오프라인 대체 응답까지 함께 다듬어 실사용 대응 범위를 확장 - 푸시 알림은 iOS/Web 공통 이벤트 일관성을 높이고 덮어쓰기 문제를 줄이도록 이벤트 키 전략을 조정 - Plan 보드 운영 기능(정상처리 구분, 상세 이동, 자동화 상태 반영)을 보강해 운영 화면으로서 활용도를 높임 ## 스크린샷 ![feature-chat-live](../assets/worklogs/2026-04-05/feature-chat-live.png) ![feature-plans-charts](../assets/worklogs/2026-04-05/feature-plans-charts.png) ## 소스 - `etc/servers/work-server/src/services/chat-service.ts`, `src/app/main/MainChatPanel.tsx`: Codex Live 채팅을 WebSocket 기반으로 연결하고, 현재 화면/Plan 상태를 반영한 응답 흐름을 추가했습니다. - `src/features/planBoard/charts.tsx`, `src/features/planBoard/PlanBoardPage.tsx`: Plan 성과 차트를 별도 메뉴로 분리하고 보드 운영 기능을 확장했습니다. - `src/features/planBoard/api.ts`: Plan 데이터 조회를 `no-store` 중심으로 바꿔 현재 상태가 바로 반영되게 조정했습니다. - `etc/servers/work-server/src/services/plan-service.ts`, `etc/servers/work-server/src/workers/plan-worker.ts`: `메인까지 자동등록`, 정상처리 구분, 진행 알림/재시작 조건을 서버 흐름에 연결했습니다. ```diff diff --git a/etc/servers/work-server/src/services/chat-service.ts b/etc/servers/work-server/src/services/chat-service.ts +type ChatInboundMessage = + | { type: 'context:update'; payload: ChatContext } + | { type: 'message:send'; payload: { text: string } }; ... +function isWorklogRequest(input: string) { + return mentionsWorklog || (normalized.includes('log') && asksToWrite); +} ... +function buildWorklogReply(context: ChatContext | null, snapshot: PlanSnapshot | null) { + return [ + `# ${today} 작업일지`, + '## 오늘 작업', + ].join('\\n'); ``` ## 변경 파일 (전체, 중복 제거, KST 기준) - M etc/servers/work-server/src/services/chat-service.ts - M etc/servers/work-server/src/routes/plan.ts - M src/app/main/MainChatPanel.tsx - M etc/servers/work-server/src/services/plan-notification-service.ts - M src/app/main/MainHeader.tsx - A src/app/main/tokenAccess.ts - M src/features/planBoard/PlanBoardPage.tsx - M etc/servers/work-server/src/config/env.ts - M etc/servers/work-server/src/services/plan-service.ts - M scripts/run-plan-codex-once.mjs - M src/features/planBoard/types.ts - M src/styles.css - M etc/servers/work-server/src/workers/plan-worker.ts - M src/app/main/MainContent.tsx - M vite.config.ts - M etc/servers/work-server/package-lock.json - M etc/servers/work-server/package.json - M etc/servers/work-server/src/server.ts - A etc/servers/work-server/src/services/chat-service.ts - M src/app/main/MainSidebar.tsx - M src/app/main/MainView.tsx - M src/app/main/types.ts - M src/store/appStore/types/index.ts - A src/app/main/MainChatPanel.tsx - A src/features/planBoard/charts.tsx - M src/features/planBoard/index.ts - M src/store/appStore/context/AppStoreContext.tsx - M src/sw.js - M src/features/planBoard/api.ts - M docker-compose.yml - M scripts/serve-app-dist.mjs - R src/sw.ts -> src/sw.js - A scripts/serve-app-dist.mjs - M src/app/main/appUpdate.ts ## 실행 커맨드 ```bash npm run build npm run capture:feature -- --date 2026-04-05 --target chat-live npm run capture:feature -- --date 2026-04-05 --target plans-charts ``` ## 변경 파일 - `docs/worklogs/2026-04-05.md` - `src/app/main/MainChatPanel.tsx` - `src/features/planBoard/PlanBoardPage.tsx` - `src/features/planBoard/charts.tsx` - `src/features/planBoard/api.ts` - `etc/servers/work-server/src/services/plan-service.ts` - `etc/servers/work-server/src/services/plan-notification-service.ts` - `etc/servers/work-server/src/services/plan-notification-policy.ts` - `etc/servers/work-server/src/services/chat-service.ts` - `etc/servers/work-server/src/workers/plan-worker.ts`