- name
- jiracli
- description
- Jira CLI for issue tracking, project management, and sprint/board operations on goqual-dev.atlassian.net. Supports multiple projects (MAT, DEVT, IOT, etc.). Also fetches Confluence wiki pages โ import an Atlassian wiki URL (tinyLink or full /wiki/spaces/.../pages/<id>) into a local Markdown file with KST timestamps via the bundled confluence_ingest.py script (Confluence to Markdown, Atlassian wiki ingestion, wiki page import).
# Jira CLI (jira-cli-go)
ํ์ฌ Jira Cloud(`goqual-dev.atlassian.net`) ์ ๊ทผ์ฉ CLI ์คํฌ.
## ํ๊ฒฝ
- **๋๊ตฌ**: `jira` (ankitpokhrel/jira-cli v1.7.0, NixOS `jira-cli-go`)
- **์ธ์ฆ**: `JIRA_API_TOKEN` in `~/.env.local` (export ํ์)
- **์ค์ **: `~/.config/.jira/.config.yml`
- **๊ธฐ๋ณธ ํ๋ก์ ํธ**: MAT (๊ฒฝ๋ Matter)
- **์ฌ์ฉ์**: jhkim2@goqual.com
## ํ์: ํ๊ฒฝ๋ณ์ ๋ก๋
**๋ชจ๋ ๋ช
๋ น ์ ์ ๋ฐ๋์ `source ~/.env.local`์ ์คํํ๋ค.**
```bash
source ~/.env.local && jira <command>
```
## ํ๋ก์ ํธ ๋ชฉ๋ก (์ฃผ์)
| KEY | ์ด๋ฆ | ํ์
|
|-----|------|------|
| MAT | ๊ฒฝ๋ Matter | classic (kanban) |
| DEVT | ๊ฐ๋ฐํ | classic |
| IOT | IOTWORKS | classic |
| GP1 | ํค์ดํ B2C ์ฑ ๊ฐ๋ฐ | classic |
| B2BVOC | [B2B] Hejhome VOC | classic |
| GOQUALPRJ | Goqual Project | classic |
## ์ด์ ์กฐํ
```bash
# ๊ธฐ๋ณธ ํ๋ก์ ํธ(MAT) ์ด์ ๋ชฉ๋ก
source ~/.env.local && jira issue list --plain
# ๋ค๋ฅธ ํ๋ก์ ํธ ์ด์
source ~/.env.local && jira issue list -p DEVT --plain
# ๋์๊ฒ ํ ๋น๋ ์ด์
source ~/.env.local && jira issue list -a$(jira me) --plain
# ์ํ๋ณ ํํฐ
source ~/.env.local && jira issue list -s"๊ฐ๋ฐ ์งํ ์ค" --plain
# JQL ์ง์ ์ฌ์ฉ
source ~/.env.local && jira issue list -q"summary ~ Matter" --plain
# ์ด์ ์์ธ ๋ณด๊ธฐ
source ~/.env.local && jira issue view MAT-77 --plain
# ์ต๊ทผ ์์ฑ๋ ์ด์
source ~/.env.local && jira issue list --created month --plain
# ํน์ ๋ด๋น์
source ~/.env.local && jira issue list -a"ํ์น์ฐ" --plain
```
## ์ด์ ์์ฑ/์์
```bash
# ์ด์ ์์ฑ (์ธํฐ๋ํฐ๋ธ โ ์์ด์ ํธ์์๋ ๋น์ถ์ฒ)
source ~/.env.local && jira issue create
# ์ด์ ์ํ ๋ณ๊ฒฝ (move)
source ~/.env.local && jira issue move MAT-77 "๊ฐ๋ฐ ์๋ฃ"
# ์ด์ ํ ๋น
source ~/.env.local && jira issue assign MAT-77 "jhkim2@goqual.com"
# ์ฝ๋ฉํธ ์ถ๊ฐ
source ~/.env.local && jira issue comment add MAT-77 "์ฝ๋ฉํธ ๋ด์ฉ"
# ๋ธ๋ผ์ฐ์ ์์ ์ด๊ธฐ
source ~/.env.local && jira open MAT-77
```
## ๋ณด๋/์คํ๋ฆฐํธ
```bash
# ๋ณด๋ ๋ชฉ๋ก
source ~/.env.local && jira board list
# ์คํ๋ฆฐํธ ๋ชฉ๋ก (scrum ๋ณด๋๋ง)
source ~/.env.local && jira sprint list
# ์ํฝ ๋ชฉ๋ก
source ~/.env.local && jira epic list --plain
```
## ํ๋ก์ ํธ ๊ด๋ฆฌ
```bash
# ์ ์ฒด ํ๋ก์ ํธ ๋ชฉ๋ก
source ~/.env.local && jira project list
# ์๋ฒ ์ ๋ณด
source ~/.env.local && jira serverinfo
# ๋ด ๊ณ์
source ~/.env.local && jira me
```
## ์ถ๋ ฅ ํฌ๋งท
- `--plain`: ํญ ๊ตฌ๋ถ ํ
์คํธ ์ถ๋ ฅ (ํ์ฑ/์คํฌ๋ฆฝํ
์ฉ). **์์ด์ ํธ์์๋ ํญ์ --plain ์ฌ์ฉ ๊ถ์ฅ.**
- ๊ธฐ๋ณธ: ์ธํฐ๋ํฐ๋ธ TUI (ํฐ๋ฏธ๋ ์ง์ ์ฌ์ฉ ์)
- `issue view`๋ `--plain` ์์ด๋ ์์ธ ์ถ๋ ฅ
## ์ ์ฉํ ์กฐํฉ ์์
```bash
# ํ๋ก์ ํธ๋ณ ์ํ ์์ฝ
source ~/.env.local && jira issue list -p MAT --plain | tail -n +2 | awk -F'\t' '{print $NF}' | sort | uniq -c | sort -rn
# ์งํ ์ค์ธ ๋ด ์ด์๋ง
source ~/.env.local && jira issue list -a$(jira me) -s"๊ฐ๋ฐ ์งํ ์ค" --plain
# ์ด๋ฒ ์ฃผ ์์ฑ๋ ์ด์
source ~/.env.local && jira issue list --created week --plain
```
## ๋ค๋ฅธ ํ๋ก์ ํธ๋ก ์ ํ
`-p` ํ๋๊ทธ๋ก ํ๋ก์ ํธ๋ฅผ ์ง์ ํ๊ฑฐ๋, ์ค์ ํ์ผ์ `project.key`๋ฅผ ๋ณ๊ฒฝ:
```bash
# ํ๋๊ทธ๋ก ์์ ์ ํ
source ~/.env.local && jira issue list -p DEVT --plain
# ์ค์ ํ์ผ๋ก ์๊ตฌ ์ ํ
# ~/.config/.jira/.config.yml ์ project.key ์์
```
## Confluence URL โ Markdown
`scripts/confluence_ingest.py` โ Atlassian Cloud Confluence ํ์ด์ง(tinyLink ๋๋
์ ๊ท `/wiki/spaces/.../pages/<id>` URL)๋ฅผ ๋จ๋ฐฉํฅ์ผ๋ก ๊ฐ์ ธ์ YAML frontmatter
+ Markdown ๋ณธ๋ฌธ์ผ๋ก ์ ์ฅ. `JIRA_API_TOKEN`์ด Atlassian ํตํฉ ํ ํฐ์ด๋ผ ๋ณ๋
Confluence ํ ํฐ ๋ถํ์. **stdlib only** (urllib + base64 + regex), `pandoc` ํ์.
### ๋์ ์์ฝ
- URL ์
๋ ฅ (tinyLink resolve ํ pageId ์ถ์ถ)
- Confluence REST v2 (`/wiki/api/v2/pages/{id}?body-format=storage`) ํธ์ถ
- storage XHTML cleanup (`ac:`, `ri:`, `local-id`, `data-*` ๋ฉํ ์ ๊ฑฐ)
- pandoc `html โ gfm` ๋ณํ, NFC ์ ๊ทํ
- YAML frontmatter 7ํ๋ (title / source / source_id / source_version /
source_modified / fetched_at / tags) ๋ชจ๋ **KST ํ์**
- ๊ฐ์ path **๋ฎ์ด์ฐ๊ธฐ** (idempotent โ ์ํค ๊ฐฑ์ ์ ๊ฐ์ ํ์ผ ์ฌ์คํ)
- ๋ณธ๋ฌธ stdout ๋ฏธ๋
ธ์ถ โ ํ์ผ ๊ฒฝ๋ก + heading outline๋ง ์ถ๋ ฅ
### ์ฌ์ฉ๋ฒ
```bash
source ~/.env.local && python3 \
~/repos/gh/agent-config/skills/jiracli/scripts/confluence_ingest.py \
<URL> [--out DIR] [--filename NAME] [--tags t1,t2] [--format storage|view|export_view]
```
| ์ต์
| ๊ธฐ๋ณธ๊ฐ | ์ค๋ช
|
|------|--------|------|
| `--out` | cwd | ์ถ๋ ฅ ๋๋ ํ ๋ฆฌ |
| `--filename` | `confluence-<pageId>.md` | ํ์ผ๋ช
|
| `--tags` | (none) | ์ถ๊ฐ ํ๊ทธ, ์ฝค๋ง ๋ถ๋ฆฌ. ๊ธฐ๋ณธ `confluence` + ํธ์คํธ ํ๊ทธ(์ `goqualdev`)๋ ํญ์ ํฌํจ |
| `--format` | `storage` | Confluence body-format (`storage` / `view` / `export_view`) |
### ์ธ์ฆ
- `JIRA_API_TOKEN`: `~/.env.local`์ export ๊ฐ (Atlassian Cloud ํตํฉ ํ ํฐ)
- ์ฌ์ฉ์ ์ด๋ฉ์ผ: `~/.config/.jira/.config.yml`์ `login:` ํ๋์์ ์ถ์ถ
(๋๋ `JIRA_USER_EMAIL` env override)
### ํธ์ถ ์์ โ ์๋ฌธ ๋๋ฌธ์ ํ์ผ๋ช
์ผ๋ก repo ํ์ ์ ์ฅ
```bash
source ~/.env.local && python3 \
~/repos/gh/agent-config/skills/jiracli/scripts/confluence_ingest.py \
'<wiki-url-or-tinylink>' \
--out ~/repos/gh/<your-repo> \
--filename DOC.md \
--tags <topic>,<area>
```
โ `~/repos/gh/<your-repo>/DOC.md` ์์ฑ/๊ฐฑ์ . ํ์ค ์ถ๋ ฅ์ ํ์ผ ๊ฒฝ๋ก + heading
๊ตฌ์กฐ๋ง (๋ณธ๋ฌธ ๋ฏธ๋
ธ์ถ โ ๋ฏผ๊ฐ ํ์ด์ง ๊ฐ๋ฅ).
### ์ฃผ์
- ์๋ฐฉํฅ sync **์๋**. ๋จ๋ฐฉํฅ ๊ฐ์ ธ์ค๊ธฐ โ ๋ก์ปฌ ํธ์ง์ Confluence์ ๋ฐ์ ์๋จ.
- ๋ณธ๋ฌธ์ด ๋ฏผ๊ฐํ ์ ์์ โ ์คํฌ๋ฆฝํธ๋ stdout์ ๋ณธ๋ฌธ์ ํ ํ์ง ์์ง๋ง, ๊ฒฐ๊ณผ ํ์ผ์
๊ณต๊ฐ repo์ commitํ๊ธฐ ์ ๋ด์ฉ ํ์ธ ํ์.
- `pandoc`์ด ๋ชจ๋ฅด๋ Confluence macro๋ cleanup ์ ๊ท์์ผ๋ก ๋ฉํ๋ฐ์ดํฐ๋ง ๋จ๊ตฐ
๋ค ๋ณํ. ์ผ๋ถ macro ๋ณธ๋ฌธ์ plain text๋ก ๋จ๊ฑฐ๋ ๋๋ฝ๋ ์ ์์.
## Confluence ํ์ด์ง ์์ฑ/๊ฐฑ์ /์ญ์ (publish)
`scripts/confluence_publish.py` โ `confluence_ingest.py`(์ฝ๊ธฐ)์ **์ฐ๊ธฐ ์ง**.
`jira` CLI์ ingest๋ ์ฝ๊ธฐ๋ง ๋๋ฏ๋ก ํ์ด์ง **์์ฑ**์ REST v2 write ์๋ํฌ์ธํธ๊ฐ
ํ์ํ๋ค. ์ด ์คํฌ๋ฆฝํธ๊ฐ ๊ทธ๊ฑธ ๊ฐ์ผ๋ค โ **ํด๋ก๋์ฝ๋ ๋นํธ์ธ ํ๋ฌ๊ทธ์ธ ๋ถํ์**
(stdlib only, urllib + base64 + optional pandoc). ์ธ์ฆ์ ingest์ ๋์ผ
(`JIRA_API_TOKEN` + `~/.config/.jira/.config.yml` `login:`).
### ๋ณธ๋ฌธ ํฌ๋งท
- Confluence **storage XHTML**. `--body-file`๋ก storage HTML ์ง์ ์ ๋ฌ์ด ๊ฐ์ฅ ์ ํ.
- `--md` ์ฃผ๋ฉด markdown์ pandoc(gfmโhtml)์ผ๋ก ๋ณํ(YAML front matterยท`{#anchor}` ์๋ ์ ๊ฑฐ).
๋จ status lozengeยทinfo panel์ markdown์ผ๋ก ํํ ๋ถ๊ฐ โ storage ๋งคํฌ๋ก ์ง์ :
- status: `<ac:structured-macro ac:name="status"><ac:parameter ac:name="colour">Green</ac:parameter><ac:parameter ac:name="title">์๋ฃ</ac:parameter></ac:structured-macro>` (colour: Grey/Green/Yellow/Red/Blue)
- panel: `<ac:structured-macro ac:name="info"><ac:rich-text-body><p>โฆ</p></ac:rich-text-body></ac:structured-macro>`
- ํ์๋ผ์ธ ๋ฑ ํ๋ Confluence **๋ค์ดํฐ๋ธ `<table>`**. MermaidยทRoadmap Planner ๋งคํฌ๋ก๋
์คํ์ด์ค ๋ฏธ์ค์น/REST ๊ฑฐ๋ถ๋ผ ์ฐ์ง ์๋๋ค.
### ์ฌ์ฉ๋ฒ
```bash
# ์์ฑ โ ํด๋(parentId) ์๋, ์คํ์ด์ค๋ key๋ก
source ~/.env.local && python3 \
~/repos/gh/agent-config/skills/jiracli/scripts/confluence_publish.py \
--space-key CK7cJZ8jrCka --parent-id 264503298 \
--title "[์ฌ๋ด] ํ๋ก์ ํธ X ํํฉ" --body-file page.storage.html --json
# markdown ๋ณธ๋ฌธ ์๋ ๋ณํ
โฆ --title "โฆ" --body-file page.md --md
# ๊ฐฑ์ (version ์๋ +1)
โฆ --page-id 264339520 --title "โฆ" --body-file page.storage.html --message "ํ์๋ผ์ธ ๊ฐฑ์ "
# ์ญ์ (ํด์งํต) / ์๊ตฌ์ญ์
โฆ --page-id <ID> --delete # trash
โฆ --page-id <ID> --delete --purge # ์์ ์ ๊ฑฐ
```
| ์ต์
| ์ค๋ช
|
|------|------|
| `--title` | ํ์ด์ง ์ ๋ชฉ (์์ฑ/๊ฐฑ์ ํ์) |
| `--body-file` / `--body-html` | ๋ณธ๋ฌธ (storage HTML, ๋๋ `--md`์ ํจ๊ป markdown) |
| `--md` | ๋ณธ๋ฌธ์ markdown์ผ๋ก ๋ณด๊ณ pandoc ๋ณํ |
| `--space-key` / `--space-id` | ์คํ์ด์ค (key๋ ์๋์ผ๋ก id ์กฐํ) |
| `--parent-id` | ๋ถ๋ชจ ํ์ด์ง/ํด๋ id (๊ทธ ์๋ ์์ฑ) |
| `--page-id` | ๊ธฐ์กด ํ์ด์ง id โ **๊ฐฑ์ ** ๋ชจ๋ |
| `--delete` / `--purge` | ์ญ์ / ์๊ตฌ์ญ์ (v1 API โ v2 delete๋ 500 ๋จ์ด์ง) |
| `--message` | ๋ฒ์ ๋ฉ์์ง (๊ฐฑ์ ) |
| `--json` / `--dry-run` | JSON ์ถ๋ ฅ / API ํธ์ถ ์์ด payload๋ง |
### ๋์/๊ฒ์ฆ
- ์์ฑยท๊ฐฑ์ ํ page id๋ฅผ GETํด `parentType`/`parentId`/`version`์ ํจ๊ป ์ถ๋ ฅ.
- ํด๋ ์๋ ์์ฑ ๊ฒ์ฆ: ์ถ๋ ฅ `parentType: folder` ํ์ธ (ํด๋ ID ์์ฒด๋ page๊ฐ ์๋๋ผ GET ์ 404๊ฐ ์ ์).
- **์ญ์ ๋ v1 `/wiki/rest/api/content/{id}`** ์ฌ์ฉ โ v2 page delete๋ ์ด ์ฌ์ดํธ์์ HTTP 500.
### ์ฃผ์
- ๊ฒ์ = **ํ์ฌ ์ํค ๊ณต๊ฐ**. ๋๋๋ฆฌ๊ธฐ ์ฝ์ง ์์ผ๋ ๋ณธ๋ฌธ ํ์ ํ ์ฌ๋ฆฐ๋ค(smoke๋ throwaway ์์ฑโ`--delete --purge`).
- ํ ํฐยท์ด๋ฉ์ผ์ด ํ๊ฒฝ์ ์์ผ๋ฏ๋ก ๊ฒ์ ์คํฌ๋ฆฝํธ ๋ํผ๋ gitignore ์์ญ(`tmp/` ๋ฑ)์ ๋๋ค.
## ์ฃผ์์ฌํญ
1. **MAT ๋ณด๋๋ kanban** โ ์คํ๋ฆฐํธ ๋ช
๋ น์ scrum ๋ณด๋์์๋ง ๋์
2. **`--plain`์ issue list์์๋ง** โ project list, board list์๋ ๋ฏธ์ง์ (๊ธฐ๋ณธ์ด plain)
3. **์ธํฐ๋ํฐ๋ธ ๋ช
๋ น ์ฃผ์** โ `issue create`๋ ์๋ํฐ๋ฅผ ์ด๋ฏ๋ก ์์ด์ ํธ์์ ์ฌ์ฉ ์ ์ฃผ์
4. **์ํ๋ช
์ ํ๊ธ** โ `"๊ฐ๋ฐ ์งํ ์ค"`, `"๊ฐ๋ฐ ์๋ฃ"`, `"๋๊ธฐ & ๋ด๋น ์ง์ "` ๋ฑ ๋ฐ์ดํ ํ์
Ver en GitHub