| Crates.io | jgf |
| lib.rs | jgf |
| version | 0.1.2 |
| created_at | 2025-09-02 06:06:03.378159+00 |
| updated_at | 2025-09-02 06:30:52.242237+00 |
| description | Jira-GitHub Flow CLI tool for seamless project management |
| homepage | https://github.com/jaehafe/jgf |
| repository | https://github.com/jaehafe/jgf |
| max_upload_size | |
| id | 1820645 |
| size | 143,234 |
Jiraμ Gitμ μ°λνλ μν¬νλ‘μ° μλν CLI λꡬ
κ°λ°νμμ λ°λ³΅μ μΌλ‘ κ²ͺλ λ¬Έμ λ€:
μ΄ λͺ¨λ κ³Όμ μ΄ μκ°μ΄ λ§μ΄ μμλ©λλ€.
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 β λ¨Έμ§ β μμ
# crates.ioμμ μ€μΉ
cargo install jgf
# λλ μμ€μμ λΉλ
git clone https://github.com/jaehafe/jgf.git
cd jgf
cargo install --path .
# 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/
κ° νλ‘μ νΈ λ£¨νΈμμ μ€ν:
jgf init
μ΄ λͺ λ Ήμ λ κ°μ νμΌμ μμ±ν©λλ€:
jgf.json - νλ‘μ νΈ μ€μ (Gitμ μ»€λ° κ°λ₯){
"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": "μ§μ ν
νλ¦Ώ λ΄μ©..."
}
}
.env - ν ν° μ 보JIRA_TOKEN=your-jira-api-token
GITHUB_TOKEN=ghp_your_github_token
Jira API Token:
.envμ μ μ₯GitHub Personal Access Token:
repo (μ 체)# ν λΉλ λͺ¨λ ν°μΌ μ‘°ν
jgf tickets
# μνλ³ νν°λ§
jgf tickets --status "In Progress"
# μ΅λ κ°μ μ ν
jgf tickets --limit 10
μΈν°λν°λΈ λͺ¨λ:
jgf start EM-100
μλ μν μμ :
EM-100 λΈλμΉ μμ± λ° μ²΄ν¬μμjgf pr
μλ μν μμ :
[EM-100] ν°μΌ μ λͺ©jgf sync
μλ μν μμ :
# 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'κ° μμ λμμ΅λλ€
β¨ λΈλμΉ λκΈ°ν μλ£!
# μ¬λ¬ λΈλμΉμμ μμ
ν νλ²μ μ 리
$ jgf sync
π 3κ°μ ν°μΌ λΈλμΉλ₯Ό λ°κ²¬νμ΅λλ€
πΏ λΈλμΉ 'EM-118' νμΈ μ€...
β
λΈλμΉ 'EM-118'κ° λ¨Έμ§λμμ΅λλ€
> ν°μΌ EM-118λ₯Ό 'Done' μνλ‘ λ³κ²½νμκ² μ΅λκΉ? Yes
> λ‘컬 λΈλμΉ 'EM-118'λ₯Ό μμ νμκ² μ΅λκΉ? Yes
πΏ λΈλμΉ 'EM-119' νμΈ μ€...
π‘ λΈλμΉ 'EM-119'λ μμ§ λ¨Έμ§λμ§ μμμ΅λλ€
πΏ λΈλμΉ 'EM-120' νμΈ μ€...
β
λΈλμΉ 'EM-120'κ° λ¨Έμ§λμμ΅λλ€
...
κΈ°λ³Έμ μΌλ‘ λ€μ μνλ₯Ό μ§μν©λλ€:
To Do / ν΄μΌ ν μΌIn Progress / μ§ν μ€Done / μλ£νμ¬μ "In Review" μνκ° μλ κ²½μ°, PR μμ± μ μνλ₯Ό λ³κ²½νμ§ μκ³ λ¨Έμ§ ν DoneμΌλ‘λ§ λ³κ²½ν©λλ€.
{JIRA_TICKET_NUMBER} (μ: EM-100)src/config.rsμ format_branch_name() ν¨μ μμ νλ‘μ νΈμ PR ν νλ¦Ώ νμΌ (μλ νμ)
.github/pull_request_template.md.github/PULL_REQUEST_TEMPLATE.mdpull_request_template.mddocs/pull_request_template.md.gitlab/merge_request_templates/default.mdjgf.jsonμ μ μλ ν νλ¦Ώ
prTemplate.path: 컀μ€ν
κ²½λ‘ μ§μ prTemplate.content: μ§μ ν
νλ¦Ώ λ΄μ© μμ±κΈ°λ³Έ λ΄μ₯ ν νλ¦Ώ
jgfλ PR ν νλ¦Ώμμ λ€μ λ³μλ₯Ό μλ μΉνν©λλ€:
{{TICKET_KEY}} - Jira ν°μΌ λ²νΈ (μ: EM-100){{TICKET_URL}} - Jira ν°μΌ URL{{TICKET_TITLE}} - Jira ν°μΌ μ λͺ©{{BRANCH_NAME}} - νμ¬ λΈλμΉλͺ
## π« ν°μΌ
{{TICKET_URL}}
## π μμ
λ΄μ©
-
## β
체ν¬λ¦¬μ€νΈ
- [ ] ν
μ€νΈ μμ±
- [ ] λ¬Έμ μ
λ°μ΄νΈ
- [ ] μ½λ 리뷰 μμ²
κ° νλ‘μ νΈμ λ
립μ μΈ jgf.jsonμ μμ±νμ¬ κ΄λ¦¬:
# 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 μ€μ μ¬μ©
jgf.json μ°ΎκΈ°jgf.jsonμ΄ μμΌλ©΄ ν΄λΉ μ€μ + κ°μ μμΉμ .env μ¬μ©.env νμΌ μ¬μ© (λ κ±°μ λͺ¨λ)νλ‘μ νΈμ ν¬ν¨λ μμ νμΌ:
jgf.json.example - νλ‘μ νΈ μ€μ μμ .env.example - ν ν° μ€μ μμ # SSH μμ΄μ νΈ νμΈ
ssh-add -l
# SSH ν€ μΆκ°
ssh-add ~/.ssh/id_ed25519
https://λ‘ μμνλμ§ νμΈ