← 목록
기타 2026-06-22 8KB 읽기 8분

docs.crowny.org 사이트 정리 — /office 강등 · 에디터 통합 · nav 단일화 · 라이트 SSOT

개요

"Notion식 7앱(워드/시트/슬라이드/마인드맵/플랜/포커스)"을 어제(6/21) 8090 베어메탈 데모로 새로 만들었으나 — 이미 존재하는 정적 오피스(한선씨/정적/, /office)와 중복이었고 허브 핵심(견적/제안/도면)과도 맞지 않은 환상이었다. 실자산을 읽고 근거 기반으로 정리.

원래 질문 3가지에 답:

  1. /office 어떻게? → 보조 도구로 강등 (실자산이므로 삭제 X)
  2. 메뉴 14개 과밀 → 1차 6 + 드롭다운 2 단일화
  3. 디자인 일관화 → crowny.org 라이트 SSOT 정렬

무엇을 했는지

① 어제 만든 환상 아카이브 (버림)

  • 오피스/(bin·앱·정적·코어·테스트 전부 빈 스켈레톤) + 베어메탈-…실행화면.html(정적 목업)
  • 아카이브/2026-06-21-오피스7앱-환상/로 이동 + README(왜 버렸나 기록)
  • server-docs.js 참조 0건 확인 후 이동 → 라이브 영향 없음

② 에디터 3중복 통합 → 정적 /office 정본

  • 기존: React /편집(트랙2) · 정적 /office(트랙1) · index.html 문서모드 = 3중복
  • /편집·/편집기302 리다이렉트 /office (server-docs.js)
  • React SPA(dist)는 /app으로 보존(nav 비노출 레거시 — CDF v2·셀시냅스·AI추천 자산)
  • 정본 편집기 = /office = 한선씨/정적/index.html (sheet12+slide11+editor12 + 비즈니스 템플릿 14+)

