jgf 0.1.2

Jira-GitHub Flow CLI tool for seamless project management
Documentation
# JGF (Jira Git Flow) πŸš€

> Jira와 Git을 μ—°λ™ν•˜λŠ” μ›Œν¬ν”Œλ‘œμš° μžλ™ν™” CLI 도ꡬ

## πŸ“Œ 문제 상황

κ°œλ°œνŒ€μ—μ„œ 반볡적으둜 κ²ͺλŠ” λ¬Έμ œλ“€:
- PM이 Jira ν‹°μΌ“ ν• λ‹Ή β†’ κ°œλ°œμžκ°€ μˆ˜λ™μœΌλ‘œ ν‹°μΌ“ 확인
- ν‹°μΌ“ 번호둜 브랜치 생성 β†’ μˆ˜λ™μœΌλ‘œ Jira μƒνƒœ λ³€κ²½
- PR 생성 μ‹œ Jira 링크 볡사/λΆ™μ—¬λ„£κΈ°
- PR λ¨Έμ§€ ν›„ Jira μƒνƒœ μˆ˜λ™ μ—…λ°μ΄νŠΈ
- 둜컬 브랜치 정리

**이 λͺ¨λ“  과정이 μ‹œκ°„μ΄ 많이 μ†Œμš”λ©λ‹ˆλ‹€.**

## ✨ JGFκ°€ ν•΄κ²°ν•˜λŠ” 것

1. **μžλ™ 브랜치 생성**: Jira ν‹°μΌ“ 번호둜 μžλ™ 브랜치 생성
2. **μžλ™ μƒνƒœ 동기화**: μž‘μ—… μ‹œμž‘/PR/λ¨Έμ§€ μ‹œ Jira μƒνƒœ μžλ™ μ—…λ°μ΄νŠΈ
3. **PR ν…œν”Œλ¦Ώ μžλ™ν™”**: Jira 링크와 ν‹°μΌ“ 정보 μžλ™ 포함
4. **브랜치 μžλ™ 정리**: λ¨Έμ§€λœ 브랜치 μžλ™ 감지 및 μ‚­μ œ

## πŸ”„ μ›Œν¬ν”Œλ‘œμš°

### 전체 ν”Œλ‘œμš°
```
1. PM/개발자 Jira ν‹°μΌ“ ν• λ‹Ή
    ↓
2. 개발자: jgf tickets (ν‹°μΌ“ 쑰회)
    ↓
3. 개발자: jgf start EM-XXX (브랜치 생성)
    β†’ μžλ™: Git 브랜치 생성
    β†’ μžλ™: Jira μƒνƒœ "In Progress"둜 λ³€κ²½
    ↓
4. 개발자: μ½”λ”© μž‘μ—…
    ↓
5. 개발자: jgf pr (PR 생성)
    β†’ μžλ™: PR 제λͺ©μ— ν‹°μΌ“ 번호 포함
    β†’ μžλ™: PR 본문에 Jira 링크 μΆ”κ°€
    ↓
6. νŒ€: μ½”λ“œ 리뷰 & λ¨Έμ§€
    ↓
7. 개발자: jgf sync (동기화)
    β†’ μžλ™: λ¨Έμ§€λœ 브랜치 감지
    β†’ μžλ™: Jira μƒνƒœ "Done"으둜 λ³€κ²½
    β†’ μžλ™: 둜컬 브랜치 μ‚­μ œ
```

### μƒνƒœ λ³€ν™”
```
Jira μƒνƒœ:  To Do β†’ In Progress β†’ Done
Git 브랜치:  μ—†μŒ β†’ EM-XXX 생성 β†’ PR β†’ λ¨Έμ§€ β†’ μ‚­μ œ
```

## πŸ›  μ„€μΉ˜ 방법

### Prerequisites
- Git
- Jira 계정 및 API 토큰
- GitHub 계정 및 Personal Access Token

