# 2026-04-06 작업일지

## 오늘 작업

- Plan API의 `Load Failed`, 완료건 정상처리, 삭제 요청 실패 같은 기본 동작 오류를 먼저 정리
- Plan 목록/상세에서 작업 ID 표기, 자동화 진행 상태, 로딩/오류 메시지, 복사 버튼 등 사용성 보강
- Chat 화면이 선택된 Plan 문맥을 더 직접적으로 답하도록 서버 응답과 헤더 UX를 계속 보완
- `Codex Live`와 `앱로그 > 에러 로그` 구조를 나누고, 에러 로그 상세 화면을 탭/미리보기 중심으로 확장
- 앱 설정을 드롭다운 구조와 `app config` 저장 방식으로 재구성하고 DB 동기화, 스냅샷 캐시, 즉시 반영 흐름 정리
- Docs 작업일지를 산출물 브라우저와 섹션 탭 기반 미리보기 형태로 키우고, `## 소스`/`## 실행 커맨드`/`## 변경 파일` 포맷을 통일
- 작업일지 스크린샷 자동화, 중복 제거, 날짜별 연결 규칙을 정리하고 3월 30일~4월 6일 문서를 후속 보강
- 토큰 미등록 사용자의 Plan/설정 접근 범위를 readonly와 403 기준으로 제한

## 이슈 및 메모

- Fastify는 빈 바디인데 `Content-Type: application/json`만 있는 `DELETE` 요청을 `400`으로 거절해 프런트 공통 요청 유틸 수정이 필요했음
- 완료건 정상처리, 자동 재처리, 자동화 설정 반영 시점이 서로 어긋나면 사용자 입장에서는 저장 실패처럼 보여 서버/프런트 기준을 같이 맞춰야 했음
- 작업일지 본문만 보여주던 방식으로는 스크린샷, 로그, 코드 diff, 변경 파일을 따라가기 어려워 산출물 브라우저가 필요했음
- 에러 로그/채팅/작업일지 preview가 각각 다른 규칙으로 렌더링돼 fenced code, 커맨드 블록, 파일 목록 표시가 계속 들쭉날쭉했음
- 토큰 미등록 사용자에게는 Plan 상세, 메모, 소스 작업, 설정 일부를 그대로 노출하면 안 돼 화면과 API를 동시에 잠가야 했음

## 결정 사항

- 공통 API 유틸은 HTTP 메서드가 아니라 실제 바디 유무 기준으로 `Content-Type`을 설정
- 자동화 실패 후 메모 저장이나 이슈 조치만으로는 자동 재처리를 다시 켜지 않도록 `retry=false` 기본값을 유지
- 작업일지 preview는 Markdown 본문 외 산출물도 같은 카드 안에서 섹션 단위 탭으로 노출
- 작업일지 `## 소스`는 파일 나열보다 "요약 설명 + 대표 diff" 중심으로 고정
- 앱 설정은 클라이언트 임시 상태가 아니라 DB 저장값과 비교 가능한 `app config` 구조로 관리
- 토큰 미등록 사용자는 Plan 관련 쓰기 작업과 민감 상세 열람을 모두 제한

## 상세 작업 내역

