# 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`