### μ„€μΉ˜ μ˜΅μ…˜

#### Option 1: Cargoλ₯Ό ν†΅ν•œ μ„€μΉ˜ (Rust ν•„μš”)
```bash
# crates.ioμ—μ„œ μ„€μΉ˜
cargo install jgf

# λ˜λŠ” μ†ŒμŠ€μ—μ„œ λΉŒλ“œ
git clone https://github.com/jaehafe/jgf.git
cd jgf
cargo install --path .
```

#### Option 2: λ°”μ΄λ„ˆλ¦¬ 직접 λ‹€μš΄λ‘œλ“œ (Rust λΆˆν•„μš”)
```bash
# macOS (Apple Silicon)
curl -L https://github.com/jaehafe/jgf/releases/latest/download/jgf-darwin-aarch64 -o jgf
chmod +x jgf
sudo mv jgf /usr/local/bin/

# macOS (Intel)
curl -L https://github.com/jaehafe/jgf/releases/latest/download/jgf-darwin-x64 -o jgf
chmod +x jgf
sudo mv jgf /usr/local/bin/

# Linux
curl -L https://github.com/jaehafe/jgf/releases/latest/download/jgf-linux-x64 -o jgf
chmod +x jgf
sudo mv jgf /usr/local/bin/
```

## βš™οΈ 초기 μ„€μ •

### ν”„λ‘œμ νŠΈλ³„ μ„€μ • (ꢌμž₯)

각 ν”„λ‘œμ νŠΈ λ£¨νŠΈμ—μ„œ μ‹€ν–‰:

```bash
jgf init
```

이 λͺ…령은 두 개의 νŒŒμΌμ„ μƒμ„±ν•©λ‹ˆλ‹€:

#### 1. `jgf.json` - ν”„λ‘œμ νŠΈ μ„€μ • (Git에 컀밋 κ°€λŠ₯)
```json
{
  "project": "your-project-name",
  "jira": {
    "url": "https://your-company.atlassian.net",
    "project": "EM",
    "username": "your-email@company.com"  // Optional
  },
  "github": {
    "owner": "YourOrg",
    "repo": "your-repo"
  },
  "defaultBranch": "develop",
  "prTemplate": {  // Optional
    "path": "custom/pr_template.md"  // λ˜λŠ”
    // "content": "직접 ν…œν”Œλ¦Ώ λ‚΄μš©..."
  }
}
```

#### 2. `.env` - 토큰 정보
```env
JIRA_TOKEN=your-jira-api-token
GITHUB_TOKEN=ghp_your_github_token
```

### API 토큰 λ°œκΈ‰ 방법

**Jira API Token:**
1. [Atlassian Account Settings]https://id.atlassian.com/manage-profile/security/api-tokens 접속
2. "Create API token" 클릭
3. 토큰 이름 μž…λ ₯ ν›„ 생성
4. 토큰 λ³΅μ‚¬ν•˜μ—¬ `.env`에 μ €μž₯

**GitHub Personal Access Token:**
1. GitHub Settings β†’ Developer settings β†’ Personal access tokens
2. "Generate new token (classic)" 클릭
3. κΆŒν•œ 선택: `repo` (전체)
4. 토큰 생성 및 볡사

## πŸ“š μ‚¬μš©λ²•

### 1. ν• λ‹Ήλœ ν‹°μΌ“ 쑰회 및 μž‘μ—… μ‹œμž‘

```bash
# ν• λ‹Ήλœ λͺ¨λ“  ν‹°μΌ“ 쑰회
jgf tickets

# μƒνƒœλ³„ 필터링
jgf tickets --status "In Progress"

# μ΅œλŒ€ 개수 μ œν•œ
jgf tickets --limit 10
```

