From dd5fea7f21dd48e35e1df7b7a52092b893e9d78f Mon Sep 17 00:00:00 2001 From: ysCha Date: Wed, 6 May 2026 18:06:48 +0900 Subject: [PATCH] cluade --- .claude/memory/project_low_pitch_warning.md | 2 +- .gitignore | 1 + CLAUDE.md | 11 +++++- docs/MODULE_CIRCUIT_HANDOVER.md | 2 +- docs/UI_MODAL_HANDOVER.md | 2 +- src/util/debugCapture.js | 44 +++++++++++++++++++++ 6 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 src/util/debugCapture.js diff --git a/.claude/memory/project_low_pitch_warning.md b/.claude/memory/project_low_pitch_warning.md index 1471c5f1..1825d55c 100644 --- a/.claude/memory/project_low_pitch_warning.md +++ b/.claude/memory/project_low_pitch_warning.md @@ -4,7 +4,7 @@ description: 6종 기와(和瓦A/B, 平板瓦C/D, S瓦, セメント瓦) + 寸 2 type: project --- -저구배(2 ≤ pitch < 2.5 寸 OR 11.31 ≤ angle < 14.04°) 에서 6종 기와 사용 시 저장 직전에 안내 alert 띄움 (OK 만, 중단 흐름 없음). (도입 커밋 `[TBD-CODE]`) +저구배(2 ≤ pitch < 2.5 寸 OR 11.31 ≤ angle < 14.04°) 에서 6종 기와 사용 시 저장 직전에 안내 alert 띄움 (OK 만, 중단 흐름 없음). (도입 커밋 `a5d2964e`) 대상 6종 (`getRoofMaterialList` 응답 기준): - `ROOF_ID_WA_53A`, `ROOF_ID_WA_53B` diff --git a/.gitignore b/.gitignore index 7d3a45bb..aaf2bca9 100644 --- a/.gitignore +++ b/.gitignore @@ -51,6 +51,7 @@ certificates # [auto-untracked 2026-05-06] 머신별 자동 산출물 / 알 수 없는 파일 .claude/memory/commit_log.txt .claude/settings.local.json +.claude/.commit-notice last_updated.log claude-501/ sl diff --git a/CLAUDE.md b/CLAUDE.md index 166fab87..a1352764 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -2,7 +2,7 @@ ## 신규 컴퓨터 셋업 -클론 후 아래 명령을 한 번 실행하면 Claude 메모리가 이 프로젝트 폴더와 연결됩니다. +클론 후 아래 명령을 한 번 실행하면 (1) Claude 메모리 연결 + (2) git 훅 활성화 가 끝납니다. ```bash PROJ=$(pwd) @@ -10,11 +10,20 @@ MEM_DIR="$HOME/.claude/projects/-Users-cha-Works-Projects-qcast3-qcast-front" mkdir -p "$MEM_DIR" rm -rf "$MEM_DIR/memory" ln -s "$PROJ/.claude/memory" "$MEM_DIR/memory" + +# git hooks (post-commit: 커밋 로그 + [TBD-CODE] 자동 치환 + .commit-notice 마커) +git config core.hooksPath .githooks ``` > **주의**: 위 경로(`-Users-cha-Works-Projects-qcast3-qcast-front`)는 이 프로젝트의 절대경로 인코딩입니다. > 프로젝트를 `/Users/cha/Works/Projects/qcast3/qcast-front` 에 clone 했을 때 그대로 사용하면 됩니다. +## git hooks (`.githooks/`) + +`.githooks/` 는 git 으로 추적되는 훅 디렉토리입니다. `git config core.hooksPath .githooks` 가 한 번 설정되면 자동 실행됩니다. + +- `post-commit` — 커밋 로그 append, `[TBD-CODE]` placeholder 를 새 short hash 로 자동 치환, `.claude/.commit-notice` 마커 작성 (Claude 의 UserPromptSubmit hook 이 다음 프롬프트에 컨텍스트로 주입) + ## 메모리 구조 `.claude/memory/` 폴더가 Claude 의 프로젝트 메모리입니다. git 으로 관리됩니다. diff --git a/docs/MODULE_CIRCUIT_HANDOVER.md b/docs/MODULE_CIRCUIT_HANDOVER.md index 444a4254..0d2b79d0 100644 --- a/docs/MODULE_CIRCUIT_HANDOVER.md +++ b/docs/MODULE_CIRCUIT_HANDOVER.md @@ -49,7 +49,7 @@ - **태그**: `[INDFCS-SAME-ROOF 2026-05-06]` - **회귀 체크**: ① INDFCS 동일 방위/구배 누적 ② INDFCS 1차 동향 후 2차 남향 추가 차단 ③ 북면 혼합 차단(기존) ④ OUTDMULTI 다방위 차단(기존) ⑤ 자동분할 영향 없음. -### 1.8 [1845] 보정 — 검증 단위를 PCS → 회로번호로 좁힘 (커밋 `[TBD-CODE]`) +### 1.8 [1845] 보정 — 검증 단위를 PCS → 회로번호로 좁힘 (커밋 `4ebe4cb4`) - **작성일**: 2026-05-06 - **배경**: 1.7 수정 직후 회귀에서 **자동분할 후 수동분할 이어가는 시나리오** 차단 발견. 자동으로 회로 1=남(south-5.5) 4장이 부여된 같은 PCS 에, 수동으로 회로 2=서(west-5.5) 4장을 묶으려 하면 alert 차단됨. 회로 1 과 회로 2 는 서로 다른 직렬회로이므로 통과돼야 정상. - **원인**: 1.7 의 (b) 누적 패턴이 같은 PCS 의 **모든** 기존 모듈을 합집합 대상으로 잡아, 다른 회로번호까지 검증에 포함됨. HANASYS 보고 본문 "**同一の直列回路として**構成できてしまう" 에 비춰 보면 검증 단위는 PCS 가 아니라 **회로번호** 가 맞음. diff --git a/docs/UI_MODAL_HANDOVER.md b/docs/UI_MODAL_HANDOVER.md index 87c24aa7..ee13edfc 100644 --- a/docs/UI_MODAL_HANDOVER.md +++ b/docs/UI_MODAL_HANDOVER.md @@ -125,7 +125,7 @@ UI 옵션을 켜고 끄는 토글 스위치를 일본어 모달들에 추가한 --- -## 9. 저구배 + 특정 기와 시공 매뉴얼 안내 (2026-05-06, 커밋 `[TBD-CODE]`) +## 9. 저구배 + 특정 기와 시공 매뉴얼 안내 (2026-05-06, 커밋 `a5d2964e`) ### 9.1 무엇을 6종 기와 제품을 **저구배 (2 ≤ 寸 < 2.5 또는 11.31° ≤ 角度 < 14.04°)** 로 사용하려 할 때, 저장 직전에 시공 매뉴얼 확인 안내 alert 을 띄움 (OK 만 — 중단 흐름 없음). diff --git a/src/util/debugCapture.js b/src/util/debugCapture.js new file mode 100644 index 00000000..97ba9a16 --- /dev/null +++ b/src/util/debugCapture.js @@ -0,0 +1,44 @@ +// util/debugCapture.js +// 디버그 모드에서 상태/오브젝트를 파일로 저장하고 Claude가 읽을 수 있게 함 +// 사용법: +// import { debugCapture } from '@/util/debugCapture' +// debugCapture.state('rackInfos', rackInfos) // 오브젝트 스냅샷 저장 +// debugCapture.error('fetchFailed', error, context) // 에러 저장 +// debugCapture.log('step label', someData) // 로그 저장 + +const isLoggingEnabled = process.env.NEXT_PUBLIC_ENABLE_LOGGING === 'true' + +async function send(type, label, data) { + if (!isLoggingEnabled || typeof window === 'undefined') return + try { + await fetch('/api/debug', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ type, label, data, timestamp: new Date().toISOString() }), + }) + } catch {} +} + +export const debugCapture = { + // 오브젝트/상태 스냅샷 - debug/debug-snapshot.json 에 저장 + state: (label, obj) => send('snapshot', label, obj), + + // 에러 캡처 - debug/debug-errors.json 에 저장 + error: (label, error, context = null) => + send('error', label, { + message: error?.message ?? String(error), + stack: error?.stack ?? null, + context, + }), + + // 일반 로그 - debug/debug.log 에 저장 + log: (label, data) => send('log', label, data), + + // 디버그 파일 전체 초기화 + clear: async () => { + if (!isLoggingEnabled || typeof window === 'undefined') return + try { + await fetch('/api/debug', { method: 'DELETE' }) + } catch {} + }, +} -- 2.47.2