FE 하네스 심층
fe-agent-harness 프리셋의 24개 규칙 + 26개 스킬을 카테고리별로 완전 분석합니다.
Next.js/TypeScript 프론트엔드 개발에 필요한 AI 운영 가이드라인 전체.

기술 스택 규칙

tech-stack 1개 rule

fe-stack-and-commands — GS Retail FE 표준 기술 스택과 명령어 기준선

레이어기술역할
FrameworkNext.js (App Router)SSR/SSG + 통합 라우팅. 기본은 Server Component; 인터랙티브한 경우만 "use client"
LanguageTypeScript strict도메인 모델과 API 응답 형태에 타입 안전성
Server stateAxios + TanStack Query비동기 fetch, 캐싱, 백그라운드 갱신. 클라이언트 스토어에 복제 금지
Client stateZustand순수 UI 상태만 — 사이드바 열기/닫기, 마법사 진행 상태
FormsReact Hook Form + Zod최적화된 폼 렌더링 + 런타임 검증 + TypeScript 타입 단일 소스
UI@gsr/shared-ui (Radix + Tailwind)모노레포 공유 라이브러리 우선, 없으면 @gsr/shared-ui 패키지

패키지 매니저: pnpm. npm/yarn 절대 사용 금지.

공급망 보안 (Supply Chain Security)

pnpm 설정 (pnpm-workspace.yaml에 추가, 모든 workspace에 적용):

설정이유
minimumReleaseAge10080 (1주일, 분 단위)신규 악성 패키지는 대개 몇 시간 내 탐지. 1주 격리로 초기 피해 방지
blockExoticSubdepstruegit URL/tarball로 배포되는 의존성 차단 — 일반적 밀수 채널
trustPolicyno-downgrade이전에 서명된 패키지의 미서명 후속 버전 설치 거부
⚠️ pnpm v10+는 postinstall 스크립트를 기본 비활성화합니다. --dangerously-allow-all-buildsdangerouslyAllowAllBuilds: 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 하이드레이션 불일치는 근본 원인에서 진단/수정. useEffectmounted 플래그로 렌더를 지연시켜 침묵시키는 것 금지.
// ❌ 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.tsxerror.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-uiUI 컴포넌트 작성 전 필수 로드 — 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-serverBitbucket 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-initOpenAPI/Swagger spec에서 Zod 검증기, TypeScript 타입, TanStack Query 훅 생성 스캐폴더. 최초 1회 실행.
scaffold-msw-handlers-initOpenAPI 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-donePR 열기 전 — 신선한 컨텍스트 서브에이전트로 SHIP/FIX-FIRST 판정
pr-reviewBitbucket PR에 FE 품질 기준 인라인 코멘트 (한국어) 게시
security-reviewdiff/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 상태만 다루게 되고, 코드가 단순해집니다.