매칭 CRM(MVP) — 클린베테랑 시장콘솔
요청: 병원(수요)↔청소업체(공급) 전략게임식 수동매칭 → 저장 → 일원화 관리 CRM. 저장은 localStorage(추상화 계층 — 추후 Supabase 교체 가능하게).
결과: 완료
- 브랜치
feat/onboard-landing, 커밋555a09a(7 files changed, 251 insertions) - 신규:
matches.js(저장 추상화 CRUD — getMatches/addMatch/removeMatch/updateMatch),matchpanel.js(일원화 관리 패널) - 수정:
card.js(매칭행마다 배정 버튼),map.js(저장매칭 초록 실선 상시표시 — 자동추천 점선과 구분),ui.js(배선),index.html/app.css(CRM 패널 UI)
검증
node --check5개 파일 전부 에러 0,node --test data/hospitals/tests/*.test.mjs16/16 회귀 0- 헤드리스 브라우저(chrome-devtools-mcp) 실동작 검증 — 로컬+프로덕션 양쪽에서 동일 플로우: 검색→병원선택→카드 '배정'클릭→localStorage 저장 확인→패널에 행 표시→지도에 초록선→상태변경(제안→계약)→삭제→중복배정 방지 확인→새로고침 후에도 유지(영속성) 확인→콘솔에러 0건(전 세션)
배포
- Vercel 재배포 완료:
https://cv-hospital-map.vercel.app(READY),js/matches.js/js/matchpanel.js등 신규파일 200 확인 - GitHub 푸시 완료:
feat/onboard-landing(68c6479..555a09a)
Concerns
- Supabase 교체 관련(핵심): 현재 4개 CRUD 함수가 전부 동기(sync)라 호출부(matchpanel.js/ui.js)도 await 없이 짜여있음. Supabase로 교체하면 네트워크 호출이라 필연적으로 비동기가 되므로, 함수 시그니처 이름은 유지되나 호출부 콜백들을 async/await로 바꿔야 함 — 후속 작업 시 유일한 리팩터 포인트.
- Leaflet 팝업 기본 autoClose 때문에 패널 "지도" 버튼 클릭 시 병원+업체 팝업이 동시에 유지되진 않음(중간지점 flyTo 자체는 정상 동작, 사소한 시각 디테일).
- 낙관적 업데이트/로딩상태는 넣지 않음(MVP 스코프).
[full report: /home/tlswk/projects/clean-veteran/.superpowers/sdd/mc-matchcrm-report.md]