بنقرة واحدة
structure
사이트 구조와 컴포넌트 역할 파악. 사이트 구조, CSS 아키텍처, 컴포넌트 역할 확인이 필요할 때, 새 기능 추가 전 현황 파악, Starlight 업그레이드 영향도 검토 시 사용한다.
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
사이트 구조와 컴포넌트 역할 파악. 사이트 구조, CSS 아키텍처, 컴포넌트 역할 확인이 필요할 때, 새 기능 추가 전 현황 파악, Starlight 업그레이드 영향도 검토 시 사용한다.
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
payment-platform-portfolio 페이지(/payment-platform-portfolio/)의 파일 맵과 편집 위치 안내. 결제 플랫폼 포트폴리오의 문구·수치·다이어그램·시나리오·표·상태 머신·설계 결정을 수정하거나, 어느 파일·어느 상수를 고쳐야 하는지 파악해야 할 때 반드시 먼저 사용한다. '포트폴리오', '히어로 문구', '시나리오 추가', '벤치마크 수치', '설계 결정', '상태 머신', '경합 표', '알람 표' 등 포트폴리오 관련 편집·질문이 나오면, 사용자가 파일명을 명시하지 않아도 이 스킬을 참조해 4계층(astro/css/scripts/data) 중 올바른 파일로 라우팅한다.
기술 블로그 글의 가독성과 품질을 리뷰한다. 글 피드백 요청, 리뷰 요청, 가독성 점검 요청 시 사용한다. '이 글 피드백해줘', '리뷰해줘', '낯선 사람이 읽으면 어떨까' 등의 요청에도 반응한다.
문서 콘텐츠 작성 컨벤션. 문서를 새로 작성하거나 수정할 때, 기존 문서의 스타일 컨벤션 확인 요청 시, 본문 내용을 직접 작성할 때 사용한다.
학습 로드맵 스펙 파일(`<CAT>_SPEC.md`) 작성. 새로운 docs 서브카테고리의 학습 커리큘럼을 GRADLE_SPEC.md / ELK_SPEC.md와 동일한 5 Layer 구조로 설계할 때 호출. '학습 로드맵', '커리큘럼', '과정 파일', '스펙 파일', '문서 계획', '학습 계획' 키워드 또는 기존 `*_SPEC.md` 참조하며 새 카테고리 동일 형식 작성 요청 시 반드시 사용. 단순 문서 1개 추가는 `/add` 사용.
새 docs 서브카테고리(섹션) 추가. DOCS_GROUPS 그룹 배치, 색상 hue, sidebar, index.mdx까지 모든 동기화 지점을 한 번에 일관되게 처리. 사용자가 '새 섹션', '새 카테고리', '새 서브카테고리', '새 항목 추가', '새 도큐 카테고리' 등을 언급하거나 docs/<key>/ 디렉토리를 새로 만들려는 의도가 보일 때 반드시 사용. 단일 문서 추가는 `/add`, 학습 로드맵 설계는 `/roadmap`.
새 게시글/문서 추가. 새 글 추가, 포스팅, 문서 등록 요청 시, 또는 완성된 마크다운 문서를 제공하면서 등록 요청 시 사용한다.
| name | structure |
| description | 사이트 구조와 컴포넌트 역할 파악. 사이트 구조, CSS 아키텍처, 컴포넌트 역할 확인이 필요할 때, 새 기능 추가 전 현황 파악, Starlight 업그레이드 영향도 검토 시 사용한다. |
| 영역 | URL | 레이아웃 | 파일 |
|---|---|---|---|
| Landing | / | 순수 커스텀 HTML | src/pages/index.astro |
| About | /about/ | 순수 커스텀 HTML | src/pages/about/index.astro |
| Blog 목록 | /blog/ | Starlight (hasSidebar=false) | src/pages/blog/index.astro |
| Blog 포스트 | /blog/<slug>/ | Starlight + starlight-blog | content collection |
| Docs 목록 | /docs/ | Starlight | src/content/docs/docs/index.mdx |
| Docs 서브카테고리 | /docs/<cat>/ | Starlight | src/content/docs/docs/<cat>/index.mdx |
| Docs 문서 | /docs/<cat>/<slug>/ | Starlight (사이드바) | content collection |
Landing/About: PageLayout.astro를 공유 HTML 쉘로 사용 (Starlight 없음)
Blog/Docs: Starlight 레이아웃 + 9개의 컴포넌트 오버라이드
src/styles/tokens.css (--t-*) ← 원시값, 단일 진실 원천
↓ @import
src/styles/custom.css (--sl-*) ← Starlight 변수 매핑 (Docs/Blog에 적용)
src/styles/pages.css (--color-*) ← Landing/About 변수 매핑
↓ import in
src/components/PageLayout.astro ← Landing/About 공유 레이아웃에서 로드
테마 변경 방법: src/styles/tokens.css 한 곳만 수정하면 전체 반영.
| 접두사 | 파일 | 사용 위치 |
|---|---|---|
--t-* | tokens.css | 내부 참조 전용 (다른 곳에서 직접 사용 금지) |
--sl-* | custom.css | Starlight 컴포넌트 (Docs/Blog) |
--color-* | pages.css | Landing/About 페이지 |
astro.config.mjs → components: 등록)| 파일 | 역할 | 주의사항 |
|---|---|---|
Header.astro | Starlight 헤더 + /blog/ 모바일 메뉴 조건부 추가 | isBlogList 분기로 BlogMobileMenu 렌더 |
Sidebar.astro | /about/* 숨김, /blog* MobileMenuFooter만, 나머지 기본 | sl-sidebar-restore 커스텀 엘리먼트 버그 패치 포함 |
PageTitle.astro | 뒤로가기 버튼 + 백틱→<code> 변환 + EntryMeta | Astro.locals.starlightRoute 내부 API 사용 |
Pagination.astro | 의도적으로 빈 파일 — Docs prev/next 완전 제거 | starlight-blog의 PrevNextLinks가 별도 처리 |
SocialIcons.astro | 상단 네비 (Blog/Docs/About/GitHub), 현재 섹션 accent 색상 | — |
ThemeSelect.astro | 기본 Starlight ThemeSelect passthrough | ⚠️ 절대 astro.config.mjs에서 제거 금지: starlight-blog가 ThemeSelect를 오버라이드해 "Blog" 링크를 주입하는 것을 차단 |
SiteTitle.astro | 로고 + 사이트명 링크 | — |
Footer.astro | Docs tags 뱃지 + Giscus 댓글 조건부 | showGiscus 조건, Astro.locals.starlightRoute?.entry 내부 API |
MobileMenuFooter.astro | 모바일 사이드바 ThemeSelect 위치 조정 | is:global로 Starlight 내부 클래스 직접 참조 → 업그레이드 시 취약 |
| 파일 | 역할 | Props / 의존 |
|---|---|---|
PageLayout.astro | Landing/About 공통 HTML 쉘 (head meta, header/nav, footer, ThemeSelect JS) | title, description, activePage?, OG tags, sitemap? / <style is:global> 필수 |
BlogMobileMenu.astro | /blog/ 전용 모바일 메뉴 Web Component | — |
EntryMeta.astro | 날짜(최초 작성일/수정일) + 작성자 표시 | Blog 포스트·Docs 문서 공통 사용 |
Giscus.astro | Giscus 댓글 스크립트 | src/data/giscusConfig.ts에서 설정 로드 |
BlogTree.astro | /blog/ 카테고리별 포스트 그루핑 목록 | TreeSection.astro, src/data/tagColors.ts (CATEGORY_ORDER) |
DocsTree.astro | /docs/ 그룹별 서브카테고리 트리 | TreeSection.astro, LinkList.astro, src/data/docsGroups.ts |
SubcategoryPage.astro | /docs/<cat>/ 섹션별 문서 목록 | subcategory: string / LinkList.astro, src/data/docsSections.ts |
BlogSeries.astro | 블로그 시리즈 네비게이션 (순번 + 읽는 중 표시) | currentId: string / src/data/blogSeries.ts |
TreeSection.astro | 카드 컨테이너 (border + radius + bg-nav) + 섹션 레이블 | label: string, labelVariant?: 'accent' | 'muted' |
LinkList.astro | 링크 리스트 (→ 화살표, hover accent, disabled 지원) | items: { title: string; url: string | null }[], label?: string |
PageLayout.astrois:global이유: Astro 스코프 CSS는 슬롯 콘텐츠에 scope hash가 붙지 않아.container등의 스타일이 미적용됨.is:global로만 해결 가능. Landing/About 전용이므로 전역 오염 위험 없음.
TreeSectionlabelVariant:accent= Blog 카테고리 (accent 색상, 일반 크기),muted= Docs 그룹 레이블 (gray, uppercase, 소형)
LinkListdisabled:url === null→<span>(disabled)으로 렌더. DocsTree에서 미마이그레이션 서브카테고리에 사용.
src/data/)| 파일 | exports | 사용처 |
|---|---|---|
tagColors.ts | TAG_HUES: Record<string, number> (태그→HSL hue, 18개), CATEGORY_ORDER: string[] (카테고리 표시 순서) | src/pages/index.astro (랜딩 태그 색상), BlogTree.astro (카테고리 정렬) |
docsGroups.ts | DOCS_GROUPS: DocsGroup[] (10개 그룹, 16개 서브카테고리) | DocsTree.astro |
blogSeries.ts | BLOG_SERIES: Record<string, Series> (ID 기반 시리즈 매핑) | BlogSeries.astro |
docsSections.ts | docsSections: Record<string, SectionConfig> (15개 서브카테고리) | SubcategoryPage.astro |
giscusConfig.ts | repo, repoId, category, categoryId | Giscus.astro |
새 Blog 카테고리 추가:
tagColors.ts에 hue 추가 새 Docs 서브카테고리 추가:docsGroups.ts+docsSections.ts+astro.config.mjssidebar 모두 업데이트 ⚠️astro.config.mjssidebar는 별도 관리 —docsGroups.ts와 동기화 필요
시리즈 게시글 상단에 순번과 목록을 표시하는 시스템.
src/data/blogSeries.ts에 시리즈 제목과 포함될 포스트 ID(blog/slug) 목록을 순서대로 정의.PageTitle.astro에서 현재 페이지가 블로그 포스트(isBlogPost)인 경우 BlogSeries.astro에 currentId를 전달.BlogSeries.astro는 blogSeries.ts 데이터를 순회하며 currentId가 포함된 시리즈가 있는지 확인.index + 1)과 함께 목록을 출력하며, 현재 포스트는 '읽는 중' 상태로 표시.컬렉션은 docs 단 하나. Blog와 Docs가 같은 컬렉션을 공유.
// src/content.config.ts
collections = {
docs: defineCollection({
loader: docsLoader(),
schema: docsSchema({ extend: (context) => blogSchema(context) }),
}),
};
blog/null-overloading → /blog/null-overloading/
docs/java → /docs/java/ (java/index.mdx의 ID)
docs/java/class → /docs/java/class/
// 일반 docs 문서 (index 제외)
({ id }) => id.split('/').length >= 3 && id.split('/')[0] === 'docs'
// subcategory index 페이지만
({ id }) => id.split('/').length === 2 && id.split('/')[0] === 'docs'
이 포맷을 잘못 가정하면 DocsTree에서 링크가 <a> 대신 <span>으로 렌더링된다.
Footer.astro)const isIndexPage = /^\/(blog|docs)\/?$/.test(Astro.url.pathname);
const showGiscus = !isSplash && !isAbout && !isIndexPage;
/about/*, /blog/, /docs/starlight-blog는 Starlight의 Pagination 오버라이드와 무관하게 자체 컴포넌트를 주입한다.
| 항목 | 위치 | 제어 방법 |
|---|---|---|
| Blog 포스트 prev/next | .post-footer .pagination | custom.css에서 display: none |
| "Blog" 고정 링크 (헤더) | ThemeSelect 내 주입 | ThemeSelect.astro 오버라이드로 우회 |
/blog/ 기본 라우트 | starlight-blog 내부 | src/pages/blog/index.astro로 오버라이드 |
astro.config.mjs의 <head> 인라인 스크립트 (동기 실행):
if (window.location.pathname.startsWith('/blog')) {
document.documentElement.setAttribute('data-no-sidebar', '');
document.documentElement.removeAttribute('data-has-sidebar');
}
→ custom.css에서 [data-no-sidebar]로 레이아웃 픽스 적용.
버전 업 시 반드시 확인:
| 파일 | 의존 대상 | 위험도 |
|---|---|---|
MobileMenuFooter.astro | .sidebar-content, .mobile-preferences 클래스명 | 높음 |
Sidebar.astro | #starlight__sidebar, sl-sidebar-restore 커스텀 엘리먼트 | 높음 |
custom.css | .posts article.preview .sl-markdown-content, .post-footer .pagination | 중간 |
PageTitle.astro | Astro.locals.starlightRoute 내부 API | 중간 |
Footer.astro | Astro.locals.starlightRoute?.entry 내부 API | 중간 |