一键导入
structure
사이트 구조와 컴포넌트 역할 파악. 사이트 구조, CSS 아키텍처, 컴포넌트 역할 확인이 필요할 때, 새 기능 추가 전 현황 파악, Starlight 업그레이드 영향도 검토 시 사용한다.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
사이트 구조와 컴포넌트 역할 파악. 사이트 구조, CSS 아키텍처, 컴포넌트 역할 확인이 필요할 때, 새 기능 추가 전 현황 파악, Starlight 업그레이드 영향도 검토 시 사용한다.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
| 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 | 중간 |
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`.
새 게시글/문서 추가. 새 글 추가, 포스팅, 문서 등록 요청 시, 또는 완성된 마크다운 문서를 제공하면서 등록 요청 시 사용한다.