| 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์ ์คํํ๋ค.
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 |
์ด์ ์กฐํ
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
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
์ด์ ์์ฑ/์์
source ~/.env.local && jira issue create
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
๋ณด๋/์คํ๋ฆฐํธ
source ~/.env.local && jira board list
source ~/.env.local && jira sprint list
source ~/.env.local && jira epic list --plain
ํ๋ก์ ํธ ๊ด๋ฆฌ
source ~/.env.local && jira project list
source ~/.env.local && jira serverinfo
source ~/.env.local && jira me
์ถ๋ ฅ ํฌ๋งท
--plain: ํญ ๊ตฌ๋ถ ํ
์คํธ ์ถ๋ ฅ (ํ์ฑ/์คํฌ๋ฆฝํ
์ฉ). ์์ด์ ํธ์์๋ ํญ์ --plain ์ฌ์ฉ ๊ถ์ฅ.
- ๊ธฐ๋ณธ: ์ธํฐ๋ํฐ๋ธ TUI (ํฐ๋ฏธ๋ ์ง์ ์ฌ์ฉ ์)
issue view๋ --plain ์์ด๋ ์์ธ ์ถ๋ ฅ
์ ์ฉํ ์กฐํฉ ์์
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๋ฅผ ๋ณ๊ฒฝ:
source ~/.env.local && jira issue list -p DEVT --plain
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๋ง ์ถ๋ ฅ
์ฌ์ฉ๋ฒ
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 ํ์ ์ ์ฅ
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 ๊ฑฐ๋ถ๋ผ ์ฐ์ง ์๋๋ค.
์ฌ์ฉ๋ฒ
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
โฆ --title "โฆ" --body-file page.md --md
โฆ --page-id 264339520 --title "โฆ" --body-file page.storage.html --message "ํ์๋ผ์ธ ๊ฐฑ์ "
โฆ --page-id <ID> --delete
โฆ --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/ ๋ฑ)์ ๋๋ค.
์ฃผ์์ฌํญ
- MAT ๋ณด๋๋ kanban โ ์คํ๋ฆฐํธ ๋ช
๋ น์ scrum ๋ณด๋์์๋ง ๋์
--plain์ issue list์์๋ง โ project list, board list์๋ ๋ฏธ์ง์ (๊ธฐ๋ณธ์ด plain)
- ์ธํฐ๋ํฐ๋ธ ๋ช
๋ น ์ฃผ์ โ
issue create๋ ์๋ํฐ๋ฅผ ์ด๋ฏ๋ก ์์ด์ ํธ์์ ์ฌ์ฉ ์ ์ฃผ์
- ์ํ๋ช
์ ํ๊ธ โ
"๊ฐ๋ฐ ์งํ ์ค", "๊ฐ๋ฐ ์๋ฃ", "๋๊ธฐ & ๋ด๋น ์ง์ " ๋ฑ ๋ฐ์ดํ ํ์