# 2026-04-02 작업일지

## 오늘 작업

- 루트 `README.md`를 현재 앱 구조와 스크립트 기준으로 최신화
- `docs/README.md`의 문서 운영 기준을 실제 디렉터리 구조와 Docs 수집 방식에 맞게 정리
- 오늘 작업일지에 문서 최신화 내역을 추가
- `window-ui` 공통 컴포넌트를 추가
- 윈도우 헤더 드래그, 리사이즈, 최소화, 최대화, 복원 동작을 구성
- 모바일 터치 기반 드래그와 버튼 터치 영역을 보정
- 멀티 윈도우 추천 배치, 가로 분할, 세로 분할, 그리드 배치를 추가
- 배치 이후 창 순서를 사용자가 조정할 수 있는 UI를 추가
- 활성화된 윈도우가 항상 최상단으로 오도록 z-index 정렬을 추가
- 전체화면 버튼을 빈 공간 우선 확장 후 부모 전체 확장 방식으로 보정
- `previewer-ui` 공통 컴포넌트를 추가
- `text`, `json`, `code`, `image`, `markdown`, `empty` preview 타입을 구성
- JSON preview에 영역별 컬러 토큰 표시를 추가
- Code preview에 언어 선택과 VSCode 스타일 표현을 추가
- Previewer 샘플에 TypeScript, JSON, HTML, CSS, Bash, SQL, YAML 예제를 추가
- 메인 앱을 PWA 오프라인 캐시 전략으로 보강
- 모바일 헤더/사이드바 동작을 손봐서 메뉴 선택 흐름을 단순화
- 헤더 액션 영역과 전체화면 토글 동작을 재정리
- `src/layer/gesture`를 추가해 모바일 우측 상단 제스처를 레이어로 관리
- `src/store/appStore`를 추가해 현재 페이지와 포커스 컴포넌트 상태를 관리
- `src/layer/search`를 추가해 통합검색 모달과 검색 옵션을 레이어 컨텍스트로 관리
- `SearchCommandModal` 통합 검색 컴포넌트를 추가
- 문서, API, 컴포넌트, 위젯 키워드 자동 추천과 빠른 이동을 연결
- 모바일 입력 확대 방지와 검색 모달 포커스 동작을 보정
- 빌드 산출물 추적 정리를 위해 `.gitignore`를 보강하고 `app-dist`, `dev-dist` 무시 준비를 진행
- `etc/db/work-db` 경로로 PostgreSQL 도커 구성을 분리하고 `.env` 기반 설정을 정리
- `etc/servers/work-server`에 `Fastify + PostgreSQL` 기반 작업 API 서버를 추가
- Plan 게시판용 등록, 수정, 삭제, 테이블 생성 API를 추가
- Plan 게시판이 웹서버 프록시(`/api`)를 통해 `work-server`를 바라보도록 수정
- Plan 항목 등록 시 작업 ID, 요청 메모, 대상 브랜치/릴리즈 흐름을 함께 관리하도록 화면과 서버 모델을 정리
- Plan 항목을 주기적으로 읽어 `등록 -> 작업중(브랜치 준비)`와 `개발완료 -> 완료(release merge)` 흐름을 자동화하는 worker를 추가
- `scripts/run-plan-codex-once.mjs`로 단건 Plan 항목을 읽어 Codex 실행 결과를 조치 이력에 반영하는 자동화 스크립트를 추가
- Plan 자동화 실패 시 상태를 `이슈`로 바꾸지 않고 해시태그/오류 이력으로 관리하도록 변경
- `etc` 내부에서 커밋되면 안 되는 `.env`, `node_modules`, `dist`, 로그 파일을 루트 `.gitignore`에서도 명시적으로 제외
- `작업시작` 이후에는 원본 요청을 수정할 수 없도록 잠금 규칙을 추가
- 작업 이후 변경 사항은 일반 조치 이력과 이슈 조치 이력으로 누적 기록되도록 확장
- 컴포넌트/화면 스크린샷을 생성한 뒤 작업일지 `## 화면 캡처` 섹션에 자동 링크하는 스크립트를 정리
- Plan 게시판 메모 상세의 모바일 높이를 절반 수준으로 줄이도록 조정
- 작업일지 캡처 스크립트를 공통 유틸로 정리하고 누락 방지용 모바일 Plan 상세 캡처를 추가