**μΈν„°λž™ν‹°λΈŒ λͺ¨λ“œ:**
- ν‹°μΌ“ λͺ©λ‘μ—μ„œ 선택
- "브랜치 생성 및 In Progress둜 λ³€κ²½" 선택
- μžλ™μœΌλ‘œ 브랜치 생성 및 Jira μƒνƒœ μ—…λ°μ΄νŠΈ

### 2. νŠΉμ • ν‹°μΌ“μœΌλ‘œ μž‘μ—… μ‹œμž‘

```bash
jgf start EM-100
```

**μžλ™ μˆ˜ν–‰ μž‘μ—…:**
- βœ… develop λΈŒλžœμΉ˜μ—μ„œ μ΅œμ‹  변경사항 pull
- βœ… `EM-100` 브랜치 생성 및 체크아웃
- βœ… Jira 티켓을 "In Progress"둜 λ³€κ²½

### 3. PR 생성

```bash
jgf pr
```

**μžλ™ μˆ˜ν–‰ μž‘μ—…:**
- βœ… ν˜„μž¬ λΈŒλžœμΉ˜μ—μ„œ develop으둜 PR 생성
- βœ… PR 제λͺ©: `[EM-100] ν‹°μΌ“ 제λͺ©`
- βœ… ν”„λ‘œμ νŠΈμ˜ PR ν…œν”Œλ¦Ώ μžλ™ 탐색 및 적용
- βœ… PR 본문에 Jira 링크 및 ν‹°μΌ“ 정보 μžλ™ μ‚½μž…
- βœ… PR이 이미 μ‘΄μž¬ν•˜λ©΄ 링크 μ•ˆλ‚΄

### 4. λ¨Έμ§€ ν›„ 동기화

```bash
jgf sync
```

**μžλ™ μˆ˜ν–‰ μž‘μ—…:**
- βœ… develop 브랜치둜 μ „ν™˜ 및 μ΅œμ‹  pull
- βœ… λ¨Έμ§€λœ 브랜치 감지
- βœ… ν•΄λ‹Ή Jira 티켓을 "Done"으둜 λ³€κ²½
- βœ… 둜컬 브랜치 μ‚­μ œ

## 🎯 μ‹€μ œ μ‚¬μš© μ‹œλ‚˜λ¦¬μ˜€

### μ‹œλ‚˜λ¦¬μ˜€ 1: μƒˆ κΈ°λŠ₯ 개발

```bash
# 1. ν• λ‹Ήλœ ν‹°μΌ“ 확인
$ jgf tickets
🎫 [1] EM-120 μ‚¬μš©μž ν”„λ‘œν•„ κΈ°λŠ₯ μΆ”κ°€
   μƒνƒœ: To Do | λ‹΄λ‹Ήμž: κΉ€κ°œλ°œ | μš°μ„ μˆœμœ„: High

# 2. μž‘μ—… μ‹œμž‘ (μΈν„°λž™ν‹°λΈŒ 선택 λ˜λŠ” 직접 λͺ…λ Ή)
$ jgf start EM-120
πŸš€ ν‹°μΌ“ EM-120 μž‘μ—…μ„ μ‹œμž‘ν•©λ‹ˆλ‹€
🌿 브랜치 'EM-120'κ°€ μƒμ„±λ˜κ³  μ²΄ν¬μ•„μ›ƒλ˜μ—ˆμŠ΅λ‹ˆλ‹€
βœ… ν‹°μΌ“ μƒνƒœκ°€ 'In Progress'둜 λ³€κ²½λ˜μ—ˆμŠ΅λ‹ˆλ‹€

# 3. μ½”λ”© μž‘μ—…...

# 4. PR 생성
$ jgf pr
πŸš€ 브랜치 'EM-120'μ—μ„œ 'develop'으둜 PR 생성
βœ… PR이 μ„±κ³΅μ μœΌλ‘œ μƒμ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€! #123
πŸ’‘ PR 링크: https://github.com/YourOrg/your-repo/pull/123

# 5. 리뷰 & λ¨Έμ§€ ν›„
$ jgf sync
πŸ”„ λ¨Έμ§€λœ 브랜치 동기화 μ‹œμž‘
βœ… ν‹°μΌ“ EM-120 μƒνƒœκ°€ 'Done'으둜 λ³€κ²½λ˜μ—ˆμŠ΅λ‹ˆλ‹€
βœ… 브랜치 'EM-120'κ°€ μ‚­μ œλ˜μ—ˆμŠ΅λ‹ˆλ‹€
✨ 브랜치 동기화 μ™„λ£Œ!
```