- `src/features/planBoard/api.ts`에서 요청 타임아웃/재시도와 헤더 구성을 다듬어 `Load Failed`, 삭제 실패, 정상처리 갱신 문제를 함께 줄였음
- `src/features/planBoard/PlanBoardPage.tsx`에서 작업 ID 표기, 자동화 상태 설명, 오류 알림 복사, 진행중 우선 정렬, readonly 처리, 작업일지 산출물 브라우저를 순차 반영
- `etc/servers/work-server/src/services/chat-service.ts`는 Chat 화면이어도 `planId`가 있으면 상태/이력/이슈를 같이 답하게 보강했고, 응답 제한 이유도 더 직접적으로 바꿨음
- `src/app/main/MainChatPanel.tsx`와 서버 에러 로그 라우트/서비스를 연결해 `앱로그 > 에러 로그` 화면과 상세 탭/최대화/참조 preview를 정리했음
- `src/app/main/MainHeader.tsx`, `src/app/main/appConfig.ts`, `etc/servers/work-server/src/routes/app-config.ts` 계층에서 앱 설정 드롭다운, DB 저장, 동기화, 캐시, 즉시 반영 흐름을 묶었음
- `src/components/markdownPreview/MarkdownPreviewCard.tsx`, `src/components/markdownPreview/MarkdownPreviewContent.tsx`, `src/components/previewer/*`는 작업일지/산출물 preview를 공통 포맷 레이어로 렌더링하게 바꿨음
- `scripts/capture-menu-screenshot.mjs`, `scripts/capture-feature-screenshot.mjs`, `scripts/worklog-capture-utils.mjs`로 메뉴/기능 캡처와 작업일지 연결을 자동화했고, 불필요한 날짜 참조는 다시 정리했음
- `docs/worklogs/2026-03-30.md`부터 `docs/worklogs/2026-04-06.md`까지 문서 포맷과 스크린샷/소스/커맨드/변경 파일 섹션을 현재 규칙에 맞게 보강했음

## 스크린샷

- 저장소 기준 연결된 스크린샷 없음

## 소스

- Plan 기본 동작 안정화: 완료건 정상처리, 삭제, 재시도, 오류 표시에 걸친 프런트/서버 동작을 정리했습니다.
- `src/features/planBoard/api.ts`, `src/features/planBoard/PlanBoardPage.tsx`, `etc/servers/work-server/src/services/plan-service.ts`: 요청 헤더, 타임아웃, 목록 정렬, readonly, 완료 처리와 자동 재처리 기준을 함께 맞췄습니다.
- Chat/앱로그 확장: 선택된 Plan 문맥 응답과 에러 로그 상세 뷰를 계속 키웠습니다.
- `etc/servers/work-server/src/services/chat-service.ts`, `src/app/main/MainChatPanel.tsx`, `src/app/main/errorLogApi.ts`: Chat 답변 문맥, 앱로그 메뉴 구조, 에러 로그 조회/상세/preview 흐름을 연결했습니다.
- 작업일지/증적 preview 정리: 문서 본문, 코드, 커맨드, 변경 파일을 같은 시각 규칙으로 렌더링하게 통일했습니다.
- `src/components/markdownPreview/MarkdownPreviewContent.tsx`, `src/components/previewer/renderers.tsx`, `docs/templates/worklog-template.md`: 작업일지 포맷과 preview 렌더러를 섹션 중심으로 정리했습니다.

```diff
diff --git a/src/features/planBoard/api.ts b/src/features/planBoard/api.ts
+  const hasBody = init?.body !== undefined && init.body !== null;
...
-  headers.set('Content-Type', 'application/json');
+  if (hasBody && !headers.has('Content-Type')) {
+    headers.set('Content-Type', 'application/json');
+  }
```

```diff
diff --git a/src/app/main/MainHeader.tsx b/src/app/main/MainHeader.tsx
- <button>앱 설정</button>
+ <Dropdown menu={{ items: appConfigMenus }}>
+   <button>앱 설정</button>
+ </Dropdown>
```

```diff
diff --git a/src/components/previewer/renderers.tsx b/src/components/previewer/renderers.tsx
+export function renderMarkdownSectionPreview(section, context) {
+  if (section.type === 'code') return <CodeBlockPreview {...context} />;
+  if (section.type === 'command') return <CommandLogPreview {...context} />;
+  return <DefaultSectionPreview {...context} />;
+}
```

## 변경 파일 (전체, 중복 제거, KST 기준)

