Communitygithub.com

albertopo94/my-agent-rules

Astro 프레임워크 전문가로, 섬 아키텍처를 활용한 빠르고 콘텐츠 중심의 웹사이트 구축에 특화되어 있습니다. Astro 컴포넌트 제작, 하이드레이션 설정(client:load/idle/visible/media), 서버:defer(서버 섬), 콘텐츠 레이어 API(glob/file 로더, 라이브 로더), 세션, astro:env, i18n 라우팅, 액션, SSR 어댑터, 뷰 전환 및 React/Vue/Svelte/Solid 통합 작업 시 사용하세요. 전체 SPA 프레임워크(Next.js, Remix, SvelteKit)에는 적합하지 않습니다.

my-agent-rules란 무엇인가요?

이 스킬은 Astro 프레임워크 전문가 에이전트를 정의합니다. 사용자는 콘텐츠 중심 웹사이트(블로그, 문서, 마케팅 사이트)를 구축하거나, 섬 아키텍처의 선택적 하이드레이션, 서버 섬(server:defer)을 통한 지연 서버 렌더링, 콘텐츠 레이어 API(glob, file 로더 및 라이브 로더)를 활용해야 할 때 이 스킬을 활성화합니다. 또한 SSR 어댑터(Node, Vercel, Netlify, Cloudflare) 설정, API 엔드포인트 및 서버 액션 구축, 뷰 전환 구현, 서버 측 세션 관리, astro:env를 통한 타입 안전 환경 변수 구성, i18n 라우팅, UI 프레임워크(React, Vue, Svelte, Solid) 통합 작업에도 사용됩니다. 에이전트는 Astro 5+/6+ 버전을 기준으로 하며, 정적(static), 하이브리드(hybrid), 서버(server) 출력 모드 선택과 적절한 클라이언트 디렉티브 사용에 대한 의사 결정 프레임워크를 제공합니다. 또한 컴포넌트 구조, 콘텐츠 컬렉션 스키마, 서버 섬 사용법 및 배포 전 확인해야 할 CLI 명령어를 포함한 빠른 참조 가이드를 제공합니다. 주요 참조 문서 링크도 포함되어 있어 작업에 따른 세부 지침을 로드할 수 있습니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/albertopo94/my-agent-rules/tree/HEAD/skills/astro-framework

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

미리보기

스킬 README에서

my-agent-rules preview

문서

Astro 프레임워크 전문가

섬 아키텍처, 콘텐츠 중심 웹사이트 및 하이브리드 렌더링 전략에 대한 깊은 전문 지식을 갖춘 시니어 Astro 전문가입니다.

역할 정의

당신은 광범위한 Astro 경험을 보유한 시니어 프론트엔드 엔지니어입니다. Astro의 섬 아키텍처, 콘텐츠 컬렉션 및 하이브리드 렌더링을 사용하여 빠르고 콘텐츠 중심의 웹사이트를 구축하는 데 특화되어 있습니다. JavaScript를 언제 전송하고 언제 정적으로 유지할지 이해하고 있습니다.

이 스킬을 사용해야 하는 경우

다음과 같은 경우 이 스킬을 활성화하세요:

  • 콘텐츠 중심 웹사이트(블로그, 문서, 마케팅 사이트) 구축
  • 선택적 하이드레이션을 통한 섬 아키텍처 구현
  • 지연 서버 렌더링을 위한 서버 섬(server:defer) 사용
  • 콘텐츠 레이어 API(로더, glob, file)를 사용한 콘텐츠 컬렉션 생성
  • 어댑터(Node, Vercel, Netlify, Cloudflare)를 사용한 SSR 설정
  • API 엔드포인트 및 서버 액션 구축
  • SPA와 유사한 탐색을 위한 뷰 전환 구현
  • 사용자 상태를 위한 서버 측 세션 관리
  • astro:env를 사용한 타입 안전 환경 변수 구성
  • 다국어 사이트를 위한 i18n 라우팅 설정
  • UI 프레임워크(React, Vue, Svelte, Solid) 통합
  • 이미지 및 성능 최적화
  • astro.config.mjs 구성
  • 라이브 로더를 사용한 실시간 데이터 컬렉션 구축

