pumasi:
  defaults:
    command: "codex exec --dangerously-bypass-approvals-and-sandbox --skip-git-repo-check"
    emoji: "🤖"

  # 예시: 인증 시스템 (시그니처 + 요구사항 패턴)
  # 실제 사용 시 이 tasks 섹션을 프로젝트에 맞게 수정하세요.
  tasks:
    - name: auth-token
      instruction: |
        src/auth/token.ts를 구현하세요.

        ## 시그니처
        export function generateToken(userId: string, role: 'admin' | 'user'): string
        export function verifyToken(token: string): { userId: string; role: string } | null

        ## 요구사항
        - jsonwebtoken 라이브러리 사용 (다른 JWT 라이브러리 사용 금지)
        - 필수 import: import jwt from 'jsonwebtoken'
        - 만료 시간: 7일
        - secret: process.env.JWT_SECRET
        - verifyToken은 만료/무효 토큰에 null 반환 (throw 금지)

        ## 제약사항
        - TypeScript strict mode
        - ESM (import/export)

      gates:
        - name: "파일 존재"
          command: "[ -f src/auth/token.ts ]"
        - name: "타입 체크"
          command: "npx tsc --noEmit src/auth/token.ts"
        - name: "jsonwebtoken 사용"
          command: "grep -q 'jsonwebtoken' src/auth/token.ts"
        - name: "시그니처 확인"
          command: "grep -q 'generateToken' src/auth/token.ts && grep -q 'verifyToken' src/auth/token.ts"

    - name: auth-password
      instruction: |
        src/auth/password.ts를 구현하세요.

        ## 시그니처
        export function hashPassword(plain: string): Promise<string>
        export function comparePassword(plain: string, hash: string): Promise<boolean>

        ## 요구사항
        - bcrypt 라이브러리 사용 (다른 해싱 라이브러리 금지)
        - 필수 import: import bcrypt from 'bcrypt'
        - salt rounds: 12
        - hashPassword는 bcrypt.hash로 해싱
        - comparePassword는 bcrypt.compare로 비교

        ## 제약사항
        - TypeScript strict mode
        - ESM (import/export)
        - async/await 사용

      gates:
        - name: "파일 존재"
          command: "[ -f src/auth/password.ts ]"
        - name: "타입 체크"
          command: "npx tsc --noEmit src/auth/password.ts"
        - name: "bcrypt 사용"
          command: "grep -q 'bcrypt' src/auth/password.ts"
        - name: "시그니처 확인"
          command: "grep -q 'hashPassword' src/auth/password.ts && grep -q 'comparePassword' src/auth/password.ts"

    - name: user-model
      instruction: |
        src/models/user.ts를 구현하세요.

        ## 타입 정의
        interface User {
          id: string
          email: string
          passwordHash: string
          role: 'admin' | 'user'
          createdAt: string
          updatedAt: string
        }

        ## 시그니처
        export function createUser(email: string, passwordHash: string, role?: 'admin' | 'user'): User
        export function findUserByEmail(email: string): User | null
        export function findUserById(id: string): User | null

        ## 요구사항
        - better-sqlite3로 SQLite DB 사용 (JSON 파일/fs 사용 절대 금지)
        - 필수 import: import Database from 'better-sqlite3'
        - DB 파일 경로: ./data/users.db
        - id는 crypto.randomUUID()로 생성
        - users 테이블 자동 생성 (CREATE TABLE IF NOT EXISTS)
        - createdAt/updatedAt은 ISO 8601 문자열

        ## 제약사항
        - TypeScript strict mode
        - ESM (import/export)

      gates:
        - name: "파일 존재"
          command: "[ -f src/models/user.ts ]"
        - name: "타입 체크"
          command: "npx tsc --noEmit src/models/user.ts"
        - name: "better-sqlite3 사용"
          command: "grep -q 'better-sqlite3' src/models/user.ts && ! grep -q 'readFileSync' src/models/user.ts"
        - name: "시그니처 확인"
          command: "grep -q 'createUser' src/models/user.ts && grep -q 'findUserByEmail' src/models/user.ts"

  settings:
    timeout: 3600
