|
| 1 | +# Brainstorm: CLI Update Notifier |
| 2 | + |
| 3 | +**Date:** 2026-03-09 |
| 4 | +**Status:** Draft |
| 5 | + |
| 6 | +## What We're Building |
| 7 | + |
| 8 | +chromaport ์คํ ์ ์ ๋ฒ์ ์ด ์ถ์๋์๋์ง ํ์ธํ๊ณ , ์
๋ฐ์ดํธ๊ฐ ์์ผ๋ฉด ์คํ ์๋ฃ ํ ํ๋จ์ ์๋ด ๋ฉ์์ง๋ฅผ ํ์ํ๋ ๊ธฐ๋ฅ. gh CLI, yarn, oh-my-zsh ๋ฑ์ด ์ ๊ณตํ๋ ๊ฒ๊ณผ ๋์ผํ ํจํด. |
| 9 | + |
| 10 | +**์์ ์ถ๋ ฅ:** |
| 11 | +``` |
| 12 | + โ One Monokai โ ~/.superset/app-state.json |
| 13 | +
|
| 14 | +A new release of chromaport is available: 0.2.0 โ 0.3.0 |
| 15 | +To update, run: brew upgrade chromaport |
| 16 | +https://github.com/hamsurang/chromaport/releases/tag/v0.3.0 |
| 17 | +``` |
| 18 | + |
| 19 | +## Why This Approach |
| 20 | + |
| 21 | +### GitHub Releases API |
| 22 | + |
| 23 | +- chromaport๋ ์ด๋ฏธ GitHub Releases + cargo-dist๋ก ๋ฐฐํฌ ์ค |
| 24 | +- `https://api.github.com/repos/hamsurang/chromaport/releases/latest` ํ ๋ฒ์ GET ์์ฒญ์ผ๋ก ์ต์ ๋ฒ์ ์กฐํ ๊ฐ๋ฅ |
| 25 | +- crates.io๋ณด๋ค Homebrew ๋ฆด๋ฆฌ์ค์ ๋๊ธฐํ๊ฐ ์ ํํจ |
| 26 | +- ์ธ์ฆ ๋ถํ์ (public repo) |
| 27 | + |
| 28 | +### 24์๊ฐ ์ฃผ๊ธฐ ์ฒดํฌ |
| 29 | + |
| 30 | +- ๋งค ์คํ๋ง๋ค ๋คํธ์ํฌ ์์ฒญ์ ๋ณด๋ด์ง ์์ ์ฑ๋ฅ ์ํฅ ์ต์ํ |
| 31 | +- ๋ก์ปฌ ์บ์ ํ์ผ์ ๋ง์ง๋ง ์ฒดํฌ ํ์์คํฌํ + ์ต์ ๋ฒ์ ์ ์ฅ |
| 32 | +- ์บ์ ์์น: `~/.chromaport/update-check.json` ๋๋ `dirs::cache_dir()` |
| 33 | +- gh CLI๊ฐ ๋์ผํ ํจํด ์ฌ์ฉ |
| 34 | + |
| 35 | +### ์คํ ๋ ํ๋จ ํ์ |
| 36 | + |
| 37 | +- ํต์ฌ ์์
ํ๋ฆ์ ๋ฐฉํดํ์ง ์์ |
| 38 | +- ์ฌ์ฉ์๊ฐ ์์
๊ฒฐ๊ณผ๋ฅผ ๋จผ์ ํ์ธํ ๋ค ์
๋ฐ์ดํธ ์๋ด๋ฅผ ๋ด |
| 39 | +- stderr๊ฐ ์๋ stdout์ผ๋ก ์ถ๋ ฅ (์ธํฐ๋ํฐ๋ธ CLI์ด๋ฏ๋ก ํ์ดํ๋ผ์ธ ์ฐ๋ ค ๋ฎ์) |
| 40 | + |
| 41 | +### ์คํ๋ผ์ธ/์คํจ ์ ์กฐ์ฉํ ์คํต |
| 42 | + |
| 43 | +- ์
๋ฐ์ดํธ ์ฒดํฌ๋ ๋ถ๊ฐ ๊ธฐ๋ฅ์ด๋ฏ๋ก ํต์ฌ ๊ธฐ๋ฅ์ ์ ๋ ๋ฐฉํดํ์ง ์์ |
| 44 | +- ํ์์์ ์งง๊ฒ ์ค์ (2-3์ด) |
| 45 | +- ๋คํธ์ํฌ ์ค๋ฅ ์ ์๋ฌ ๋ฉ์์ง ์์ด ์ ์ ์งํ |
| 46 | + |
| 47 | +## Key Decisions |
| 48 | + |
| 49 | +| ๊ฒฐ์ | ์ ํ | ๊ทผ๊ฑฐ | |
| 50 | +|------|------|------| |
| 51 | +| ๋ฒ์ ์์ค | GitHub Releases API | ๋ฐฐํฌ ํ์ดํ๋ผ์ธ๊ณผ ์ผ์น, ์ธ์ฆ ๋ถํ์ | |
| 52 | +| ์ฒดํฌ ์ฃผ๊ธฐ | 24์๊ฐ ์บ์ | ๋คํธ์ํฌ ๋ถํ ์ต์ํ, gh CLI ํจํด | |
| 53 | +| ํ์ ์์น | ์คํ ์๋ฃ ํ ํ๋จ | ์์
ํ๋ฆ ๋น์นจํด | |
| 54 | +| ์คํ๋ผ์ธ ๋์ | ์กฐ์ฉํ ์คํต | ๋ถ๊ฐ ๊ธฐ๋ฅ์ด ํต์ฌ ๊ธฐ๋ฅ ๋ฐฉํด ๊ธ์ง | |
| 55 | +| HTTP ํด๋ผ์ด์ธํธ | ureq | ๊ฒฝ๋, blocking, async ๋ฐํ์ ๋ถํ์ | |
| 56 | +| ์บ์ ์์น | `dirs::cache_dir()/chromaport/` | XDG ๊ท๊ฒฉ ์ค์, OS ๊ด๋ก ๋ฐ๋ฆ | |
| 57 | +| ์์ฒด ์
๋ฐ์ดํธ | `chromaport update` ์๋ธ์ปค๋งจ๋ | ์ค์น ๊ฒฝ๋ก ๊ฐ์ง ํ ์ ์ ํ ๋ช
๋ น์ด ๋์ ์คํ | |
| 58 | + |
| 59 | +## Implementation Sketch (High-Level) |
| 60 | + |
| 61 | +1. **์บ์ ํ์ผ ๊ด๋ฆฌ** โ ๋ง์ง๋ง ์ฒดํฌ ์๊ฐ + ์ต์ ๋ฒ์ ์ `dirs::cache_dir()/chromaport/update-check.json`์ ์ ์ฅ |
| 62 | +2. **GitHub API ํธ์ถ** โ `releases/latest` ์๋ํฌ์ธํธ์์ `tag_name` ํ์ฑ (ureq, ํ์์์ 3์ด) |
| 63 | +3. **๋ฒ์ ๋น๊ต** โ semver ๋น๊ต๋ก ํ์ฌ < ์ต์ ์ด๋ฉด ์๋ฆผ ํ๋๊ทธ ์ค์ |
| 64 | +4. **์๋ฆผ ์ถ๋ ฅ** โ main ์์
์๋ฃ ํ ์กฐ๊ฑด๋ถ๋ก ์
๋ฐ์ดํธ ์๋ด ๋ฉ์์ง ์ถ๋ ฅ |
| 65 | +5. **`chromaport update` ์๋ธ์ปค๋งจ๋** โ ์ค์น ๊ฒฝ๋ก ๊ฐ์ง(Homebrew prefix / cargo) ํ ์ ์ ํ ์
๋ฐ์ดํธ ๋ช
๋ น์ด ์คํ |
| 66 | +6. **๋นํ์ฑํ ์ต์
** โ `CHROMAPORT_NO_UPDATE_CHECK=1` ํ๊ฒฝ ๋ณ์๋ก ๋๊ธฐ |
| 67 | + |
| 68 | +### `chromaport update` ๋์ |
| 69 | + |
| 70 | +``` |
| 71 | +$ chromaport update |
| 72 | +Checking for updates... |
| 73 | +Updating chromaport 0.2.0 โ 0.3.0 |
| 74 | +โ Updated successfully! |
| 75 | +``` |
| 76 | + |
| 77 | +์ค์น ๊ฒฝ๋ก ๊ฐ์ง ์ ๋ต: |
| 78 | +- Homebrew: `brew --prefix chromaport` ์ฑ๊ณต ์ฌ๋ถ๋ก ํ๋จ โ `brew upgrade chromaport` ์คํ |
| 79 | +- Cargo: `cargo install --list | grep chromaport` ํ์ธ โ `cargo install chromaport` ์คํ |
| 80 | +- ๊ฐ์ง ์คํจ ์: ์๋ ์
๋ฐ์ดํธ ์๋ด + ๋ฆด๋ฆฌ์ฆ URL ํ์ |
| 81 | + |
| 82 | +## Resolved Questions |
| 83 | + |
| 84 | +- **HTTP ํด๋ผ์ด์ธํธ**: `ureq` ์ ํ. ๊ฒฝ๋ blocking ํด๋ผ์ด์ธํธ๋ก ๊ธฐ์กด ๋๊ธฐ CLI์ ์์ฐ์ค๋ฝ๊ฒ ๋ง์. |
| 85 | +- **์บ์ ์์น**: `dirs::cache_dir()/chromaport/` ์ ํ. XDG ๊ท๊ฒฉ ์ค์, OS ๊ด๋ก ๋ฐ๋ฆ. |
| 86 | +- **์
๋ฐ์ดํธ ๋ฐฉ์**: `chromaport update` ์์ฒด ์
๋ฐ์ดํธ ์๋ธ์ปค๋งจ๋ ์ ๊ณต. ์ค์น ๊ฒฝ๋ก๋ฅผ ์๋ ๊ฐ์งํ์ฌ ์ ์ ํ ๋ช
๋ น์ด(brew upgrade / cargo install)๋ฅผ ๋์ ์คํ. |
0 commit comments