FE 하네스 심층
fe-agent-harness 프리셋의 24개 규칙 + 26개 스킬을 카테고리별로 완전 분석합니다.
Next.js/TypeScript 프론트엔드 개발에 필요한 AI 운영 가이드라인 전체.
Next.js/TypeScript 프론트엔드 개발에 필요한 AI 운영 가이드라인 전체.
기술 스택 규칙
tech-stack
1개 rule
fe-stack-and-commands — GS Retail FE 표준 기술 스택과 명령어 기준선
| 레이어 | 기술 | 역할 |
|---|---|---|
| Framework | Next.js (App Router) | SSR/SSG + 통합 라우팅. 기본은 Server Component; 인터랙티브한 경우만 "use client" |
| Language | TypeScript strict | 도메인 모델과 API 응답 형태에 타입 안전성 |
| Server state | Axios + TanStack Query | 비동기 fetch, 캐싱, 백그라운드 갱신. 클라이언트 스토어에 복제 금지 |
| Client state | Zustand | 순수 UI 상태만 — 사이드바 열기/닫기, 마법사 진행 상태 |
| Forms | React Hook Form + Zod | 최적화된 폼 렌더링 + 런타임 검증 + TypeScript 타입 단일 소스 |
| UI | @gsr/shared-ui (Radix + Tailwind) | 모노레포 공유 라이브러리 우선, 없으면 @gsr/shared-ui 패키지 |
패키지 매니저: pnpm. npm/yarn 절대 사용 금지.
공급망 보안 (Supply Chain Security)
pnpm 설정 (pnpm-workspace.yaml에 추가, 모든 workspace에 적용):
| 설정 | 값 | 이유 |
|---|---|---|
| minimumReleaseAge | 10080 (1주일, 분 단위) | 신규 악성 패키지는 대개 몇 시간 내 탐지. 1주 격리로 초기 피해 방지 |
| blockExoticSubdeps | true | git URL/tarball로 배포되는 의존성 차단 — 일반적 밀수 채널 |
| trustPolicy | no-downgrade | 이전에 서명된 패키지의 미서명 후속 버전 설치 거부 |
⚠️ pnpm v10+는
postinstall 스크립트를 기본 비활성화합니다. --dangerously-allow-all-builds나 dangerouslyAllowAllBuilds: true는 절대 사용 금지. 특정 패키지에만 allowBuilds로 명시적 허용.아키텍처 규칙
architecture
1개 rule
feature-boundaries — Feature-Sliced Design (FSD) 경계 규칙
- 코드를 파일 유형이 아닌 기능(feature)별로 그룹화
- features 간 import는 반드시 각 feature의 public entry point (index.ts)를 통해야 함. 내부 파일 직접 import 금지
- 의존성 방향은 단방향 — 순환 의존성 금지
- 공유 타입은
types/에, feature 내 타입은 해당 feature 안에 co-locate
// ✅ 올바른 import (public entry point 통해)
import { UserCard } from '@/features/user'
// ❌ 잘못된 import (feature 내부 직접 접근)
import { UserCard } from '@/features/user/components/UserCard'
워크플로우 규칙
workflow
3개 rules
- plan-first: 코드 전에 구현 계획 작성 (컴포넌트 트리, 상태, 데이터 흐름, 변경 파일)
- fe-tdd: Red-Green-Refactor — 동작 지정하는 실패 테스트(Vitest/Jest 또는 Playwright/Cypress) 먼저 작성
- cleanup-after-green: 테스트 통과 후 — 변경된 파일 포맷, 죽은 import 제거, console.log 삭제, 주석 처리된 코드 삭제
Next.js 경계 & 하이드레이션 규칙
nextjs-boundaries-hydration
2개 rules
- serializable-boundary-props: Server → Client Component 경계에서 직렬화 가능한 값만 전달. 함수, 클래스 인스턴스, Date/Map/Set 금지. 대신 문자열로 직렬화 후 전달.
- hydration-mismatches: React 하이드레이션 불일치는 근본 원인에서 진단/수정.
useEffect나mounted플래그로 렌더를 지연시켜 침묵시키는 것 금지.
// ❌ hydration 불일치 침묵 패턴 — 금지
const [mounted, setMounted] = useState(false)
useEffect(() => setMounted(true), [])
if (!mounted) return null // 서버/클라이언트 불일치를 숨김
// ✅ 근본 원인 수정 — 서버와 클라이언트에서 동일한 초기 값 사용
타입 모델링 규칙
type-modeling
2개 rules
- no-any: TypeScript
any금지.unknown+ 타입 가드로 좁히기. 불안전한as캐스트 피하기. - domain-types: 도메인 엔티티를
types/나 소유 feature에 명시적interface/type으로 정의. API 계약이 있는 경우 그것으로부터 파생.
// ❌ any 사용 금지
function process(data: any) { ... }
// ✅ unknown + type guard
function process(data: unknown) {
if (!isUser(data)) throw new Error('invalid')
// 이제 data는 User 타입
}
// ✅ 도메인 타입 명시적 정의
interface User { id: string; name: string; role: 'admin' | 'viewer' }
UI 스타일링 & 접근성 규칙
ui-styling-a11y
2개 rules
- design-tokens: Tailwind 디자인 토큰만 사용. 하드코딩된 px/hex 금지. 토큰으로 커버되는 항목에 인라인 스타일 사용 금지. 누락된 토큰은 설정에 추가.
- accessibility: ARIA보다 시맨틱 HTML 우선. WAI-ARIA 올바르게 적용. 키보드 조작 가능성 보장. WCAG AA 명도 대비 충족.
/* ❌ 하드코딩된 값 금지 */
<div style={{color: '#7C3AED', padding: '16px'}}>
/* ✅ 디자인 토큰 사용 */
<div className="text-purple-600 p-4">
/* ✅ 시맨틱 HTML 우선 */
<button onClick={handleClick}> /* button이 div보다 항상 우선 */
<nav>, <header>, <main>, <article> /* 구조적 요소 활용 */
상태 & 오류 경계 규칙
state-error-handling
2개 rules
- state-ownership: 서버 상태 → TanStack Query. 클라이언트/UI 상태 → Zustand 또는 로컬 useState. 둘 사이에 데이터를 복제하지 않는다.
- route-boundaries: 모든 주요 route segment는
loading.tsx와error.tsx를 포함해야 함. 빈 화면이나 처리되지 않은 throw 금지.
// ❌ 서버 상태를 Zustand에 복제 — 금지
const useUserStore = create((set) => ({
users: [], // ← 이미 TanStack Query가 관리중
fetchUsers: async () => { const data = await api.get('/users'); set({ users: data }) }
}))
// ✅ TanStack Query로 서버 상태 관리
const { data: users } = useQuery({ queryKey: ['users'], queryFn: fetchUsers })
기타 규칙들
naming, dependencies, version-control, security, critic-loop, guardrails
13개 rules
- casing: PascalCase (컴포넌트/인터페이스), camelCase (유틸/훅), kebab-case (파일명)
- reuse-before-install: package.json 확인 후 없을 때만 추가. 모든 의존성 추가에 명시적 승인 필요.
- commits: Conventional Commits + 명령형 제목 + 소규모 원자적 커밋
- language-policy: 코드/커밋=영어, PR/UI=한국어
- no-hardcoded-secrets: 모든 스테이징 파일에 비밀 스캔 적용
- sanitize-untrusted-input: 외부 입력 전체를 신뢰 불가로 처리. XSS/injection/path traversal 방지
- mask-pii: 로그/에러/애널리틱스에 원시 PII 절대 노출 금지
- autonomous-retry: 빌드/lint/테스트 실패 시 최대 3회 자율 수정
- protected-config-files: next.config, tsconfig, CI/CD 파이프라인 명시적 승인 없이 수정 금지
- no-reading-generated-trees: .next/, node_modules/, 빌드 출력, lockfile 내부 읽기 금지
FE 하네스 스킬 카탈로그 (26개)
FE 하네스에 포함된 모든 skill. 카테고리별로 정리했습니다.
디자인 시스템 (3개)
gsr-design-tokens
gsr-design-philosophy
gsr-shared-ui
| 스킬 | 사용 시점 |
|---|---|
gsr-design-tokens | 스타일 관련 파일 편집 시 — colors, typography, spacing, border-radius. 정확한 Tailwind 토큰 클래스명 확인 |
gsr-design-philosophy | 시각적 판단이 필요할 때 — 페이지/컴포넌트 구성, 강조 방법, 타이포그래피 무게 선택. "GS Retail답게 보이나?" 체크 |
gsr-shared-ui | UI 컴포넌트 작성 전 필수 로드 — 50개 이상의 Radix/shadcn 컴포넌트 카탈로그. 새로 만들기 전에 여기서 찾기 |
Nx Monorepo (1개)
nx-best-practices
Module 09에서 상세히 다룹니다. apps/libs 구조, 태그+경계, 커맨드 표면 전체.
Git 워크플로우 (3개)
conventional-commits
pre-stage-secret-scan
bitbucket-server
| 스킬 | 사용 시점 |
|---|---|
conventional-commits | 커밋 메시지 작성/수정 시. type 목록, scope 규칙, breaking change 문법 |
pre-stage-secret-scan | 모든 git add/commit 전 자동 실행. API 키, JWT, private key, 자격증명 URL 스캔 |
bitbucket-server | Bitbucket Data Center REST API 사용 시. Module 10에서 상세 다룸 |
UI 도메인 컨텍스트 (5개)
scaffold-domain-ui
scaffold-ui-isolation
validate-routing-rules
audit-design-system
update-context
| 스킬 | 역할 |
|---|---|
scaffold-domain-ui | 도메인 이름 + 필드로 React 컴포넌트 + 타입 인터페이스 스캐폴드 생성 |
scaffold-ui-isolation | 새 컴포넌트의 Storybook 스토리(또는 isolated sandbox route) 생성 |
validate-routing-rules | 새/변경된 페이지가 Next.js App Router 컨벤션을 따르는지 정적 검사 |
audit-design-system | 인라인 스타일 + 비표준 클래스 스캔, 디자인 토큰으로 교체 제안 |
update-context | 새 기능 완성 후 ARCHITECTURE.md에 간결한 요약 추가 (세션 간 컨텍스트 유지) |
API 연동 (2개)
sync-api-contracts-init
scaffold-msw-handlers-init
| 스킬 | 역할 |
|---|---|
sync-api-contracts-init | OpenAPI/Swagger spec에서 Zod 검증기, TypeScript 타입, TanStack Query 훅 생성 스캐폴더. 최초 1회 실행. |
scaffold-msw-handlers-init | OpenAPI spec에서 MSW handler 스캐폴드 설정. 최초 1회 실행. |
인증 (1개)
azure-ad-sso-nextjs
Azure AD (Entra ID) SSO를 Next.js App Router FE에 추가. MSAL acquireTokenSilent, AuthProvider/useAuth 컨텍스트, /api/acl 프록시. deploy-edu Module 01 참조.
QA & DevOps (8개)
audit-security-baseline
generate-unit-tests
scaffold-e2e-flow
scrape-runtime-errors
consolidate-tech-debt
check-deployment-readiness
generate-pr-summary
address-pr-feedback
상세 내용은 Module 08 — QA & 코드리뷰.
코드리뷰 (3개)
are-we-done
pr-review
security-review
| 스킬 | 사용 시점 |
|---|---|
are-we-done | PR 열기 전 — 신선한 컨텍스트 서브에이전트로 SHIP/FIX-FIRST 판정 |
pr-review | Bitbucket PR에 FE 품질 기준 인라인 코멘트 (한국어) 게시 |
security-review | diff/PR 신뢰 경계 분석 + OWASP Top 10 기반 보안 검토 |
FE 하네스 표준 명령어
# 패키지 설치
pnpm install
# 전체 workspace typecheck
pnpm tsc --noEmit
# Nx를 통한 모든 작업 — nx.json의 target에 따라
nx dev my-app # 개발 서버
nx build my-app # 프로덕션 빌드
nx lint my-app # ESLint
nx test my-app # Vitest/Jest
nx e2e my-app-e2e # Playwright/Cypress
# 영향받은 프로젝트만 실행
nx affected -t build
nx affected -t test
# 의존성 그래프 시각화
nx graph
✅ 기억할 것: FE 하네스의 핵심 철학은 서버 상태와 클라이언트 상태의 분리입니다. TanStack Query가 서버 상태를 전담하면 Zustand는 순수 UI 상태만 다루게 되고, 코드가 단순해집니다.