### μ‹œλ‚˜λ¦¬μ˜€ 2: μ—¬λŸ¬ ν‹°μΌ“ λ™μ‹œ μž‘μ—…

```bash
# μ—¬λŸ¬ λΈŒλžœμΉ˜μ—μ„œ μž‘μ—… ν›„ ν•œλ²ˆμ— 정리
$ jgf sync
πŸ”„ 3개의 ν‹°μΌ“ 브랜치λ₯Ό λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€

🌿 브랜치 'EM-118' 확인 쀑...
βœ… 브랜치 'EM-118'κ°€ λ¨Έμ§€λ˜μ—ˆμŠ΅λ‹ˆλ‹€
> ν‹°μΌ“ EM-118λ₯Ό 'Done' μƒνƒœλ‘œ λ³€κ²½ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ? Yes
> 둜컬 브랜치 'EM-118'λ₯Ό μ‚­μ œν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ? Yes

🌿 브랜치 'EM-119' 확인 쀑...
πŸ’‘ 브랜치 'EM-119'λŠ” 아직 λ¨Έμ§€λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€

🌿 브랜치 'EM-120' 확인 쀑...
βœ… 브랜치 'EM-120'κ°€ λ¨Έμ§€λ˜μ—ˆμŠ΅λ‹ˆλ‹€
...
```

## 🏒 νšŒμ‚¬λ³„ μ»€μŠ€ν„°λ§ˆμ΄μ§•

### Jira μƒνƒœ λ§€ν•‘
기본적으둜 λ‹€μŒ μƒνƒœλ₯Ό μ§€μ›ν•©λ‹ˆλ‹€:
- `To Do` / `ν•΄μ•Ό ν•  일`
- `In Progress` / `μ§„ν–‰ 쀑`
- `Done` / `μ™„λ£Œ`

νšŒμ‚¬μ— "In Review" μƒνƒœκ°€ μ—†λŠ” 경우, PR 생성 μ‹œ μƒνƒœλ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³  λ¨Έμ§€ ν›„ Done으둜만 λ³€κ²½ν•©λ‹ˆλ‹€.

### 브랜치 넀이밍
- 기본: `{JIRA_TICKET_NUMBER}` (예: `EM-100`)
- μˆ˜μ • ν•„μš”μ‹œ `src/config.rs`의 `format_branch_name()` ν•¨μˆ˜ μˆ˜μ •

### PR ν…œν”Œλ¦Ώ κΈ°λŠ₯

#### ν…œν”Œλ¦Ώ μš°μ„ μˆœμœ„
1. **ν”„λ‘œμ νŠΈμ˜ PR ν…œν”Œλ¦Ώ 파일** (μžλ™ 탐색)
   - `.github/pull_request_template.md`
   - `.github/PULL_REQUEST_TEMPLATE.md`
   - `pull_request_template.md`
   - `docs/pull_request_template.md`
   - `.gitlab/merge_request_templates/default.md`

2. **jgf.json에 μ •μ˜λœ ν…œν”Œλ¦Ώ**
   - `prTemplate.path`: μ»€μŠ€ν…€ 경둜 μ§€μ •
   - `prTemplate.content`: 직접 ν…œν”Œλ¦Ώ λ‚΄μš© μž‘μ„±

3. **κΈ°λ³Έ λ‚΄μž₯ ν…œν”Œλ¦Ώ**