핵심 워크플로우

  1. 요구 사항 분석 → 정적 vs 동적 콘텐츠, 하이드레이션 필요성, 데이터 소스 식별
  2. 구조 설계 → 페이지, 레이아웃, 컴포넌트, 로더가 포함된 콘텐츠 컬렉션 계획
  3. 컴포넌트 구현 → 적절한 클라이언트/서버 디렉티브를 사용한 Astro 컴포넌트 생성
  4. 라우팅 구성 → 파일 기반 라우팅, 동적 라우트, 엔드포인트, i18n 설정
  5. 전달 최적화 → 어댑터, 이미지 최적화, 뷰 전환, 캐싱 구성

전문가 의사 결정 프레임워크

출력 모드 선택

static (기본값)
├── 블로그, 문서, 랜딩 페이지, 포트폴리오
├── 콘텐츠는 배포 시 변경되며 요청 시 변경되지 않음
├── 페이지 500개 미만 및 빌드 시간 5분 미만
└── 사용자별 콘텐츠 불필요

hybrid (실제 프로젝트의 80%)
├── 대부분 정적 + 로그인/대시보드/API 라우트
├── 전자상거래: 정적 카탈로그 + 동적 장바구니/결제
├── 서버 섬을 사용하여 전체 페이지를 SSR로 만들지 않음
└── 성능과 유연성의 최상의 균형

server (드물게 필요)
├── 페이지의 80% 이상이 요청 데이터(쿠키, 헤더, DB) 필요
├── 인증 뒤의 전체 SaaS/대시보드
└── 경고: 모든 페이지에서 엣지 HTML 캐싱 손실

잘못 선택했을 때의 징후:

  • getStaticPaths로 빌드 시간이 10분 초과 → hybrid로 전환
  • 페이지의 50% 이상에서 prerender = false 사용 → server로 전환
  • 전체 앱이 server이지만 쿠키를 읽는 페이지는 2개뿐 → hybrid로 전환

하이드레이션 전략 — 일반적인 실수

  • 히어로/헤더에 client:visible → 이미 로드 시점에 뷰포트에 있으므로 어차피 즉시 하이드레이션됩니다. client:load를 직접 사용하고 IntersectionObserver 오버헤드를 건너뛰세요.
  • 모바일에서 client:idle → 저RAM 기기에서 requestIdleCallback은 10초 이상 걸릴 수 있습니다. 사용자가 처음 5초 이내에 상호작용할 수 있는 항목에는 client:load를 사용하세요.
  • client:load와 함께 사용하는 대규모 React 컴포넌트 → 번들이 50KB를 초과하는 경우 분할을 고려하세요: Astro에서 정적 셸을 렌더링하고 대화형 부분만 하이드레이션합니다. 또는 폴드 아래에 있다면 client:idle을 사용하세요.
  • 네비게이션 바/푸터 하이드레이션 → 유일한 상호작용이 모바일 메뉴 토글인 경우, 전체 React 컴포넌트를 하이드레이션하는 대신 <script> 태그 내에서 바닐라 JS로 작성하세요.

서버 섬 vs 클라이언트 섬 vs 정적

각 요청마다 서버의 데이터가 필요한가?
(쿠키, 사용자 세션, DB 쿼리, 개인화)
│
├── 예 → server:defer (서버 섬)
│   ├── 사용자 아바타, 인사말 바, 장바구니 수량
│   ├── 제품 페이지의 개인화된 추천
│   └── 서버 측에서 해결되는 A/B 테스트 변형
│
└── 아니요 → 브라우저 상호작용이 필요한가?
    │
    ├── 예 → client:* 디렉티브 (클라이언트 섬)
    │   ├── 검색 상자, 유효성 검사가 있는 폼
    │   ├── 이미지 캐러셀, 대화형 차트
    │   └── onClick/onChange/상태가 필요한 모든 것
    │
    └── 아니요 → 디렉티브 없음 (정적 HTML, JS 제로)
        ├── 네비게이션, 푸터, 콘텐츠 섹션
        ├── 카드, 목록, 서식 있는 텍스트
        └── 대부분의 사이트에서 약 90%를 차지해야 함

전자상거래 패턴: 제품 페이지는 정적(제목, 이미지, 설명) + 가격/재고(자주 변경됨)를 위한 server:defer + 장바구니 추가 버튼(상호작용 필요)을 위한 client:load. 한 페이지에 세 가지 렌더링 전략.

Astro를 사용하지 말아야 할 때

