Commit Graph

56 Commits

Author SHA1 Message Date
2ca23a00b9 feat(profile): 관리자 뱃지 호버 툴팁 문구 추가
뱃지에 마우스를 올리면 ' Portal 관리자' 가 브라우저 기본 툴팁으로 표시되도록 title 속성(SVG <title> + 래핑 span) 일치시킴. 기존 '관리자 인증' 보다 구체적 문구.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-10 17:37:46 +09:00
5c76786ada fix(profile): 한줄 소개 편집을 ✓/✕ 아이콘 버튼으로 변경
텍스트 저장/취소 버튼이 줄바꿈되며 프로필 카드를 밀어버리던 문제 수정. input과 같은 줄에 24px check(저장)/x(취소) 아이콘 버튼 2개 배치. JS의 textContent 토글 제거(아이콘 지워지지 않도록 disabled만).

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-10 16:44:47 +09:00
2357dbd152 fix(profile): 한줄 소개 편집 폼이 항상 보이던 버그 수정
.profile-bio-form/.profile-bio-row 의 display:flex 가 HTML hidden 속성의 기본 display:none 을 이겨, 연필 클릭 전에도 폼이 문구와 함께 두 줄로 뜸. [hidden] 규칙을 명시해 숨김 (modal.css 의 reply-banner 패턴과 동일).

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-10 16:01:30 +09:00
d95f968800 feat(profile): 관리자 인증 뱃지 표시 (사번 옆 골드 씰)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-10 14:15:04 +09:00
75685e41da feat(responsive): 모바일 대응 — 데스크톱 유지, 반응형 CSS 마지막 로드로 분리
문제: 기존 반응형 @media 가 base.css(2번째 로드)에 있어, 뒤에 로드되는
components/layout 규칙에 덮여 사실상 무력했음(폰에서 그리드가 안 접힘).

- public/css/responsive.css 신설, _header 에서 맨 마지막에 <link>
  → 미디어쿼리가 데스크톱 규칙을 !important 없이 정상 override
- base.css 의 죽은 반응형 블록 제거(responsive.css 로 이관)
- @media 640: 헤더 flex-wrap(검색창 둘째 줄 전체폭·숨김 해제),
  탭 영역 44px, 크롭 스테이지 aspect-ratio 정사각, 입력 16px(iOS 확대 방지),
  좌우 여백/모달 여백 축소, 프로필 히어로 세로 스택