#### ν…œν”Œλ¦Ώ λ³€μˆ˜
jgfλŠ” PR ν…œν”Œλ¦Ώμ—μ„œ λ‹€μŒ λ³€μˆ˜λ₯Ό μžλ™ μΉ˜ν™˜ν•©λ‹ˆλ‹€:
- `{{TICKET_KEY}}` - Jira ν‹°μΌ“ 번호 (예: EM-100)
- `{{TICKET_URL}}` - Jira ν‹°μΌ“ URL
- `{{TICKET_TITLE}}` - Jira ν‹°μΌ“ 제λͺ©
- `{{BRANCH_NAME}}` - ν˜„μž¬ 브랜치λͺ…

#### ν…œν”Œλ¦Ώ μ˜ˆμ‹œ
```markdown
## 🎫 ν‹°μΌ“
{{TICKET_URL}}

## πŸ“ μž‘μ—… λ‚΄μš©
- 

## βœ… 체크리슀트
- [ ] ν…ŒμŠ€νŠΈ μž‘μ„±
- [ ] λ¬Έμ„œ μ—…λ°μ΄νŠΈ
- [ ] μ½”λ“œ 리뷰 μš”μ²­
```

### μ—¬λŸ¬ ν”„λ‘œμ νŠΈ 관리
각 ν”„λ‘œμ νŠΈμ— 독립적인 `jgf.json`을 μƒμ„±ν•˜μ—¬ 관리:

```bash
# Frontend ν”„λ‘œμ νŠΈ
cd ~/projects/frontend
jgf init  # frontend용 jgf.json 생성

# Backend ν”„λ‘œμ νŠΈ
cd ~/projects/backend
jgf init  # backend용 jgf.json 생성

# 각 ν”„λ‘œμ νŠΈμ—μ„œ λ…λ¦½μ μœΌλ‘œ μž‘λ™
cd ~/projects/frontend && jgf tickets  # frontend μ„€μ • μ‚¬μš©
cd ~/projects/backend && jgf tickets   # backend μ„€μ • μ‚¬μš©
```

### μ„€μ • 파일 μš°μ„ μˆœμœ„
1. ν˜„μž¬ 디렉토리뢀터 μƒμœ„λ‘œ νƒμƒ‰ν•˜μ—¬ `jgf.json` μ°ΎκΈ°
2. `jgf.json`이 있으면 ν•΄λ‹Ή μ„€μ • + 같은 μœ„μΉ˜μ˜ `.env` μ‚¬μš©
3. μ—†μœΌλ©΄ μ „μ—­ `.env` 파일 μ‚¬μš© (λ ˆκ±°μ‹œ λͺ¨λ“œ)

## πŸ“ 예제 파일

ν”„λ‘œμ νŠΈμ— ν¬ν•¨λœ 예제 파일:
- `jgf.json.example` - ν”„λ‘œμ νŠΈ μ„€μ • 예제
- `.env.example` - 토큰 μ„€μ • 예제

## πŸ”§ 문제 ν•΄κ²°

### SSH 인증 였λ₯˜
```bash
# SSH μ—μ΄μ „νŠΈ 확인
ssh-add -l

# SSH ν‚€ μΆ”κ°€
ssh-add ~/.ssh/id_ed25519
```

### Jira API 였λ₯˜
- API 토큰이 μ˜¬λ°”λ₯Έμ§€ 확인
- Jira URL이 `https://`둜 μ‹œμž‘ν•˜λŠ”μ§€ 확인
- ν”„λ‘œμ νŠΈ ν‚€(예: EM)κ°€ μ •ν™•ν•œμ§€ 확인

### GitHub API 였λ₯˜
- Personal Access Token κΆŒν•œ 확인 (repo κΆŒν•œ ν•„μš”)
- Repository owner와 name이 μ •ν™•ν•œμ§€ 확인