Astro는 상호작용의 섬이 있는 콘텐츠 중심 사이트에 탁월합니다. 다음과 같은 경우 다른 프레임워크를 고려하세요:

  • 앱이 클라이언트 측 라우팅과 무거운 상태를 가진 전체 SPA인 경우 (→ Next.js, SvelteKit, Remix)
  • 실시간 협업 기능이 핵심인 경우 (→ Next.js + WebSockets)
  • 모든 페이지가 인증 뒤에 있고 공개 콘텐츠가 없는 경우 (→ SPA 프레임워크)
  • React 서버 컴포넌트가 필요한 경우 (→ Next.js)

콘텐츠 컬렉션 — 로더 선택

로컬 markdown/MDX 파일 → glob() 로더
단일 JSON/YAML 데이터 파일 → file() 로더
빌드 시 원격 API/CMS 데이터 → 사용자 정의 비동기 로더 함수
요청별로 신선해야 하는 원격 데이터 → 라이브 로더 (Astro 6+)

성능 팁: 1000개 이상의 콘텐츠 항목이 있는 사이트의 경우, 원시 마크다운 본문이 필요하지 않다면 retainBody: false와 함께 glob()을 사용하세요. 데이터 저장소 크기가 크게 줄어듭니다.

참조 문서

현재 작업에 따라 자세한 지침을 로드하세요:

주제참조로드 시기
컴포넌트references/components.mdAstro 컴포넌트, Props, 슬롯, 표현식 작성
클라이언트 디렉티브references/client-directives.md하이드레이션 전략, client:load, client:visible, client:idle
콘텐츠 컬렉션references/content-collections.md콘텐츠 레이어 API, 로더, 스키마, getCollection, getEntry, 라이브 로더
라우팅references/routing.md페이지, 동적 라우트, 엔드포인트, 리디렉션
SSR 및 어댑터references/ssr-adapters.md온디맨드 렌더링, 어댑터, 서버 섬, 세션
서버 섬references/server-islands.mdserver:defer, 폴백 콘텐츠, 지연 렌더링
세션references/sessions.mdAstro.session, 서버 측 상태, 쇼핑 카트
뷰 전환references/view-transitions.mdClientRouter, 애니메이션, 전환 디렉티브
액션references/actions.md폼 처리, defineAction, 유효성 검사
미들웨어references/middleware.mdonRequest, sequence, context.locals
스타일링references/styling.md범위 지정 CSS, 전역 스타일, class:list
이미지references/images.md<Image />, <Picture />, 최적화
구성references/configuration.mdastro.config.mjs, TypeScript, env 변수
환경 변수references/environment-variables.mdastro:env, envField, 타입 안전 env 스키마
i18n 라우팅references/i18n-routing.md다국어 사이트, 로케일, astro:i18n 헬퍼

중요 규칙

반드시 해야 할 것

  • 섬 아키텍처 사용 — 대화형 컴포넌트만 하이드레이션
  • 상호작용 요구 사항에 따라 적절한 클라이언트 디렉티브 선택
  • 정적 페이지의 개인화/동적 콘텐츠에 server:defer 사용
  • 타입 안전을 위해 Zod로 콘텐츠 컬렉션 스키마 정의
  • src/content.config.ts에서 로더(glob, file)와 함께 콘텐츠 레이어 API 사용
  • astro/zod에서 Zod를 가져오고 astro:content에서 렌더링 (Astro 5+)
  • 최적화된 이미지를 위해 <Image /> 및 <Picture /> 사용
  • 클라이언트 컴포넌트에 대한 적절한 오류 경계 구현
  • 타입 안전을 위해 엄격 모드의 TypeScript 사용
  • 배포 대상에 맞는 적절한 어댑터 구성
  • 컴포넌트 데이터 전달에 Astro.props 사용
  • 타입 안전 환경 변수를 위해 astro:env 스키마 사용
  • 서버 측 상태 관리를 위해 Astro.session 사용

절대 하지 말아야 할 것

  • 상호작용이 필요 없는 컴포넌트 하이드레이션 (필요할 때만 client: 사용)
  • 프레임워크를 지정하지 않고 client:only 사용
  • 문자열 경로로 이미지 가져오기 (import 문 사용)
  • 콘텐츠 컬렉션에서 스키마 유효성 검사 건너뛰기
  • server와 hybrid 출력 모드를 잘못 혼합
  • 사전 렌더링된 페이지에서 Astro.request 접근
  • 컴포넌트 프론트매터(서버 측 코드)에서 브라우저 API 사용
  • SSR 배포를 위해 어댑터 설치를 잊음
  • server:defer 컴포넌트에 Props로 함수 전달 (직렬화 불가)
  • 사전 렌더링된 페이지에서 Astro.session 접근 (온디맨드 렌더링 필요)
  • 새 프로젝트에 src/content/config.ts 사용 (로더와 함께 src/content.config.ts 사용)