③ nav 14개 평면 → 그룹 단일화

  • 기존: 홈 14개 평면 nav + server-docs.js 인라인 6개짜리 옛 nav(견적/제안/도면 누락) = 2종 갈라짐
  • 새 구조 (홈 + 인라인 통일):
  • 1차: CrownyDoc · 문서함 · 견적서 · 제안서 · 도면 · [+ 새 문서]
  • 도구 ▾: 문서편집기(/office) · 계획판 · 프로젝트문서
  • 더보기 ▾: 셀그래프 · CDF뷰어 · 기술백서 · Focus
  • server-docs.js 인라인 nav 4곳(3897·4402·4678·4719) 동일 문자열 일괄 교체
  • ④ 라이트 SSOT 정렬

    • crowny-standard.css가 이미 :root 라이트 토큰(--bg#FAF9F7 --text#1A1A1A --accent#C9A961, crowny.org SSOT 일치) 보유
    • 홈.html이 이 CSS를 불러놓고도 인라인 <style>로 전부 다크 덮어쓰고 data-theme="dark"였음
    • data-theme="light" + 인라인 스타일 전부 var() 토큰 기반 재작성. 하드코딩 다크색 제거
    • 순수 CSS hover 드롭다운(JS 불필요)

    관련 파일

    • 홈.html — 전면 재작성 (라이트 + 그룹 nav + 에디터 통합 카드)
    • server-docs.js — /편집·/편집기 302→/office, /app 분리 보존, 인라인 nav 4곳 교체
    • 한선씨/정적/crowny-standard.css — 라이트 SSOT 토큰 (기존, 그대로 활용)
    • INVENTORY.md — 진입점 표 갱신 (/편집 리다이렉트, /app 레거시)
    • 아카이브/2026-06-21-오피스7앱-환상/ — 버린 7앱 + README

    검증 (라이브, 포트 4100)

    • 홈: data-theme="light" + cd-nav + 도구/더보기 드롭다운 확인
    • /편집 → 302 Location /office ✓
    • /office 200, /app 200(React 보존) ✓
    • 핵심 라우트 8종(/홈·문서함·견적서·제안서·도면·신규·qna·viewer) 전부 200 ✓
    • 하위페이지(/tip·/docs) 새 인라인 nav 반영 ✓
    • node --check 통과, 서버 무중단 재시작(PID 64543)

    추가 작업 (2026-06-22 오후 — "둘다" 요청)

    A. LaunchAgent 영속화 수정 ✅ 완료

    • 깨진 원인: plist가 존재하지 않는 server.js를 가리킴(status=1). 실 서버는 수동 node server-docs.js.
    • 수정: plist ProgramArguments → server-docs.js. 수동 프로세스 정지 후 launchctl bootout→bootstrap.
    • 검증: launchd 관리 PID 17536(status 0) → kill -9 테스트 → 27130 자동 재기동, /홈 200. 리스너 PID == launchd PID 일치.
    • 이제 재부팅/크래시 시 KeepAlive(SuccessfulExit=false)로 자동복구.

    B. 한선씨 라이브 컷오버 — 섀도 실측 + 단계 계획 (한 방 컷오버 불가 확정)

    실측(섀도 4101에 서버.한선→toau 기동):
    • 서버.한선 컴파일·기동 성공(59131 cubes 로드, 4101 LISTEN) — 그러나 모든 HTTP 요청에 000/무응답.
    → 라우트 미구현 이전에 한선씨 서버의 HTTP 처리층 자체가 미작동(TCP읽기 전체요청 수신/응답 flush 버그 추정). 라이브 4100 무영향.
    • 라우트 격차: live JS 59개 라우트 vs 서버.한선 ~26함수(login/signup/docs/cells/synapses/cdf기초/static).
    미구현: 견적서(16)·제안서(14)·도면·문서함·qna·focus + WebSocket 협업·Chrome headless PDF·child_process spawn·.crq 업로드.
    • 핵심 사실: 견적/제안/도면 엔진(*.rpn.한선)은 이미 한선씨. JS는 그걸 spawn하는 HTTP 글루 껍데기. 즉 도메인 로직은 이미 한선씨, 남은 건 글루.
    단계 컷오버 계획 (게이트웨이 교훈 = 패리티 전엔 라이브 안 끊음):
    1. HTTP 처리층 수리서버.한선이 요청에 응답부터 하게(TCP읽기 전체수신·Content-Length·응답 flush). 이게 선결.
    2. 간단 라우트 패리티 — health/version/static/docs/login을 섀도 4101에서 JS와 1:1 비교 통과.
    3. 라우트그룹 단계 이관 — 견적/제안/도면/문서함을 한 그룹씩. 어려운 것(PDF·WebSocket·spawn)은 마지막.
    4. 섀도 풀패리티 통과 후에만 4100 스왑 (gwlive 방식).
    → 1번(HTTP층 수리)이 다음 착수점.

    B-2. 한선씨 HTTP 처리층 수리 ✅ 완료 (2026-06-22)

    "고치기" 요청으로 서버.한선의 HTTP 무응답(000)을 근본 수리. 두 버그 발견·수정(공유 lib 무수정, 로컬 수정만):

    버그①: TCP읽기 1인자 호출 → 영구 블록 (근본 원인)

    • VM opcode 493(TCP_READ)은 2인자 [fd, 최대]를 pop. 서버.한선TCP읽기(클라이언트) 1인자 →
    VM이 fd로 스택 garbage를 읽어 read(garbage) 블록 → 모든 요청 무응답.
    • 격리 에코 서버로 확증: 1인자=수락 후 읽기 블록 / 2인자=정상 200.
    • 수정: TCP읽기(클라이언트, 8191). 작동하는 라이브 서버들도 2인자(TCP읽기(연결, 16000)) 사용.
    • ⚠️ 동일 1인자 패턴 보유 서버 다수(crowny-ai·baraco·bible·bm 등) — 잠복 동일버그 가능. 이번엔 docs만 수정.
    버그②: JSON 객체 응답이 []로 직렬화
    • 서버.한선맵생성/맵넣어 해시맵 사용. 공유 JSON.한선JSON생성은 배열형 맵([k,v,...])만 지원 →
    해시맵은 길이()==0이라 길이0→"[]" 분기로 오직렬화. /health·/api/version[] 반환.
    • 수정: 서버.한선에 로컬 맵JSON(값) 헬퍼 추가(맵키목록+맵꺼내로 해시맵 순회, 그 외 값은 JSON생성 폴백) →
    JSON응답이 이를 사용. 공유 JSON.한선 무수정(188모듈·다수 라이브 서비스 보호).
    • 검증: /health{"status":"ok","app":"crownydoc","lang":"hanseon"}
    현 상태(섀도 4101 실측): 한선씨 서버 전 라우트 응답 + 자체 핸들러(health/version/login/docs/cells/cdf) 정상. 남은 컷오버 과제: ③한글 경로 URL디코드(/%ED… percent-encoded → 리터럴 비교 실패, /편집 302 미발화·한글 라우트 정적폴백) ④견적/제안/도면/문서함 실 핸들러 ⑤WebSocket·PDF·spawn ⑥TCP읽기 4095B 단일read 캡(대형 POST 트렁케이트). → 라이브 4100은 여전히 JS. 섀도 풀패리티 후 스왑.

    잔여 이슈

    • 비즈니스 템플릿 트랙 비대칭(트랙1 14+ vs 트랙2 0)은 미해결(별도 과제).
    • 블록다이어그램(OmniGraffle 대체) 여전히 미구현.

    한선씨 동반 (2026-06-22 — JS→한선씨 정렬 원칙 준수)

    JS 라우팅 변경을 한선씨 동반본에도 반영(컴파일 검증 완료):
    • 서버.한선네비게이션() 새 nav로 갱신 + 디스패처에 /편집·/편집기 → 리다이렉트("/office") 분기 추가. 컴파일 OK (1.65MB)
    • server-docs.한선라우팅()/편집·/편집기 → "redirectToOffice" 처리기 매핑 추가. 컴파일 OK (203KB)
    • 처음엔 "동반 대상 아님"으로 적었으나 — 한선씨 우선 원칙상 라우팅 로직도 동반 대상이며 이미 동반본이 존재해 정정·반영함.