로컬 /public/fonts/PretendardVariable.woff2 파일이 없어 404가 났다.
인터넷 연결 환경이므로 jsdelivr CDN(pretendard.min.css)으로 불러온다.
미로드 시 base.css 시스템 폰트 스택으로 폴백.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
공개 레포라 비개발자도 보므로 로그인·개발도구·프로젝트 공유/수정·소통
사용법을 앞세우고 매뉴얼 링크 연결. 로그인 용어는 '행번'으로 표기.
개발자용 정보는 하단에 간단히.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 상세(모달/단독) 소유자 영역에 '수정' 버튼 → 등록 모달을 현재 값으로 채워 재사용
- 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>
- 헤더 프로필 왼쪽에 '매뉴얼' 버튼 추가(MANUAL_URL 환경변수, 기본 gitea MANUAL)
- 검색을 페이지 내 data-search 카드 전체 대상으로 일반화 → 프로필에서 그 사람
프로젝트도 검색(자리표시자도 페이지별로: 공유/내/○○ 님의 프로젝트)
- 상세 페이지 뒤로가기: ?from= 내부경로 기반으로 프로필→상세는 프로필로 복귀
- '사내 개발 포털' +4pt, 도구 카드 이름·설명 +2pt
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 모달 max-width 760→880px (min-width 아님: 화면 분할 시 잘림 방지 위해
반응형 유지).
- 상세 모달의 '공개/비공개' 배지를 소유자가 클릭하면 바로 토글되도록 변경.
별도 '비공개로 전환' 버튼은 제거(배지가 그 역할). 삭제 버튼은 유지.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 프로필 페이지 /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>
- 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>
Harbor 를 관리자 전용(adminOnly)으로 옮기고, Kubero 도 Keycloak SSO 로
로그인 가능하므로 sso 표시를 추가한다. 일반 사용자에게 보이는 도구가
모두 SSO 라 구분 의미가 사라진 SSO 배지(마크업·CSS)를 제거한다.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
등록 모달의 '한 줄 설명' 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>
투명 텍스트라 버튼처럼 안 보이던 .toggle-share-btn 을 테두리·패딩 있는
버튼 모양으로 변경. 프로젝트 상세 모달(소유자)에 '비공개로 전환/공개로
전환' 버튼을 추가하고, 전환 라우트가 return_to 를 존중하도록 해 모달에서
전환하면 모달이 다시 열린 상태로 돌아온다.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
.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>
대시보드 푸터에 '버그가 있다면 이슈에 제보바랍니다' 안내를 자체 줄로 작게 표시.
링크는 gitea playground/ai-dev-portal issues, 새 탭·rel=noopener.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
같은 프로젝트가 피드 카드 버튼·내 프로젝트 통계 줄·상세 모달(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>
initSignals 가 신호를 소비한 뒤 history.replaceState 로 1회성 쿼리만 제거.
POST→Redirect→GET·비-JS 폴백은 유지하고, 새로고침/공유 시 토스트 재출력도 방지.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
헤더 브랜드와 동일한 codeslash </> 글리프를 브랜드 그라디언트 타일 위에 얹어
탭에서 16px 로도 읽히게 함. 모든 화면(_header include)에 적용.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 모달 오버레이 마커를 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>
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>
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>
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>
프레임워크/번들러/빌드는 계속 금지하되, 다중 <link> CSS·네이티브 ESM 모듈 분할은 허용.
임시 미리보기 파일(_preview.mjs)을 .gitignore 에 추가.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- 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>
app.js DOM 계약(data-* 속성)에 맞춘 카드/배지/반응 버튼 렌더.
검색·정렬·필터·모달 오픈을 위한 data-search/created/pop/starred/vis 부여.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- requireAuth: /login 거치지 않고 loginRedirect로 직접 Keycloak으로
- /login 라우트도 oidcReady면 즉시 리다이렉트
- OIDC discovery 실패 시에만 안내 페이지 폴백, /api/*는 401 유지
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Express+EJS+Postgres 사내 개발 포털.
- Keycloak OIDC(사번 로그인), GitHub 감성 UI
- 사이트 모음 + 프로젝트 공유/코멘트/스타
- DB: OpenEverest appdb portal schema (portal_app role)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>