## 이슈 및 메모

- `vite-plugin-pwa`는 `vite@8`과 peer 경고가 있어 도커 실행 시 `npm install --force`가 필요
- 작업일지 이미지 표시를 위해 markdown preview가 전체 블록을 렌더링하도록 수정
- 컴포넌트 캡처 자동화는 `Playwright` 기반으로 스크린샷을 생성하고 작업일지 링크를 함께 추가
- 캡처 스크립트는 날짜별 폴더를 만들고 동일 날짜 작업일지에 이미지 Markdown 링크를 자동 삽입함
- iOS에서는 제스처 후 키보드 오픈 보장이 제한적이라 강제 포커스 로직보다 레이어 분리와 단순 동작 유지에 우선순위를 둠
- Plan 자동화는 현재 저장소 worktree가 깨끗해야 브랜치 생성이 가능함
- 현재 저장소에는 `release` 브랜치가 아직 없어 실제 자동 merge를 쓰려면 브랜치 생성이 먼저 필요함
- 컨테이너 내부 git은 `safe.directory` 이슈가 있어 자동 처리 로직을 추가함
- Plan 이력 테이블 추가 이후 기존 실패 데이터에는 과거 이력이 없을 수 있어 재시도로 새 이력을 만드는 방식으로 정리함
- `run-plan-codex-once`는 최근 조치 이력/이슈 이력을 프롬프트에 포함해 재작업이나 보완 요청을 우선 반영하도록 구성함

## 결정 사항

- 공통 미리보기 컴포넌트는 `src/components/previewer` 아래에서 관리
- 공통 윈도우 컴포넌트는 `src/components/window` 아래에서 관리
- 작업일지 캡처 이미지는 `docs/assets/worklogs/YYYY-MM-DD/`에 저장
- 컴포넌트 캡처는 전체 화면이 아니라 샘플 컴포넌트 영역 중심으로 생성
- 앱 상태 저장은 `src/store`
- 화면 전역 UI는 `src/layer`
- 통합검색은 store가 아니라 layer context로 관리
- 프로젝트 내부 부가 서버/DB는 `etc/servers/<name>`, `etc/db/<name>` 구조로 관리
- `etc` 내부의 비밀값/생성물은 각 하위 `.gitignore`와 루트 `.gitignore`에서 이중으로 차단
- Plan 게시판은 상태 수기 변경보다 자동화 중심 흐름을 우선하고, 사용자는 상태별 허용 액션 버튼만 사용
- 원본 요청은 `작업시작` 이후 읽기 전용으로 전환하고 추가 조치사항은 이력으로만 남김
- 스크린샷 자산은 날짜별 작업일지와 1:1로 연결하고 캡처 직후 문서 링크까지 자동 반영

## 상세 작업 내역

