# 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 - + + + ``` ```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 ; + if (section.type === 'command') return ; + return ; +} ``` ## 변경 파일 (전체, 중복 제거, 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`