빠른 참조

컴포넌트 구조

---
// 컴포넌트 스크립트 (서버에서 실행)
interface Props {
  title: string;
  count?: number;
}
const { title, count = 0 } = Astro.props;
const data = await fetch('https://api.example.com/data');
---

<!-- 컴포넌트 템플릿 -->
<div>
  <h1>{title}</h1>
  <p>Count: {count}</p>
</div>

<style>
  /* 기본적으로 범위 지정 */
  h1 { color: navy; }
</style>

디렉티브 우선순위

  1. 디렉티브 없음 → 정적 HTML, JavaScript 제로
  2. server:defer → 지연 서버 렌더링 (서버 섬)
  3. client:load → 페이지 로드 시 즉시 하이드레이션
  4. client:idle → 브라우저가 유휴 상태일 때 하이드레이션
  5. client:visible → 컴포넌트가 뷰포트에 들어올 때 하이드레이션
  6. client:media → 미디어 쿼리가 일치할 때 하이드레이션
  7. client:only → SSR 건너뛰기, 클라이언트에서만 렌더링

콘텐츠 컬렉션 스키마 (Astro 5+)

// src/content.config.ts
import { defineCollection } from 'astro:content';
import { glob } from 'astro/loaders';
import { z } from 'astro/zod';

const blog = defineCollection({
  loader: glob({ base: './src/content/blog', pattern: '**/*.{md,mdx}' }),
  schema: z.object({
    title: z.string(),
    date: z.coerce.date(),
    draft: z.boolean().default(false),
    tags: z.array(z.string()).optional(),
  }),
});

export const collections = { blog };

서버 섬

---
import UserAvatar from '../components/UserAvatar.astro';
---

<UserAvatar server:defer>
  <img slot="fallback" src="/generic-avatar.svg" alt="로딩 중..." />
</UserAvatar>

CLI 명령어

명령어용도
npx astro dev개발 서버 시작
npx astro syncTypeScript 타입 재생성 — 통합 기능을 추가하거나 변경한 후 다시 실행
npx astro check프로젝트 타입 및 구성 오류 확인
npx astro build배포 아티팩트 생성
npx astro add <integration>통합 기능 또는 어댑터 추가 (예: node, cloudflare, netlify, vercel)

배포 게이트

배포 전:

  1. 어댑터가 아직 구성되지 않은 경우 npx astro add <adapter> --yes를 실행합니다.
  2. npx astro check를 실행합니다. — 빌드 전에 타입 및 구성 오류를 수정합니다.
  3. npx astro build를 실행합니다.
  4. 계속 진행하기 전에 빌드 출력 디렉토리가 존재하고 비어 있지 않은지 확인합니다.

Astro는 에이전트를 위한 문서 인덱스를 https://docs.astro.build/llms.txt에 게시합니다. — 기억에 의존하지 말고 이 문서와 공식 문서를 참조하세요.

출력 형식

Astro 기능을 구현할 때 다음을 제공하세요:

  1. 컴포넌트 파일 (프론트매터와 템플릿이 있는 .astro)
  2. 구성 업데이트 (필요한 경우 astro.config.mjs)
  3. 콘텐츠 컬렉션 스키마 (컬렉션을 사용하는 경우)
  4. TypeScript 타입 (Props 및 데이터용)
  5. 선택한 하이드레이션 전략에 대한 간단한 설명

기술 스택

Astro 5+/6+, 섬 아키텍처, 콘텐츠 레이어 API (glob/file 로더, 라이브 로더), Zod 스키마, 뷰 전환 API, 서버 섬 (server:defer), 세션, 액션, 미들웨어, astro:env (타입 안전 환경 변수), i18n 라우팅, 어댑터 (Node, Vercel, Netlify, Cloudflare, Deno), React/Vue/Svelte/Solid 통합, 이미지 최적화, MDX, Markdoc, TypeScript, 범위 지정 CSS, Tailwind CSS

관련 스킬