- 초기 문서에 남아 있던 구형 `src/components/inputs`, `src/views/main` 기준 설명을 현재 `src/app/main`, `src/components/*`, `src/features/planBoard` 구조에 맞춰 교체
- 루트 안내문에서 실행 스크립트, 앱 섹션, 문서 위치를 한 번에 확인할 수 있도록 정리
- Docs 가이드에 실제 Markdown 수집 범위와 문서 최신화 기록 원칙을 반영
- `window-ui`, `previewer-ui` 추가 이후 앱 전반 구조가 컴포넌트 문서/샘플 허브 형태로 더 선명해짐
- PWA 오프라인 캐시 전략과 모바일 레이아웃 보정을 함께 진행해 실제 사용 환경 대응 범위를 넓힘
- `gesture`, `search`, `store/appStore`를 나눠 전역 UI와 상태 책임을 분리하는 기준을 세움
- 통합검색은 문서, API, 컴포넌트, 위젯을 한 흐름에서 찾도록 묶고 모달/제스처/포커스 추적을 연결
- 빌드 산출물 추적을 정리하며 `.gitignore`와 Git 인덱스 운영 기준도 함께 정비
- `work-server`는 Plan 게시판 API, DB 연결, worker 자동화 역할을 함께 가지도록 확장
- Plan 게시판은 단순 상태 보드가 아니라 등록 정보, 조치 이력, 이슈 이력, 원본 요청 잠금 규칙까지 함께 관리하는 작업 큐 성격으로 확장
- 등록 단계에서는 작업 ID와 요청 내용을 남기고, 자동화 단계에서는 브랜치 확보, Codex 실행, 커밋/푸시, release 반영 가능 여부를 순차적으로 판단하도록 흐름을 정리
- 자동화 worker는 현재 저장소에 직접 브랜치를 만들고 `release` 브랜치 머지까지 시도하되, 작업 디렉터리가 dirty면 이슈 태그와 오류 이력을 남기고 안전하게 멈춤
- Plan 화면에서는 브랜치명, 자동화 상태, 최근 오류, 이슈 태그, 조치 이력을 함께 확인할 수 있게 보강
- `작업시작` 이후 서버는 원본 요청 수정 API를 `409`로 차단하고, 화면에서도 메모/작업 ID를 읽기 전용으로 전환
- 스크린샷 처리 스크립트는 `docs/assets/worklogs/YYYY-MM-DD/` 저장, `docs/worklogs/YYYY-MM-DD.md` 링크 반영, 중복 링크 방지까지 한 번에 수행하도록 맞춤
- 검색 모달, 프리뷰어, 윈도우 UI 캡처는 각각 샘플 셀렉터를 기준으로 잘라 저장해 작업일지 증적 자료로 재사용 가능하게 구성
- Plan 게시판은 모바일에서 `새 메모` 상세를 바로 캡처하는 스크립트를 추가해 메모 높이 보정 결과를 작업일지에 바로 남길 수 있게 함

## 스크린샷

![plan-board-mobile-memo-detail](../assets/worklogs/2026-04-02/plan-board-mobile-memo-detail.png)
![previewer-ui](../assets/worklogs/2026-04-02/previewer-ui.png)
![search-command](../assets/worklogs/2026-04-02/search-command.png)
![window-ui](../assets/worklogs/2026-04-02/window-ui.png)

## 소스

- `src/components/window/WindowUI.tsx`: 드래그, 리사이즈, 분할 배치를 지원하는 공통 윈도우 UI를 추가했습니다.
- `src/components/previewer/PreviewerUI.tsx`: `text/json/code/image/markdown` 등 여러 증적 형식을 한 컴포넌트에서 미리보게 만들었습니다.
- `src/components/search/SearchCommandModal.tsx`: 문서, API, 컴포넌트, 위젯을 한 번에 찾는 통합 검색 모달을 추가했습니다.
- `src/features/planBoard/PlanBoardPage.tsx`: Plan 게시판 UI와 상세 흐름을 본격 추가했습니다.
- `etc/servers/work-server/src/workers/plan-worker.ts`, `scripts/run-plan-codex-once.mjs`: Plan 자동화 워커와 Codex 실행기를 도입해 브랜치 준비, 작업 실행, 반영 흐름을 자동화했습니다.

```diff
diff --git a/etc/servers/work-server/src/workers/plan-worker.ts b/etc/servers/work-server/src/workers/plan-worker.ts
+export class PlanWorker {
+  private readonly workerId: string;
+  private timer: NodeJS.Timeout | null = null;
+  private running = false;
...
+      await this.processRegisteredPlans();
+      await this.processExecutablePlans();
+      await this.processReleaseReadyPlans();

diff --git a/scripts/run-plan-codex-once.mjs b/scripts/run-plan-codex-once.mjs
+const planItemId = process.env.PLAN_ITEM_ID ? Number(process.env.PLAN_ITEM_ID) : null;
+const codexBin = process.env.PLAN_CODEX_BIN ?? 'codex';
...
+function requiresSourceChange(note) {
+  return /(?:\/|\\).+\.[a-z0-9]+/i.test(text) || /(생성|만들어|추가|수정|변경|삭제|파일)/.test(text);
+}
```

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

