프로토타입 변경 주석 레이어 (proto-note)
단일 파일 HTML 프로토타입 위에 '개발자 관점 변경 가이드'를 오버레이합니다: 오른쪽 고정 다크 주석 패널(모듈 체크 + 주석 카드) ↔ 페이지 번호 앵커 + 캔버스 연결선; 양방향 호버/클릭 위치 이동; 주석 카드에 SDD 딥 링크 포함.
설치 및 디렉토리
# 개인 스킬 (권장)
git clone https://github.com/pessimistcamellia/proto-note.git ~/.cursor/skills/proto-note
# 또는 프로젝트 내
git clone https://github.com/pessimistcamellia/proto-note.git .cursor/skills/proto-note
전체 디렉토리를 위 경로에 복사해도 됩니다. 디렉토리 구조:
proto-note/
├── SKILL.md
├── assets/diff-annotator.js # 주석 엔진 (프로토타입에 인라인으로 삽입, 로직 수정 금지)
├── references/changeset-schema.md
├── docs/screenshots/ # README 스크린샷
└── scripts/deploy_github.sh # GitHub Pages 대체 배포
환경 종속성
| 기능 | 도구 | 미사용 시 |
|---|---|---|
| 기술 스택/소스 코드 파악 | codewiki MCP (또는 이에 준하는 코드 검색) | 온라인 URL + 소스 저장소 + 브라우저 DOM 사용 |
| SDD 딥 링크 | lark-cli (Feishu) | 문서 URL 및 섹션 blockId 수동 입력; Feishu 미사용 시 해당 섹션 앵커로 연결 |
| 픽셀 단위 조정 | 브라우저 DevTools / chrome-devtools MCP | 수동으로 온라인 페이지 열어 비교 |
| 배포 | 내부망 정적 호스팅 (우선) | 개인 GitHub Pages (deploy_github.sh, gh 권한 필요) |
팀에 다른 프론트엔드 규범 스킬(예: 선택지 화이트리스트, 컴포넌트 라이브러리 사용법)이 있는 경우, 제작 전에 필요에 따라 읽어오십시오. 없으면 대상 저장소 소스 코드와 팀 문서를 기준으로 합니다.
기본 계획: 컴포넌트 라이브러리 및 게시 우선순위
우선순위에 따라 실행하며, 이전 단계를 사용할 수 없을 때만 다음 단계로 넘어갑니다. 마지막 단계가 기본 대체입니다:
- 컴포넌트 라이브러리 / 규범 (우선): 대상 온라인 시스템에서 실제 사용 중인 컴포넌트 라이브러리 및 컴포넌트 규범을 사용합니다 (소스 코드 / DOM / 팀 규범 스킬 참조). 근거 없이 라이브러리를 교체하는 것을 금지합니다.
- 게시 주소 (우선): 내부망에 기존 정적 호스팅(또는 팀에서 합의한 내부망 주소)이 있는 경우, 내부망에 게시하는 것을 우선합니다.
- 기본 대체: 실제 컴포넌트 라이브러리/규범을 얻을 수 없거나, 권한, 네트워크, 내부망 접근 불가 등의 이유로 사용할 수 없는 경우 → 컴포넌트는 일반 계획에 따라 자유롭게 선택 가능 (단일 파일 대화형 HTML 유지); 사용자 개인 GitHub 저장소(Pages)에 게시. 배포 전
gh권한을 확인해야 하며, 권한이 없으면 먼저 사용자와 소통하고, 동의 없이 개인 저장소에 푸시하는 것을 금지합니다.
제품 불변 규칙
- 변경 3단계 + 유형: 페이지 / 모듈 / 필드; 유형은 신규, 텍스트, 열거형 기준, 로직, 프로세스, 삭제로 구분하며, 막연하게 '신규'라고 표시하는 것을 금지합니다.
- 기본 숨김, 모듈 체크박스: 열었을 때 레이블을 표시하지 않음;
page::module기준으로 체크; 상태는 localStorage에 저장됩니다. 신규 모듈의 누락된 키는 기본적으로true(표시), '한 번이라도 스위치를 껐다'는 이유로 상속된 숨김을 금지합니다; 더티 상태는LS_KEY버전 업그레이드로 제거합니다. - SDD에만 연결, PRD는 표시하지 않음: 주석 카드는
SDD문서URL#blockId를 사용합니다. - 정보 간결: 주석 패널에 버전 번호/베이스라인/사용 설명 없음;
desc는 결론만 작성. - 클릭 가능하면 반드시 유효: 모듈 체크 시 즉시 뷰 전환 + 스크롤 + 펄스 위치 이동.
- 리뷰 상태는 주석 패널에서만: 일반/빈 상태/오류 상태 등은
demoControls에 배치; 실제 비즈니스 탭은 비즈니스 페이지에 유지. - 입력 분기에 재현 가능한 예제 제공:
examples는 fixture와 일치해야 하며, 플레이스홀더 가짜 값을 금지합니다. - 주석 패널이 콘텐츠를 가리지 않음: 비즈니스 레이아웃을 압축하지 않음; spacer로
scrollWidth를 확장하여 가로 스크롤로 오른쪽 전체를 볼 수 있게 합니다.body padding-right만 추가하거나 비즈니스 루트 너비를 변경하는 것을 금지합니다. - 컴포넌트 라이브러리 및 규범은 실제 온라인 우선: 복원 가능하면 반드시 복원해야 합니다 ('기본 계획' 1단계 참조). 동일한 컴포넌트 라이브러리 사용이 곧 복원을 의미하지 않음 — 스켈레톤, 열 집합/열 너비, 고정 열, 셀 구조, 작업 열 레이아웃, 사용자 정의 클래스명 및 핵심 스타일은 온라인 DOM/소스 코드를 참조해야 함; 인도 전에 화면별로 스크린샷 비교. 실제 컴포넌트 라이브러리/규범을 얻을 수 없는 경우에만 일반 컴포넌트 대체를 허용합니다.
- 게시는 내부망 우선, 그 다음 개인 GitHub: 내부망 주소가 있으면 우선 사용; 사용 불가 시 개인 GitHub Pages에 게시 ('기본 계획' 2–3단계 참조).
- '이전' = 온라인 현재 상태: 신규 항목은 '해당 페이지/모듈/기능/필드 없음'으로 작성; 이전 데모 버전과의 차이로 작성하는 것을 금지; 온라인 신규 항목을 빠뜨리지 않음.
- UI 위치가 없으면 연결선 없음: 순수 프로세스/링크는
target: null, 앵커 없음; 카드는 '프로세스 및 링크 · 페이지에서 보이지 않음'에 포함되며 changes 끝에 배치. - 팝업 내 변경 사항: 주석 카드 클릭 시
DIFF_HOOKS.locate를 통해 팝업을 연 다음 연결선 작성; 앵커/연결선 z-index는 팝업보다 높아야 함 (엔진은 9000대 사용). - 팝업은 페이지 가로/세로 스크롤을 따름: 주석 패널이 열려 있을 때 팝업 컨테이너는
(-scrollX,-scrollY)에 따라 이동 (엔진에서 처리); 스크롤을 피하기 위해 잠그는 것을 금지. - 다운로드 가능한 파일은 실제 형식: 템플릿/영수증은 실제 비즈니스와 동일한 형식 및 구조 (예: 이중 시트는 실제
.xlsx여야 함); CSV로 대체하는 것을 금지. - 멀티 엔드포인트 각각 제작 및 연동: 운영 백엔드, C-엔드 등은 시스템 경계에 따라 HTML 분리; 통합 메뉴에 '엔드포인트 · 페이지' 명시; 페이지 간 데이터가 있으면 시뮬레이션 기록/읽기/시작/중지/예외.
- 주석 카드는 SDD로 이동 가능해야 함: SDD가 있을 때 각 변경 사항(또는 해당 기능 포인트)에
sdd.section+blockId를 구성; 카드에 딥 링크 렌더링; 클릭 시 해당 섹션이 열려야 하며, 섹션 이름만 쓰는 것을 금지.
프레젠테이션 레이어 규범 (엔진에 내장, 되돌리지 않음)
- 오른쪽 주석 패널: 진한 네이비 블루, 너비 360px, 접어서 플로팅 진입점으로 만들 수 있음.
- 가로 스크롤:
document.body.scrollWidth로 비즈니스 너비 측정 (spacer는 absolute이며 이 값에 포함되지 않음); spacer를 먼저 숨기고 측정하지 않음. 스크롤 복원은behavior:"instant"를 사용하여scroll-behavior:smooth와 충돌 방지. - 앵커: 문서 좌표
position:absolute, 대상 왼쪽 상단 고정;fixed+스크롤 추적 프레임 금지; 가려짐은elementFromPoint로 숨김. - 연결선: 평소에는 선 없음; 호버/고정 시에만 하나 그리기; 고정 상태가 호버 상태보다 우선; 시작점은 실시간 rect 사용.
- 주석 카드: 번호 + 제목 + 유형·레벨 + 결론 + 이전/이후 + SDD;
examples포함 가능. - 데모 영역: 주석 패널 상단 segmented control →
DIFF_HOOKS.setDemoState.
기술 스택 복원 (Step 0)
'기본 계획'에 따라 실행: 복원 가능하면 반드시 복원; 불가능하면 이유를 기록한 후 자유 선택 대체 진행.
- 사용자가 온라인 URL을 제공하지 않음 → 먼저 알림; 여전히 없으면 시스템/라우트/소스 코드 직접 검색.
- codewiki(또는 소스 코드 검색) 사용하여 확인: 프레임워크, 컴포넌트 라이브러리, 라우트→페이지 파일, 핵심 템플릿 조각; 필요한 경우 인덱스 신선도 확인, 온라인 DOM으로 교정.
- 우선 대상 저장소의 실제 컴포넌트 라이브러리 및 규범 사용; 신규 컨트롤은 해당 페이지의 기존 유형/크기/배열 따름. 동일한 컴포넌트 라이브러리 사용이 곧 복원을 의미하지 않음 — 스켈레톤, 열 집합/열 너비, 고정 열, 셀 구조, 작업 열 레이아웃, 사용자 정의 클래스명은 온라인 DOM/소스 코드 참조.
- 팀 규범 스킬이 있으면 따름; 없으면 대상 저장소 및 문서 따름.
- 픽셀 단위 또는 검색이 부족할 때: 온라인 페이지를 열어 마운트 방식, 컴포넌트 클래스명, 테이블 열 너비/고정 열, 작업 열 구조, 사용자 정의 computed style 캡처.
- 결과물은 여전히 단일 파일 HTML; CDN으로 동일한 프레임워크/컴포넌트 라이브러리를 가져올 수 있으면 가져옴. 전체 페이지를 복원할 수 없을 때, 일반적인 컴포넌트 라이브러리를 자유롭게 선택하여 대화형 프로토타입 완성, 인도 설명에 '미복원 사유' 명시.
- 게시: 내부망 정적 주소가 있으면 우선 업로드; 그렇지 않으면 사용자 GitHub 권한을 얻은 후
deploy_github.sh로 개인 저장소에 게시.
고주파 함정: 외부 레이어에 초과 min-width를 설정하여 테이블을 고정시키지 말 것 (내부 가로 스크롤 및 fixed 열 손실); 통합 메뉴 상단 바는 position:fixed 사용, 넓은 페이지 가로 스크롤 시 상단 바 끊김 방지.
다중 페이지 / 멀티 엔드포인트 및 데이터 연동
- 먼저 행렬 작성: 엔드포인트/시스템 → 페이지 → 주요 상태 → 업스트림/다운스트림 데이터; 다른 기술 스택은 파일 분리, 강제 병합하지 않음.
- 통합 메뉴: '엔드포인트 · 페이지' 명명, 현재 페이지 강조; 메뉴는 변경 주석을 하지 않음.
- 동일 출처 동일 디렉토리 배포,
localStorage공유 보장. - 공유 상태 키:
proto-note:<requirement-slug>:state:v1; 읽기/쓰기 후 동일 페이지에 이벤트 발행, 교차 탭에서storage청취. - URL은 비즈니스 ID만 포함; 본문은 공유 상태에 위치. 동일 출처가 아닌 경우 우선 동일 출처로 변경, 그렇지 않으면
postMessage및origin검증. - 내장 fixture + '데모 데이터 초기화'; 업스트림/다운스트림 상태 및 예외 재현 가능.
워크플로우
- Step 0 기술 스택 복원.
- PRD에서 변경 목록, 엔드포인트/페이지 행렬, 입력 분기 및 페이지 간 데이터 관계 추출 → references/changeset-schema.md 참조.
- SDD blockId를 가져와 각 변경 사항의
sdd에 기록. - 엔드포인트별로 프로토타입 제작; 멀티 엔드포인트는 메뉴와 공유 상태 구성 및 연동 검증.
- 주석 레이어 연동:
- 컨테이너에
data-diff-page추가; 위치 지점에 id 추가;DIFF_HOOKS.locate/setDemoState구현. - 리뷰 탭을
meta.demoControls로 이동. - 분기를
examples에 기록 (fixture와 일치). </body>앞에DIFF_CHANGESET인라인, 그 다음 최신 assets/diff-annotator.js 전체 복사 (오래된 복사본 사용 금지).
- 컨테이너에
- 배포 및 자체 점검:
-
내부망 우선: 기존 내부망 정적 호스팅이 있으면 업로드; 객체 키가 덮어쓰이지 않으면 새 경로 (
-v2등)로 변경, 반환 URL + md5 기준. -
대체 GitHub Pages: 내부망을 사용할 수 없을 때 개인 저장소에 게시. 먼저
gh auth status; 권한이 없으면 소통하고gh auth login완료, 권한 없이 개인 저장소 푸시 금지:bash ~/.cursor/skills/proto-note/scripts/deploy_github.sh <slug> ./index.html
-
자체 점검 목록
- 복원 가능 시 온라인 실제 컴포넌트 라이브러리/규범 사용; 복원 불가 시 사유 명시 및 자유 선택 대체 진행
- 게시 우선 내부망; 내부망 사용 불가 시 권한 획득 후 개인 GitHub에 게시
- 온라인 화면별 비교 (온라인 페이지가 있는 경우: 열 너비, 고정 열, 작업 열, 페이징, 상단 바)
- 초기 앵커/연결선 없음; 모듈 체크 해제; 신규 모듈은 기존 방문자에게 기본 표시
- 모듈 체크 시 해당 카드/앵커/선만 표시 및 자동 위치 이동; 팝업 내 변경 사항은 자동 팝업 열기 및 연결선이 팝업 위에 위치
- 스크롤 시 앵커 이동 없음; 평소 연결선 없음, 고정/호버 시 하나의 선만; 고정 상태가 hover에 의해 빼앗기지 않음
- 주석 패널 열린 상태에서 가로 스크롤로 오른쪽 전체 보기 가능; 가로 스크롤 위치가 DOM 업데이트로 인해 튕기지 않음; 팝업이 하단 페이지 가로/세로 스크롤을 따름
-
target:null은 앵커 없음, 카드는 '프로세스 및 링크'에 있고 뒤쪽에 위치; '이전'은 모두 온라인 현재 상태, 빠뜨림 없음 - 주석 카드 SDD 딥 링크가 열리고 해당 섹션으로 위치 이동
- 데모 상태는 주석 패널에서만; examples 재현 가능; 다운로드 파일 형식 정확
- 멀티 엔드포인트 메뉴 접근 가능; 프로토타입 간 읽기/쓰기/새로고침/교차 탭/초기화 일치
- 주석 패널 접으면 깔끔; 비즈니스 상호 작용에 영향 없음
참조
- 이 저장소 README.md (효과 스크린샷, Live demo, 기본 계획 설명)
- Live demo: https://pessimistcamellia.github.io/non-ecommerce-thirdparty-order-prototype/admin-upload.html