- M src/app/main/MainChatPanel.tsx
- M src/styles.css
- M etc/servers/work-server/src/services/app-config-service.ts
- M etc/servers/work-server/src/workers/plan-worker.ts
- M src/app/main/MainHeader.tsx
- M src/components/window/WindowUI.tsx
- M src/app/main/MainSidebar.tsx
- M src/app/main/MainView.tsx
- M etc/servers/work-server/src/services/plan-service.ts
- M src/features/planBoard/PlanBoardPage.tsx
- M src/features/planBoard/api.ts
- M etc/servers/work-server/src/services/plan-policy.test.ts
- M etc/servers/work-server/src/app.ts
- M etc/servers/work-server/src/services/error-log-service.ts
- M src/app/main/errorLogApi.ts
- M src/app/main/MainContent.tsx
- M src/app/main/types.ts
- A etc/servers/work-server/src/routes/error-log.ts
- A etc/servers/work-server/src/services/error-log-service.ts
- M src/App.tsx
- A src/app/main/errorLogApi.ts
- M etc/servers/work-server/src/routes/app-config.ts
- M src/app/main/appConfig.ts
- A etc/servers/work-server/src/routes/app-config.ts
- A etc/servers/work-server/src/services/app-config-service.ts
- M etc/servers/work-server/src/config/env.ts
- M etc/servers/work-server/src/routes/plan.ts
- M etc/servers/work-server/src/services/git-service.ts
- M etc/servers/work-server/src/services/notification-service.ts
- A src/app/main/appConfig.ts
- M etc/servers/work-server/src/services/chat-service.ts
- M src/features/planBoard/charts.tsx
- M src/features/planBoard/types.ts
- A docs/worklogs/2026-04-03.md
- A docs/worklogs/2026-04-04.md
- A docs/worklogs/2026-04-05.md
- A docs/worklogs/2026-04-06.md
- M etc/servers/work-server/src/services/plan-notification-service.ts
- M etc/servers/work-server/package.json
- A etc/servers/work-server/src/services/plan-notification-policy.ts
- A etc/servers/work-server/src/services/plan-policy.test.ts
- A etc/servers/work-server/src/services/plan-retry-policy.ts
- M src/sw.js

## 실행 커맨드

```bash
npx tsc -b
npm run build:app
npm run capture:menu -- --date 2026-04-06
npm run capture:feature -- --date 2026-04-06
npm run plan:codex:once
```

## 변경 파일

- `docs/templates/worklog-template.md`
- `docs/worklogs/2026-03-30.md`
- `docs/worklogs/2026-03-31.md`
- `docs/worklogs/2026-04-01.md`
- `docs/worklogs/2026-04-02.md`
- `docs/worklogs/2026-04-03.md`
- `docs/worklogs/2026-04-04.md`
- `docs/worklogs/2026-04-05.md`
- `docs/worklogs/2026-04-06.md`
- `etc/servers/work-server/src/routes/app-config.ts`
- `etc/servers/work-server/src/routes/error-log.ts`
- `etc/servers/work-server/src/routes/plan.ts`
- `etc/servers/work-server/src/services/app-config-service.ts`
- `etc/servers/work-server/src/services/chat-service.ts`
- `etc/servers/work-server/src/services/error-log-service.ts`
- `etc/servers/work-server/src/services/plan-service.ts`
- `etc/servers/work-server/src/workers/plan-worker.ts`
- `scripts/capture-feature-screenshot.mjs`
- `scripts/capture-menu-screenshot.mjs`
- `scripts/worklog-capture-utils.mjs`
- `src/app/main/MainChatPanel.tsx`
- `src/app/main/MainHeader.tsx`
- `src/app/main/appConfig.ts`
- `src/app/main/errorLogApi.ts`
- `src/components/markdownPreview/MarkdownPreviewCard.tsx`
- `src/components/markdownPreview/MarkdownPreviewContent.tsx`
- `src/components/previewer/PreviewerUI.css`
- `src/components/previewer/PreviewerUI.tsx`
- `src/components/previewer/renderers.tsx`
- `src/features/planBoard/PlanBoardPage.tsx`
- `src/features/planBoard/api.ts`
- `src/styles.css`