- M scripts/run-plan-codex-once.mjs
- M .gitignore
- M etc/servers/work-server/.env.example
- M etc/servers/work-server/docker-compose.yml
- M etc/servers/work-server/src/services/plan-service.ts
- M etc/servers/work-server/src/workers/plan-worker.ts
- M src/features/planBoard/PlanBoardPage.tsx
- M src/main.tsx
- 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 src/features/planBoard/types.ts
- M package.json
- A scripts/run-plan-codex-once.mjs
- M docs/README.md
- M docs/worklogs/2026-04-02.md
- M src/features/planBoard/api.ts
- M docker-compose.yml
- A etc/db/work-db/.env.example
- A etc/db/work-db/.gitignore
- A etc/db/work-db/README.md
- A etc/db/work-db/docker-compose.yml
- A etc/servers/work-server/.env.example
- A etc/servers/work-server/.gitignore
- A etc/servers/work-server/README.md
- A etc/servers/work-server/docker-compose.yml
- A etc/servers/work-server/package-lock.json
- A etc/servers/work-server/package.json
- A etc/servers/work-server/src/app.ts
- A etc/servers/work-server/src/config/env.ts
- A etc/servers/work-server/src/db/client.ts
- A etc/servers/work-server/src/lib/identifier.ts
- A etc/servers/work-server/src/routes/crud.ts
- A etc/servers/work-server/src/routes/ddl.ts
- A etc/servers/work-server/src/routes/health.ts
- A etc/servers/work-server/src/routes/plan.ts
- A etc/servers/work-server/src/routes/schema.ts
- A etc/servers/work-server/src/server.ts
- A etc/servers/work-server/src/services/git-service.ts
- A etc/servers/work-server/src/services/plan-service.ts
- A etc/servers/work-server/src/workers/plan-worker.ts
- A etc/servers/work-server/tsconfig.json
- M src/app/main/MainContent.tsx
- M src/app/main/MainHeader.tsx
- M src/app/main/MainSidebar.tsx
- M src/app/main/MainView.tsx
- M src/app/main/types.ts
- A src/features/planBoard/PlanBoardPage.tsx
- A src/features/planBoard/api.ts
- A src/features/planBoard/index.ts
- A src/features/planBoard/types.ts
- M src/store/appStore/types/index.ts
- M src/styles.css
- M vite.config.ts
- A docs/assets/worklogs/2026-04-02/search-command.png
- M docs/templates/worklog-template.md
- M docs/worklogs/2026-03-30.md
- M docs/worklogs/2026-03-31.md
- M docs/worklogs/2026-04-01.md
- A scripts/capture-search-command-screenshot.mjs
- D app-dist/apple-touch-icon.svg
- D app-dist/assets/2026-03-30-C9zIPzPv.js
- D app-dist/assets/2026-03-31-DnTx-3Nm.js
- D app-dist/assets/2026-04-01-HPg12E04.js
- D app-dist/assets/AntdIcon-Byo_R91X.js
- D app-dist/assets/CloseOutlined-B6nrJF3-.js
- D app-dist/assets/InputUI-w7gS2eD_.js
- D app-dist/assets/MultiProgressUI-BrtiP5fC.js
- D app-dist/assets/ProgressUI-CcSfL1yk.js
- D app-dist/assets/README-C7FUDFuk.js
- D app-dist/assets/README-CCe9ioJ1.js
- D app-dist/assets/Sample-3CFWfRoz.js
- D app-dist/assets/Sample-AyuQ97sV.css
- D app-dist/assets/Sample-BVdBpN2O.js
- D app-dist/assets/Sample-BX522g-L.js
- D app-dist/assets/Sample-BcLA6P4T.js
- D app-dist/assets/Sample-BdE7za0g.js
- D app-dist/assets/Sample-CJuh1XyL.js
- D app-dist/assets/Sample-CXTqMdzC.js
- D app-dist/assets/Sample-CYEm5q8n.js
- D app-dist/assets/Sample-D8WPIGkO.js
- D app-dist/assets/Sample-DCMU_ANA.js
- D app-dist/assets/Sample-DucAjs70.css
- D app-dist/assets/Sample-H43X1Va0.js
- D app-dist/assets/Sample-H8g2LJhv.js
- D app-dist/assets/Sample-IHgSYgwU.css
- D app-dist/assets/Sample-iMOOVcMn.js
- D app-dist/assets/SearchOutlined-Civ7xtmP.js
- D app-dist/assets/TmsDeliveryFlowSample-BIsYLVLu.js
- D app-dist/assets/TmsDeliveryMetricsSample-Cij5-xON.js
- D app-dist/assets/ValidInputSample-DfYNB-Xp.js
- D app-dist/assets/WidgetShell-BuID0-5g.js
- D app-dist/assets/WmsInboundOutboundSample-D8v85F-k.js
- D app-dist/assets/WmsInventoryTrendSample-BaOj-o94.js
- D app-dist/assets/button-editable-input-TvwRLJmy.png
- D app-dist/assets/card-C6TZ9YUa.js
- D app-dist/assets/check-combo-Bz7kGmN1.js
- D app-dist/assets/clsx-CzIxj0DI.js
- D app-dist/assets/component-plugin-DrEfBYjG.js
- D app-dist/assets/dashboard-report-presets-BmenDHNL.js
- D app-dist/assets/feature-template-C3ggnfNS.js
- D app-dist/assets/index-CR5AbEsh.js
- D app-dist/assets/index-WZ9gt1kR.css
- D app-dist/assets/input-B6oA1SZJ.js
- D app-dist/assets/input.plugin-BigPQCa9.js
- D app-dist/assets/jsx-runtime-CNArSbpp.js
- D app-dist/assets/main-content-fullscreen-toggle-Cppu1H3t.png
- D app-dist/assets/overview-BtWbOP4n.js
- D app-dist/assets/popup-BGFdvx2z.js
- D app-dist/assets/previewer-ui-BheoU6aq.js
- D app-dist/assets/project-setup-B38Eco2m.js
- D app-dist/assets/select-BVXn7KWj.js
- D app-dist/assets/select-oi1Bjv-c.js
- D app-dist/assets/status-badge-C7aul6sS.js
- D app-dist/assets/wave-DQjt-ubw.js
- D app-dist/assets/window-ui-CXDuYQu1.js
- D app-dist/assets/workbox-window.prod.es5-B4qug_J_.js
- D app-dist/assets/worklog-template-Donys780.js
- D app-dist/favicon.svg
- D app-dist/index.html
- D app-dist/manifest.webmanifest
- D app-dist/pwa-192x192.svg
- D app-dist/pwa-512x512.svg
- D app-dist/sw.js
- D app-dist/workbox-8c29f6e4.js
- D dev-dist/sw.js
- D dev-dist/workbox-5a5d9309.js
- A docs/components/search-command.md
- A docs/features/search-layer.md
- M index.html
- A src/components/search/SearchCommandModal.tsx
- A src/components/search/index.ts
- A src/components/search/types.ts
- M src/features/layout/component-sample-gallery/ComponentSamplesLayout.tsx
- M src/features/layout/widget-sample-gallery/SampleWidgetsLayout.tsx
- M src/index.ts
- A src/layer/gesture/context/GestureContext.tsx
- A src/layer/gesture/hooks/useGestureLayer.ts
- A src/layer/gesture/index.ts
- A src/layer/gesture/types/index.ts
- A src/layer/index.ts
- A src/layer/search/context/SearchLayerContext.tsx
- A src/layer/search/hooks/useSearchLayer.ts
- A src/layer/search/index.ts
- A src/layer/search/types/index.ts
- A src/store/appStore/context/AppStoreContext.tsx
- A src/store/appStore/hooks/useAppStore.ts
- A src/store/appStore/index.ts
- A src/store/appStore/types/index.ts
- A src/store/index.ts
- A app-dist/apple-touch-icon.svg
- R app-dist/assets/2026-03-30-C4SD1FRx.js -> app-dist/assets/2026-03-30-C9zIPzPv.js
- R app-dist/assets/2026-03-31-DwLJWvh2.js -> app-dist/assets/2026-03-31-DnTx-3Nm.js
- D app-dist/assets/2026-04-01-D5gI7Q4h.js
- A app-dist/assets/2026-04-01-HPg12E04.js
- R app-dist/assets/InputUI-DAmC5DJh.js -> app-dist/assets/InputUI-w7gS2eD_.js
- R app-dist/assets/MultiProgressUI--uB5kqTr.js -> app-dist/assets/MultiProgressUI-BrtiP5fC.js
- R app-dist/assets/ProgressUI-C91UL-oJ.js -> app-dist/assets/ProgressUI-CcSfL1yk.js
- R app-dist/assets/README-CI9EVrw_.js -> app-dist/assets/README-C7FUDFuk.js
- R app-dist/assets/README-O9_O-4tf2.js -> app-dist/assets/README-CCe9ioJ1.js
- R app-dist/assets/Sample-CeT4nPqx.js -> app-dist/assets/Sample-3CFWfRoz.js
- A app-dist/assets/Sample-AyuQ97sV.css
- R app-dist/assets/Sample-Dyso1eHr.js -> app-dist/assets/Sample-BVdBpN2O.js
- A app-dist/assets/Sample-BX522g-L.js
- R app-dist/assets/Sample-DKoCtyPX.js -> app-dist/assets/Sample-BcLA6P4T.js
- R app-dist/assets/Sample-DMEGMJwT.js -> app-dist/assets/Sample-BdE7za0g.js
- R app-dist/assets/Sample-BJxnglT1.js -> app-dist/assets/Sample-CJuh1XyL.js
- R app-dist/assets/Sample-xgRr-oUd.js -> app-dist/assets/Sample-CXTqMdzC.js
- R app-dist/assets/Sample-BPCdH5hH.js -> app-dist/assets/Sample-CYEm5q8n.js
- R app-dist/assets/Sample-LB0lRdor.js -> app-dist/assets/Sample-D8WPIGkO.js
- R app-dist/assets/Sample-6Ml90fMj.js -> app-dist/assets/Sample-DCMU_ANA.js
- A app-dist/assets/Sample-DucAjs70.css
- D app-dist/assets/Sample-E6V4D3Du.js
- A app-dist/assets/Sample-H43X1Va0.js
- R app-dist/assets/Sample-CLup9Uwo.js -> app-dist/assets/Sample-H8g2LJhv.js
- A app-dist/assets/Sample-IHgSYgwU.css
- A app-dist/assets/Sample-iMOOVcMn.js
- R app-dist/assets/TmsDeliveryFlowSample-BHeS93-n.js -> app-dist/assets/TmsDeliveryFlowSample-BIsYLVLu.js
- R app-dist/assets/TmsDeliveryMetricsSample-BQV5az65.js -> app-dist/assets/TmsDeliveryMetricsSample-Cij5-xON.js
- R app-dist/assets/ValidInputSample-C9pl9si5.js -> app-dist/assets/ValidInputSample-DfYNB-Xp.js
- R app-dist/assets/WidgetShell-DhXCYrC8.js -> app-dist/assets/WidgetShell-BuID0-5g.js
- R app-dist/assets/WmsInboundOutboundSample-BZCM3_0V.js -> app-dist/assets/WmsInboundOutboundSample-D8v85F-k.js
- R app-dist/assets/WmsInventoryTrendSample-DvxPBjgx.js -> app-dist/assets/WmsInventoryTrendSample-BaOj-o94.js
- A app-dist/assets/button-editable-input-TvwRLJmy.png
- R app-dist/assets/card-BpKFEf6A.js -> app-dist/assets/card-C6TZ9YUa.js
- R app-dist/assets/component-plugin-BjxKibxS.js -> app-dist/assets/component-plugin-DrEfBYjG.js
- R app-dist/assets/dashboard-report-presets-Bh8duNGL.js -> app-dist/assets/dashboard-report-presets-BmenDHNL.js
- R app-dist/assets/feature-template-D3D0o1kc.js -> app-dist/assets/feature-template-C3ggnfNS.js
- R app-dist/assets/index-BQsYfbAI.js -> app-dist/assets/index-CR5AbEsh.js
- D app-dist/assets/index-CaXbpawn.css
- A app-dist/assets/index-WZ9gt1kR.css
- R app-dist/assets/input.plugin-ulF_zEvq.js -> app-dist/assets/input.plugin-BigPQCa9.js
- A app-dist/assets/main-content-fullscreen-toggle-Cppu1H3t.png
- R app-dist/assets/overview-DgYaz2rW.js -> app-dist/assets/overview-BtWbOP4n.js
- A app-dist/assets/previewer-ui-BheoU6aq.js
- R app-dist/assets/project-setup-jU8Nv-E8.js -> app-dist/assets/project-setup-B38Eco2m.js
- R app-dist/assets/select-DYfkmyn8.js -> app-dist/assets/select-BVXn7KWj.js
- R app-dist/assets/select-kIZVYgkF.js -> app-dist/assets/select-oi1Bjv-c.js
- R app-dist/assets/status-badge-1fx0opaz.js -> app-dist/assets/status-badge-C7aul6sS.js
- A app-dist/assets/window-ui-CXDuYQu1.js
- A app-dist/assets/workbox-window.prod.es5-B4qug_J_.js
- R app-dist/assets/worklog-template-DE_f72dx.js -> app-dist/assets/worklog-template-Donys780.js
- A app-dist/favicon.svg
- M app-dist/index.html
- A app-dist/manifest.webmanifest
- A app-dist/pwa-192x192.svg
- A app-dist/pwa-512x512.svg
- A app-dist/sw.js
- A app-dist/workbox-8c29f6e4.js
- A dev-dist/sw.js
- A dev-dist/workbox-5a5d9309.js
- A docs/assets/worklogs/2026-04-01/.gitkeep
- A docs/assets/worklogs/2026-04-01/button-editable-input.png
- A docs/assets/worklogs/2026-04-01/main-content-fullscreen-toggle.png
- A docs/assets/worklogs/2026-04-02/.gitkeep
- A docs/assets/worklogs/2026-04-02/previewer-ui.png
- A docs/assets/worklogs/2026-04-02/window-ui.png
- A docs/components/previewer-ui.md
- A docs/components/window-ui.md
- A docs/worklogs/2026-04-02.md
- M package-lock.json
- A public/apple-touch-icon.svg
- A public/favicon.svg
- A public/pwa-192x192.svg
- A public/pwa-512x512.svg
- A scripts/capture-component-screenshot.mjs
- A scripts/capture-fullscreen-toggle-screenshot.mjs
- M src/app/manifests/docs.manifest.ts
- M src/components/markdownPreview/MarkdownPreviewCard.tsx
- M src/components/markdownPreview/MarkdownPreviewContent.tsx
- A src/components/previewer/PreviewerUI.css
- A src/components/previewer/PreviewerUI.tsx
- A src/components/previewer/index.ts
- A src/components/previewer/samples/Sample.tsx
- A src/components/previewer/types/index.ts
- A src/components/previewer/types/previewer.ts
- A src/components/window/WindowUI.css
- A src/components/window/WindowUI.tsx
- A src/components/window/index.ts
- A src/components/window/samples/Sample.tsx
- A src/components/window/types/index.ts
- A src/components/window/types/window.ts
- M src/vite-env.d.ts
- M tsconfig.lib.json

## 실행 커맨드

```bash
npm run build
docker compose up -d
npm run plan:codex:once
node scripts/capture-search-command-screenshot.mjs --date 2026-04-02
npm run capture:plan-mobile -- --date 2026-04-02
```

## 변경 파일

- `docs/worklogs/2026-04-02.md`
- `src/components/window/WindowUI.tsx`
- `src/components/previewer/PreviewerUI.tsx`
- `src/components/search/SearchCommandModal.tsx`
- `src/features/planBoard/PlanBoardPage.tsx`
- `src/layer/search/context/SearchLayerContext.tsx`
- `src/store/appStore/context/AppStoreContext.tsx`
- `etc/servers/work-server/src/routes/plan.ts`
- `etc/servers/work-server/src/services/plan-service.ts`
- `scripts/run-plan-codex-once.mjs`