- 데스크톱(>640)은 규칙 미적용 → 기존과 픽셀 동일

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-10 14:05:20 +09:00
56430b7701 fix(projects): 등록 폼 '저장소 URL' → 'Git 저장소 URL', README 안내문구 제거
- 라벨을 'Git 저장소 URL' 로 변경
- 'git URL 을 입력하면 README 를 가져옵니다' 인라인 문구 삭제
  (modals.js 는 #repoErr 부재를 안전하게 처리 — 빨간 테두리·포커스 피드백 유지)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-10 13:52:09 +09:00
ef3d495878 feat(ui): 푸터 공용화(프로필에도 노출) + 프사 반영 지연 안내
- footer 를 _footer.ejs 파티션으로 분리해 대시보드·프로필 공용으로 include
- footer 문구 '버그 제보:' → '버그 제보 -'
- 프로필 사진 크롭 모달에 '반영까지 최대 몇 분' 안내(연한 힌트) 추가

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-10 13:51:52 +09:00
84ce8567e7 feat(profile): 프로필에 '한줄 소개' 추가 — 본인만 인라인 편집
- users.bio 컬럼(멱등) + db.setBio / getUserProfile 조회 포함
- POST /profile/bio (본인만, fetch JSON / 폼 POST 폴백)
- 프로필 히어로: 이름·사번 한 줄로 합치고 한줄 소개를 3줄째로 배치
- 본인은 연필 버튼으로 인라인 편집(저장/취소·Esc), 최대 80자
- word-break: keep-all 로 한글 단어 중간 잘림 방지

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-10 13:43:49 +09:00
0ed41849ca docs: README 개행 정렬 2026-07-09 11:11:26 +00:00
b779ed882a fix(dashboard): footer 버그 제보 문구 간결화 — '버그 제보: gitea 이슈'
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 10:27:54 +09:00
ad693304cf fix(sites): 도구 카드 tooltip 문장 끝(.) 뒤 개행 추가 — 4개 tip 두 줄로
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-07 20:55:39 +09:00
26cc086414 fix(projects): 상세 모달 열 때 하단 고정 문제 수정
댓글 입력창 focus() 가 브라우저 스크롤을 하단으로 밀어 README 가 길면 상세가 맨 아래에 고정돼 열리던 문제. overlay 스크롤을 맨 위로 되돌리고 focus({ preventScroll: true }) 로 포커스 점프를 막음.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-07 18:44:36 +09:00
44cc2af813 fix(sites): LiteLLM 링크를 litellm.bok.or.kr 로 변경
- LiteLLM 만 도메인 접미 bokdev.in → bok.or.kr (서브도메인 litellm 유지)
- 나머지 도구 URL 은 그대로. LITELLM_URL env 미설정이라 기본값 교체로 반영됨

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-07 15:04:01 +09:00
44f7cb4b8b feat(sites): 도구 카드 호버 설명(title) 추가 — Coder·Gitea·Kubero·Coolify
- sites.js 에 tip 필드 추가, dashboard 카드에 title 속성으로 연결(tip 있는 카드만)
- Coder: VS Code Web 개발 환경 / Gitea: 소스 저장·버전 관리·Git 협업
- Kubero: Kubernetes 기반·playground 파이프라인 / Coolify: Docker 기반·aidev 프로젝트

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-07 14:03:26 +09:00
1f5179cd04 feat(projects): 등록 폼·카드 미리보기·README 가져오기 개선
- 등록 모달: 저장소 URL 필드를 제목 아래(설명 위)로 이동 — README 가져오기 흐름 자연화
- URL 미입력 상태로 README 가져오기 시 입력란에 빨간 인라인 안내 표시(토스트 대신)
- 피드 카드: 설명 미리보기 2줄 클램프 + flex:1 로 태그·푸터를 카드 하단에 정렬
- fetchReadme: CRLF→LF·줄끝공백·연속빈줄 정리로 불필요한 개행 유입 방지
- mdPlain: 개행을 살려(빈 줄만 제거) 카드 미리보기가 README 줄 구조로 보이게

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-07 13:15:20 +09:00
e21d622ba9 feat(sites): Coolify Keycloak SSO 로그인 시작 URL(/auth/keycloak/redirect) 적용
callback 이 /auth/keycloak/callback 이라 Socialite 시작 경로는 /auth/keycloak/redirect. 포털 SSO 세션이 있으면 폼 없이 통과. COOLIFY_URL 로 덮어쓰기 가능.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-07 09:46:26 +09:00
3945992125 feat(sites): 배포 PaaS Coolify 도구 카드 추가 (모두 노출)
Kubero 와 동일한 배포 PaaS. 일반 사용자에게도 노출(adminOnly 아님). URL 은 COOLIFY_URL 환경변수로 덮어쓰기 가능(기본 coolify.bokdev.in).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-07 09:39:03 +09:00
0c5f10ae18 fix(font): Pretendard 로컬 @font-face 제거 → CDN <link> 로 로드
로컬 /public/fonts/PretendardVariable.woff2 파일이 없어 404가 났다.
인터넷 연결 환경이므로 jsdelivr CDN(pretendard.min.css)으로 불러온다.
미로드 시 base.css 시스템 폰트 스택으로 폴백.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 17:34:33 +09:00
5e73bfdd28 fix: /favicon.ico 404 제거 — svg 파비콘으로 301 리다이렉트
브라우저가 페이지마다 자동 요청하는 /favicon.ico 라우트가 없어
모든 페이지 콘솔에 404가 떴다. /public/favicon.svg 로 넘긴다.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 17:25:54 +09:00
eb186cbfeb docs: README를 일반 사용자용 포털 사용법 안내로 개편
공개 레포라 비개발자도 보므로 로그인·개발도구·프로젝트 공유/수정·소통
사용법을 앞세우고 매뉴얼 링크 연결. 로그인 용어는 '행번'으로 표기.
개발자용 정보는 하단에 간단히.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 17:14:47 +09:00
7fe3a8fead feat(projects): 등록한 프로젝트 수정 기능 추가
- 상세(모달/단독) 소유자 영역에 '수정' 버튼 → 등록 모달을 현재 값으로 채워 재사용
- POST /projects/:id/edit 라우트 + db.updateProject(소유자 조건으로 타인 수정 차단)
- 등록/수정 공용 모달을 _project_form_modal.ejs 로 추출(dashboard·project 에서 include)
- pencil 아이콘 추가, modals.js 에 openEdit/openShare 초기화 로직

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 16:55:09 +09:00
459f37608e chore(egg): 콘솔 환영 문구를 이슈 제보 안내로 변경
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 16:04:35 +09:00
40f8352a28 feat: 헤더 매뉴얼 버튼 · 프로필 검색 · 상세 뒤로가기 뎁스 정리
- 헤더 프로필 왼쪽에 '매뉴얼' 버튼 추가(MANUAL_URL 환경변수, 기본 gitea MANUAL)
- 검색을 페이지 내 data-search 카드 전체 대상으로 일반화 → 프로필에서 그 사람
  프로젝트도 검색(자리표시자도 페이지별로: 공유/내/○○ 님의 프로젝트)
- 상세 페이지 뒤로가기: ?from= 내부경로 기반으로 프로필→상세는 프로필로 복귀
- '사내 개발 포털' +4pt, 도구 카드 이름·설명 +2pt

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 15:43:32 +09:00
b512ab2143 fix(modal): 상세 모달 폭 확대 + 공개/비공개 배지 클릭 토글
- 모달 max-width 760→880px (min-width 아님: 화면 분할 시 잘림 방지 위해
  반응형 유지).
- 상세 모달의 '공개/비공개' 배지를 소유자가 클릭하면 바로 토글되도록 변경.
  별도 '비공개로 전환' 버튼은 제거(배지가 그 역할). 삭제 버튼은 유지.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-02 16:04:19 +09:00
6c2bb888b4 feat: 프로필 사진 업로드·프로필 페이지 + 모달/이름 개선
- 프로필 페이지 /u/:sabun 신설 (본인=비공개 포함, 타인=공개만).
  헤더 "내 프로필", 카드·모달·댓글 작성자 클릭 시 프로필로 이동.
- 프로필 사진 업로드: users.avatar(bytea) 저장, GET /avatar/:sabun
  (업로드본 없으면 identicon SVG 폴백), POST /profile/avatar(express.raw).
  브라우저 canvas 크롭(256px webp) — 서버 이미지 라이브러리/멀터 불필요.
  identicon 6개 렌더 지점을 avatar() 헬퍼로 통일.
- 상세 모달 폭 640→760px, 소유자 액션(비공개 전환·삭제)을 우측 그룹으로
  묶어 한 줄 정렬.
- 표시 이름을 한국식 성+이름(family_name+given_name)으로 교정.
- .project-env.example ADMIN_ROLE→ADMIN_GROUP 정리.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-02 15:45:47 +09:00
b4c9b4a395 feat(auth): 관리자 판별을 Keycloak 역할(role)에서 그룹(group) 기반으로 변경
- auth.js: realm_access.roles/resource_access 대신 ID 토큰 claims.groups 사용
  (group-membership 매퍼, full.path=false 대비 앞 슬래시 제거 후 비교)
- config.js: adminRole(ADMIN_ROLE, "admin") → adminGroup(ADMIN_GROUP, "DevOps")
- server.js: 세션 user 주석 roles → groups
- CLAUDE.md: 인증 모델·Kubero Env 문서 갱신

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-02 14:47:34 +09:00
ac545651e6 refactor(tools): Harbor 관리자 전용 · Kubero SSO 표시 · SSO 배지 제거
Harbor 를 관리자 전용(adminOnly)으로 옮기고, Kubero 도 Keycloak SSO 로
로그인 가능하므로 sso 표시를 추가한다. 일반 사용자에게 보이는 도구가
모두 SSO 라 구분 의미가 사라진 SSO 배지(마크업·CSS)를 제거한다.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 14:19:49 +09:00
76c82ed24e fix(ui): 푸터를 한 줄로 정리하고 이모지 제거
브랜드 · 버그 제보 안내 · 기술 스택을 한 줄에 배치하고(footer-left 그룹),
버그 제보 문구 끝의 🐛 이모지를 뺐다.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 14:19:18 +09:00
da1653a8ea feat(projects): 설명 마크다운 렌더링 + 저장소 README 가져오기
등록 모달의 '한 줄 설명' input 을 여러 줄 textarea 로 바꾸고, 설명을
markdown-it 로 렌더링한다(html:false 로 raw HTML 이스케이프·javascript:
링크 차단 — XSS 안전). 상세 화면은 마크다운으로, 카드 미리보기는 기호를
걷어낸 순수 텍스트(mdPlain) + 3줄 클램프로 표시.

'저장소 README 가져오기' 버튼과 GET /api/readme 라우트를 추가해 repo_url
의 Gitea README 를 설명란으로 불러올 수 있다(gitea.js fetchReadme).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 14:18:27 +09:00
4a3e5636c8 feat(projects): 상세 모달에서 공개/비공개 전환 + '비공개로' 버튼 스타일 개선
투명 텍스트라 버튼처럼 안 보이던 .toggle-share-btn 을 테두리·패딩 있는
버튼 모양으로 변경. 프로젝트 상세 모달(소유자)에 '비공개로 전환/공개로
전환' 버튼을 추가하고, 전환 라우트가 return_to 를 존중하도록 해 모달에서
전환하면 모달이 다시 열린 상태로 돌아온다.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 14:15:34 +09:00
761b1a1936 fix(comments): 답글 배너 상시 표시 버그 수정 + 사번 대신 이름 표시
.reply-banner 에 display:flex 가 걸려 [hidden] 기본 규칙을 이겨 배너가
항상 보이던 문제를 .reply-banner[hidden]{display:none} 으로 해결.
댓글/대댓글 작성자·답글 대상·프로젝트 소유자를 사번 대신 이름(author_name/
owner_name)으로 표시하고, 사번은 title 툴팁으로 남긴다.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 14:14:23 +09:00
0310700
3ddf920e56 feat(ui): 푸터에 버그 제보(Gitea 이슈) 링크 추가
대시보드 푸터에 '버그가 있다면 이슈에 제보바랍니다' 안내를 자체 줄로 작게 표시.
링크는 gitea playground/ai-dev-portal issues, 새 탭·rel=noopener.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 10:12:47 +09:00
0310700
1f76329140 fix(reactions): 좋아요·즐겨찾기 값을 카드·통계·모달에서 전역 동기화
같은 프로젝트가 피드 카드 버튼·내 프로젝트 통계 줄·상세 모달(template) 세 곳에
렌더되는데, 기존 syncReaction 은 라이브 data-react 버튼만 갱신해 통계 줄과
모달(inert template 스냅샷)이 옛 값으로 남아 서로 달라졌다.

- reactions.js: 프로젝트별 {on,count} 를 단일 store(Map)로 관리. 로드 시
  detailStore 템플릿에서 서버 원본값을 시드하고, 변경 시 그 값을 그리는 모든
  라이브 DOM(버튼·통계 줄·data-pop)을 자동으로 다시 칠함.
- modals.js: 모달 마운트 직후 applyReactions 로 현재 store 값을 덮어써
  템플릿 스냅샷의 옛 값 대신 최신 값을 표시.
- dashboard.ejs: 내 프로젝트 통계 숫자에 data-rcount/data-id/data-kind 바인딩 추가.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 10:12:38 +09:00
0310700
6ff8034856 fix(ui): 토스트 표시 후 주소창의 ?toast·?egg·?open 쿼리 제거
initSignals 가 신호를 소비한 뒤 history.replaceState 로 1회성 쿼리만 제거.
POST→Redirect→GET·비-JS 폴백은 유지하고, 새로고침/공유 시 토스트 재출력도 방지.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 10:10:14 +09:00
0310700
12d620449e feat(ui): 파비콘 </> 아이콘 추가
헤더 브랜드와 동일한 codeslash </> 글리프를 브랜드 그라디언트 타일 위에 얹어
탭에서 16px 로도 읽히게 함. 모든 화면(_header include)에 적용.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-01 10:10:14 +09:00
540a170b0d fix(modal): 모달 닫기·프로젝트 삭제 동작 + 세로 가운데 정렬
- 모달 오버레이 마커를 data-open-id → data-open-pid 로 변경
  (열기 감지 셀렉터 [data-open-id] 와 충돌해 모달 내부 클릭이
   닫기/삭제 대신 모달 재오픈으로 잡히던 문제)
- .modal/.share-modal 에 margin:auto → 짧으면 정중앙, 길면 스크롤
- 프로젝트 삭제 버튼 앞에 휴지통 아이콘 추가

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 16:32:28 +09:00
ebf9599199 feat(projects): 메인 언어 Gitea 자동 판별 + 수동 선택 폴백
- src/gitea.js: repo_url 파싱 + 언어 통계 API(fetchMainLang) 신규
- 등록 폼에 '메인 언어' 드롭다운 추가(기본 '자동 감지')
- 결정 순서: 드롭다운 → Gitea 자동감지 → 태그 추론 → 미표시
- langFromTags 기본값 TypeScript 제거(안 맞으면 미표시)
- GITEA_TOKEN(선택): 비공개 레포 자동감지용 스위치

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-30 15:56:00 +09:00
0310700
fdfd7dca98 feat(ui): 헤더 브랜드 로고를 </> (codeslash)로 변경
기존 code 아이콘(<>)은 슬래시가 없어 로그인창 </> 로고와 불일치.
박스 없이 헤더 색 상속하는 codeslash 아이콘 추가해 헤더에 적용.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 14:51:51 +09:00
0310700
096f7fbbcb feat(auth): Keycloak RP-initiated 단일 로그아웃(SLO) 적용
feat/sso 작업을 라우트 개편된 현재 main 에 이식.
- handleCallback 이 id_token 반환, 콜백에서 분리해 session.idToken 에만 보관(뷰/DB 비노출)
- logoutUrl(): end_session_endpoint + id_token_hint 로 확인화면 없이 즉시 로그아웃
- /logout: 로컬 세션 destroy 후 Keycloak end-session 으로 리다이렉트해 SSO 세션까지 종료

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 14:12:42 +09:00
2b74b59f81 refactor(js): app.js 를 브라우저 네이티브 ESM 모듈로 분할
public/js/{util,ui,reactions,modals,comments,feed,main}.js 로 분리하고
dashboard/project 에서 <script type="module" src="/public/js/main.js"> 로 로드.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 17:53:46 +09:00
bc1327a6dc refactor(css): 단일 style.css 를 역할별 파일로 분할 + Pretendard 로컬 호스팅
public/css/{tokens,base,layout,components,modal}.css 로 분리하고 _header 에서 다중 link 로드.
tokens.css 에 Pretendard @font-face(public/fonts/PretendardVariable.woff2, 없으면 시스템 폰트 폴백).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 17:53:36 +09:00
272b315ab0 docs: 빌드 없는 정리·분할 허용으로 단일 CSS 제약 완화 (CLAUDE.md)
프레임워크/번들러/빌드는 계속 금지하되, 다중 <link> CSS·네이티브 ESM 모듈 분할은 허용.
임시 미리보기 파일(_preview.mjs)을 .gitignore 에 추가.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 17:53:24 +09:00
Hyemin Lee
e174fccef2 docs: PRD·CLAUDE 보강과 PLANS 마무리 (Phase 6)
- PRD: 반응 2종(heart/star)·공개여부·lang·대댓글·라우트·다크모드/검색/토스트·role 확정 반영
- CLAUDE: 구조 맵(app.js·helpers.js·_project_detail·hearts)·role 인증 모델 갱신
- 부팅 스모크 테스트(/healthz) 통과, 실 DB 기능 점검만 잔여

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 17:31:47 +09:00
Hyemin Lee
e6928a8d61 docs: PLANS 진행상황 갱신 (Phase 4·5 완료 체크)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 17:27:09 +09:00
Hyemin Lee
42542a0912 feat(ui): 상세/공유 모달과 단독 상세·로그인 페이지
- _project_detail.ejs: 모달/단독 공용 상세(헤더·반응·바로가기·댓글 스레드·입력)
- dashboard: 상세 모달 오버레이 + 프로젝트별 template 저장소 + 새 프로젝트 등록 모달
- project.ejs(단독)·login.ejs 새 디자인으로 재작성

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 17:26:50 +09:00
Hyemin Lee
ace46d2fb8 feat(server): 라우트 전면 개편 — 반응·가시성·댓글/대댓글·삭제
- GET / : 내 프로젝트/피드 분리, role 도구 필터, 댓글 일괄 조회(commentsByProject)
- 반응(heart/star) AJAX JSON, visibility/delete(본인), 댓글/대댓글(parent_id)
- 댓글 LGTM/🚀 egg 신호 + return_to 복귀, isAjax/safeBack 헬퍼
- res.locals 로 icon/identicon/langColor 노출
- db: listCommentsByProjects 추가, _header: body 시작 신호(toast/egg/open)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 17:26:37 +09:00
Hyemin Lee
6a9cf46db8 docs: 디자인·기능 개편 작업 계획 체크리스트(PLANS.md) 추가
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 17:13:00 +09:00
Hyemin Lee
6549cc5870 feat(dashboard): 도구·내 프로젝트·공유 피드 3개 섹션 재구성
app.js DOM 계약(data-* 속성)에 맞춘 카드/배지/반응 버튼 렌더.
검색·정렬·필터·모달 오픈을 위한 data-search/created/pop/starred/vis 부여.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 17:12:52 +09:00
Hyemin Lee
5ab1e9f938 feat(ui): 디자인 시스템 전면 개편 — 헤더·CSS·아이콘 헬퍼·클라이언트 JS
- style.css: CSS 변수(라이트/다크) 단일 스타일시트로 재작성
- _header.ejs: 스티키 다크 헤더, 실제 role 배지, FOUC 방지 테마 초기화
- helpers.js: icon(Octicon)·identicon(SVG 아바타)·langColor·langFromTags
- app.js: 테마·메뉴·모달·검색/정렬/필터·반응 fetch·댓글 답글·이스터에그

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 17:12:31 +09:00
Hyemin Lee
8be3a532cb feat(auth): Keycloak role 기반 관리자 판별과 도구 카탈로그 개편
- auth.js: realm/client role 추출 → roles·isAdmin 세션 저장
- config.js: ADMIN_ROLE + 도구 URL 8종 환경변수화
- sites.js: 개발4 + 인프라4(adminOnly) 재구성, toolsForUser(isAdmin)
- .project-env.example: ADMIN_ROLE·도구 URL 항목 추가

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-29 17:12:03 +09:00