project.crowny.org v2.3 — 안정화 & KPI 분석
개요
TOAU 729 기반 프로젝트 관리 서버를 v2.1 → v2.3으로 업그레이드. 워크플로우/내보내기 크래시 전면 수정, 40노드 KPI 분석, 15 템플릿 + 5 프리셋 안정 가동.
무엇을 했는지
- 워크플로우 POST 행(hang):
parseBody() 중복 호출 제거 (스트림 이중 소비 버그)
- CSV/보고서 내보내기 크래시: 한글 파일명 →
Content-Disposition: filename*=UTF-8'' (RFC 5987) 인코딩
- flattenTree NPE:
(arr || []).length 방어 처리로 log/evidence/children 없는 노드 대응
- 전역 try-catch: 요청 핸들러 최상위에 에러 포획 + 500 JSON 응답 보장
- 버전 통일: server.js / app.js / style.css / index.html 전부 v2.3
- KPI 분석: 40노드, 비용총계, 건강도/등급, Top10, 깊이 4단계 분포
- CSV 12컬럼: path/name/TOAU/비용3종/티옴타음 포함
- BOM prefix:
\uFEFF 로 엑셀 한글 깨짐 방지
관련 파일
/Users/ef/crowny-project/server.js — 메인 서버 (라인 2778~2795 내보내기, ~3146 try-catch)
/Users/ef/crowny-project/public/app.js — 프론트 v2.3
/Users/ef/crowny-project/public/index.html
/Users/ef/crowny-project/public/style.css
/Users/ef/crowny-project/server.한선 — 한선씨 동반 파일 (신규)
검증
- Health:
{"status":"ok","version":"2.3"}
- 분석: 40노드 / 비용합산 / 건강도+등급 / Top10 / 깊이분포 4단계
- 워크플로우 CRUD 정상 / 프리셋 5종 / 템플릿 15종 배포 OK
- CSV 12컬럼 + 보고서 텍스트 내보내기 OK
v2.3 확장 (2026-04-15 추가)
티옴타음 3진 비용 시각화: analytics.ternaryCost 필드 추가
평균±33% 기준 +T(초과)/0(평균)/-T(절감) 자동 분류
색상: +T #e74c3c / 0 #95a5a6 / -T #27ae60
프론트 분석 모달에 3열 카드 추가 (app.js:2211-2234)
실측 factory-ops: +T 2건, 0 2건, -T 6건 / 평균 81.4M원
간트 타임라인: createdAt → updatedAt 기반 간단 간트
app.js renderGantt() 함수 + ganttChart DIV
TOAU 상태별 색상 막대 + 진행률 오버레이 + 레벨 들여쓰기
상위 60건 표시, 날짜 눈금 3포인트한선씨 동반
server.한선: 트리평탄화, 건강도, CSV, 워크플로우, 삼진비용시각화, 간트범위/간트막대
- 학습DB: 서버분석KPI / 삼진비용시각화 / 간트타임라인
WebSocket 페이로드 확장 (2026-04-15)
workflow-triggered: 워크플로우 규칙이 매칭될 때마다 브로드캐스트
필드: ruleId, ruleName, condition, action, triggerEvent, triggeredCount, at
evaluateWorkflows() 내부 try-catch + wsBroadcast
ternary-cost-update: 비용 관련 액션(tiomtaum/split/cell-update/reward/tip/assign)시 3진 스냅샷
경량 계산 (projectAnalytics 호출 없이 직접 leaves 순회)
필드: counts(+T/0/-T), stats(avg/hi/lo), totalCost, at
프론트 핸들러 (app.js:handleWSEvent):
워크플로우 트리거 → toast 경고
3진 업데이트 → #ternaryBadge 엘리먼트 실시간 갱신 + pulse 애니메이션실측 (tiomtaum 업데이트시)
activity tiomtaum ← 기존
ternary-cost-update +T2/0_2/-T6 ← 신규
activity workflow ← 규칙 트리거
workflow-triggered ← 신규
진짜 간트 차트 (2026-04-16)
노드 필드: startDate/endDate 추가 (ms epoch, null 허용)
마이그레이션: 기존 프로젝트 604노드 일괄 null 초기화
API:
POST /api/projects/:id/schedule — path + startDate + endDate 저장 (쓰기 권한, 종료<시작 검증)
GET /api/projects/:id/gantt — 트리 평탄화 + effectiveStart/End + 전체 범위 + today
둘 다 logActivity('schedule') 기록 → WS 브로드캐스트 연동
프론트 고도화 (app.js):
전용 loadGantt() + renderGantt() — 전용 API 호출
오늘 마커 (빨간 세로선)
날짜 눈금 (8분할, 최소 7일 범위 보장)
접기/펼치기 (부모 토글, 전체 펼치기/접기 버튼)
부모 노드는 얇은 바 (opacity .65), 잎 노드는 두꺼운 바
호버시 📅 아이콘 → 일정 설정 다이얼로그 (date input)
담당자 @username 인라인 표시, 진행률 흰 반투명 오버레이
한선씨 동반: 일정설정, 간트평탄화 추가모바일 최적화 1단계 (2026-04-16)
@media (max-width: 768px): 분석 모달 전용 반응형
4-KPI 카드 → 2x2 그리드, 폰트 스케일 다운
티옴타음 3진 3열 → 1열 세로
차트 2x2 → 1열
필터/버튼 터치타깃 36~40px, 폰트 13px
간트 가로 스크롤 + 라벨 칸 160→110px
@media (pointer: coarse): 터치 디바이스 전용
버튼/.btn 최소 40px, .btn-sm 32px
모든 input/select 40px + 16px 폰트(iOS 줌 방지)
.gantt-toggle / .gantt-set-date 상시 표시 + 14px
부드러운 스크롤: -webkit-overflow-scrolling: touch + scroll-behavior: smooth
간트 최소 너비 560px: 좁은 화면에서 의미있게 좌우 스크롤
일정 다이얼로그: max-width: calc(100vw - 32px) 좁은 화면 대응
.gantt-row 클래스화: 인라인 grid 제거 → 미디어 쿼리로 반응형 컬럼모바일 최적화 2~4단계 (2026-04-17)
2. 하단 FAB + 드로어
#fab 버튼 (⚡): 768px 이하에서만 표시, 프로젝트 열릴 때 활성화
#fabDrawer 바텀 시트: 6개 액션 (분석/간트/맨위로/새로고침/공유/목록)
- 3열 그리드 카드 버튼, 64px 최소 높이, slideUp 애니메이션
- 오버레이 클릭 닫기, 뒤로가기 시 FAB 숨김
3. 트리뷰 모바일 개선
768px: 들여쓰기 12px, 토글 28px, TOAU 뱃지 축소, 비용 8px
480px: 비용+진행바 숨김, 들여쓰기 8px — 이름+TOAU+%만 표시
롱프레스 액션 메뉴: 500ms touchstart → 바텀 시트 (상세/3분할/일정설정/닫기)
data-name 속성 추가, HTML 이스케이프 처리
touchmove/touchend 시 타이머 취소 (스크롤과 충돌 방지)4. 사이드메뉴 개선
.side-overlay opacity 트랜지션 (0.25s ease) — display:none 제거
- pointer-events 토글로 렌더 블로킹 없이 전환
간트 드래그 + 의존성 화살표 (2026-04-17)
날짜 드래그
- 좌우 핸들:
.gantt-handle-l / .gantt-handle-r — 호버시 반투명 표시
- 핸들 드래그: 시작일/종료일 개별 변경 (일 단위 스냅)
- 바 전체 드래그: 클릭+드래그로 기간 유지하며 이동
- 마우스 + 터치 모두 지원 (
touchstart/touchmove/touchend)
- 드래그 완료시
POST /schedule API 호출 → loadGantt 새로고침
.gantt-bar.dragging 상태 — z-index 10, 핸들 항상 표시
의존성 화살표
노드 필드: deps: [] — 선행 노드 path 배열
API: POST /api/projects/:id/deps — {path, action:"add"|"remove", depPath}
자기 참조 방지, 존재 확인, 중복 방지
프론트: renderDepsArrows() — SVG 오버레이
베지어 커브 (barRight → barLeft), #arrowhead 마커
파란색(rgba(91,141,239,.5)), pointer-events:none
실측: root.0 → root.1 → root.2 체인 설정 완료튜토리얼 전면 보강 (2026-04-17)
- 5분 퀵스타트: 처음 사용자가 템플릿→이름→TOAU→일정→분석 5단계로 디지털 트윈 생성
- 신규 섹션 5개: 간트(드래그/의존성), 3진 비용, 워크플로우, 모바일(FAB/롱프레스), 디지털 트윈
- 디지털 트윈 섹션: 왜 해야 하는지 + 유형별 추천 템플릿 11종 매핑표
- 간트 섹션 3배 확장: 드래그 조작법, 의존성 화살표, 접기/펼치기
- FAQ 4개 추가: 드래그 스냅, 의존성 설정, 모바일 분할, 디지털 트윈 시작
- TUTORIAL_STEPS: 4→9 스텝 확장 (서버측 API)
- 전체 17섹션, 385줄
앱 내 온보딩 UX (2026-04-17)
빈 대시보드 → 가이드형 온보딩: 4단계 카드(템플릿→이름→상태→건강도) + 인기 템플릿 6종 원클릭 배포
기존 사용자 대시보드: "❓ 사용 방법" 버튼 (tutorial.html 링크)
프로젝트 뷰 컨텍스트 힌트: 프로젝트 상태 자동 분석 → 다음 할 일 안내 배너
루트만 있으면 → "3분할 하세요"
U가 70%↑ → "현재 상태 입력하세요"
A가 30%↑ → "위험 확인"
T가 80%↑ → "거의 완료! 자동진행"
건강도 50점↓ → "분석으로 병목 확인"
병목 존재 → "상위 노드 미결정"
정상 → "잘 진행 중"
✕ 닫기 → localStorage 저장 (같은 상태에서 반복 안 뜸)에니어그램 27기질 개인화 엔진 (2026-04-17)
개념
- 에니어그램 9유형 × 3본능(자기보존/사회적/일대일) = 27기질
- 각 기질별 맞춤: TOAU 스타일, 간트 접근법, 비용 관점, 추천 템플릿, 온보딩 순서
서버 (server.js)
ENNEAGRAM 객체: 9유형 상세 + 3본능 + getSubtype() + 4문항 퀴즈
API 4종:
GET /api/enneagram/quiz — 퀴즈 문항 + 유형/본능 목록
GET /api/enneagram/type — 현재 사용자 유형 조회
POST /api/enneagram/type — 유형 설정 (sessions 테이블에 저장)
GET /api/enneagram/advice — 맞춤 조언 반환유형별 맞춤 데이터 (각 유형마다)
toauStyle: prefer/avoid/tip — TOAU 사용 패턴 안내
ganttStyle: 일정 관리 접근법
costFocus: 비용 관점 조언
onboarding: 추천 시작 순서
templates: 추천 템플릿 (본능과 합산 최대 4종)
strength / blind: 강점/주의점
프론트 (app.js)
온보딩 퀴즈 UI: "🧠 나를 먼저 알아보기" 버튼 → 4문항 순차 → 결과 카드
유형 원형 아이콘 + 색상 + 이름 + 라벨(e.g. 3wSO)
강점/주의/TOAU팁/간트/비용/시작법 인라인 표시
추천 템플릿 하이라이트 (border-color + order:-1)
"다시 테스트" 버튼
프로젝트 뷰 힌트: 기존 상태 힌트 + 에니어그램 맞춤 팁 append실측 (성취가 3wSO)
이름: 성취가 (사회적), 라벨: 3wSO
강점: 목표 설정, 실행력, 성과 측정
TOAU팁: 빠른 T를 좋아하지만 중요한 결정은 O에서 근거를 쌓으세요
추천: church, edu-campus, biz-hq, startup
최종 상태 (이 세션 전체 결과)
| 기능 | 상태 |
|---|
| 티옴타음 3진 비용 시각화 (+T/0/-T) | ✅ 서버+프론트 |
| 간트 차트 (전용 API, 접기/펼치기) | ✅ |
| 일정 설정 (다이얼로그 + API) | ✅ |
| 날짜 드래그 (핸들+바 이동) | ✅ |
| 의존성 화살표 (SVG 베지어) | ✅ |
| WebSocket 페이로드 확장 | ✅ |
| 모바일 반응형 (분석/간트/트리) | ✅ |
| FAB + 바텀 드로어 | ✅ |
| 트리뷰 롱프레스 액션 | ✅ |
| 사이드메뉴 트랜지션 | ✅ |
| 한선씨 동반 (server.한선) | ✅ 학습DB x9 |
잔여 이슈 (향후)
- 의존성 UI (프론트에서 드래그로 화살표 생성)
- 크리티컬 패스 하이라이트
- 간트 줌 (일/주/월 단위 전환)