AI ๊ธฐ๋ฐ Git ์ปค๋ฐ ๋ฉ์์ง ์๋ ์์ฑ ๋๊ตฌ
staged ๋ git diff ๋ฅผ ๋ถ์ํ์ฌ Conventional Commit ํ์์ ๋ฉ์์ง๋ฅผ ์๋์ผ๋ก ์์ฑํฉ๋๋ค.
Google Gemini, Groq (Llama), OpenAI, Anthropic Claude, Ollama (๋ก์ปฌ) ๋ฅผ ์ง์ํ๋ฉฐ, ํ๊ตญ์ด์ ์์ด ์ถ๋ ฅ์ ๋ชจ๋ ์ ๊ณตํฉ๋๋ค.
๋จ ๋ ๋จ๊ณ๋ก ๋ชจ๋ ์ค์ ์ด ์๋ฃ๋ฉ๋๋ค.
npm install -g smart-msgNote
Node.js 18 ์ด์์ด ํ์ํฉ๋๋ค. nvm ์ฌ์ฉ์๋ผ๋ฉด nvm use 24 ๊ถ์ฅ.
sm login๋ค์ ํญ๋ชฉ์ ์ฐจ๋ก๋ก ์ ํํฉ๋๋ค.
| ๋จ๊ณ | ํญ๋ชฉ | ์ ํ์ง |
|---|---|---|
| 1 | ์ธ์ด (Language) | English (๊ธฐ๋ณธ) / ํ๊ตญ์ด โ ์ดํ ๋ชจ๋ prompt ๊ฐ ์ ํ ์ธ์ด๋ก ์งํ |
| 2 | AI provider | Google Gemini (๋ฌด๋ฃ, ๊ธฐ๋ณธ) / Groq / OpenAI / Claude / Ollama (๋ก์ปฌ) |
| 3 | ๋ชจ๋ธ | provider ๋ณ ๊ถ์ฅ ๋ชจ๋ธ ๋ชฉ๋ก |
| 4 | ๋ฉ์์ง ๊ฐ๋ | simple / middle / hard |
| 5 | API ํค | ์๋์ผ๋ก ์ด๋ฆฐ ๋ฐ๊ธ ํ์ด์ง์์ ๋ฐ๊ธ ํ ์ ๋ ฅ (Ollama ๋ ํค ๋ถํ์) |
| 6 | ๊ธ๋ก๋ฒ hook ์ค์น ์ฌ๋ถ | Yes ๊ถ์ฅ (๋ชจ๋ git ์ ์ฅ์์์ ์๋) |
Note
์ฒซ ๋จ๊ณ์ ์ธ์ด ์ ํ ํ๋ฉด์ ํญ์ ์์ด๋ก ํ์๋ฉ๋๋ค. ํ๊ตญ์ด๋ฅผ ์ ํํ์๋ฉด ์ดํ์ ๋ชจ๋ prompt ๊ฐ ํ๊ตญ์ด๋ก ์๋ ์ ํ๋ฉ๋๋ค.
์ค์ ์ ~/.smart-msg/config.json ์ ์ ์ฅ๋๋ฉฐ, ๋ชจ๋ ํ๋ก์ ํธ์์ ๋์ผํ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค.
Tip
6 ๋จ๊ณ์ ๊ธ๋ก๋ฒ hook ์ ์ค์นํ๋ฉด ๋ณ๋์ ์ถ๊ฐ ์์ ์์ด ๋ชจ๋ git ์ ์ฅ์์์ ์๋ ๋ฉ์์ง ์์ฑ์ด ๋์ํฉ๋๋ค. ํ๋ก์ ํธ๋ง๋ค ๋ฐ๋ก ์ค์ ํ ํ์๊ฐ ์์ต๋๋ค.
| Provider | ๋น์ฉ | ํค ๋ฐ๊ธ | ์ถ์ฒ ๋์ |
|---|---|---|---|
| Groq (Llama) โญ | ๋ฌด๋ฃ ํฐ์ด ์ ๊ณต | Groq Console (์นด๋ ๋ฑ๋ก ๋ถํ์) | ๋ฌด๋ฃ ์ฌ์ฉ ๊ถ์ฅ โ ์์ฒด LPU ์ธํ๋ผ๋ก 503 ๊ฑฐ์ ์์ + ๋งค์ฐ ๋น ๋ฆ |
| Google Gemini | ๋ฌด๋ฃ ํฐ์ด ์ ๊ณต | Google AI Studio (์นด๋ ๋ฑ๋ก ๋ถํ์) | ๋ฌด๋ฃ ํฐ์ด ํธ๋ํฝ์ด ๋ชฐ๋ฆฌ๋ฉด 503 ์์ฃผ ๋ฐ์ํ ์ ์์ |
| Ollama (๋ก์ปฌ) ๐ | ์์ ๋ฌด๋ฃ (๋ก์ปฌ) | ํค ๋ถํ์ | ์ธํฐ๋ท ๋จ์ / ํ์ฌ ๋ณด์ ํ๊ฒฝ โ ์ฝ๋๊ฐ ์ธ๋ถ๋ก ๋๊ฐ์ง ์์ |
| OpenAI (GPT) | ์ฌ์ฉ๋๋งํผ ๊ณผ๊ธ (์ ๋ฃ) | OpenAI Platform (์นด๋ ๋ฑ๋ก ํ์) | OpenAI ์ํ๊ณ๋ฅผ ์ด๋ฏธ ์ฌ์ฉ ์ค์ธ ๊ฒฝ์ฐ |
| Anthropic Claude | ์ฌ์ฉ๋๋งํผ ๊ณผ๊ธ (์ ๋ฃ) | Anthropic Console (์นด๋ ๋ฑ๋ก ํ์) | Claude ์ ๋ฉ์์ง ํ์ง์ ์ ํธํ๋ ๊ฒฝ์ฐ |
Important
ChatGPT Plus / Claude Max ๋ฑ ๊ตฌ๋ ๊ฒฐ์ ๋ก๋ API ํธ์ถ์ด ๋์ํ์ง ์์ต๋๋ค. ๊ตฌ๋ ์ํ๊ณผ ๊ฐ๋ฐ์ API ๋ ๊ฒฐ์ ์์คํ ์ด ๋ถ๋ฆฌ๋์ด ์์ผ๋ฉฐ, OpenAI / Claude ๋ฅผ ์ฌ์ฉํ์๋ ค๋ฉด ์ฝ์์์ ๋ณ๋๋ก ์นด๋ ๋ฑ๋ก ๋๋ ํฌ๋ ๋ง ์ถฉ์ ์ด ํ์ํฉ๋๋ค. ๋ฌด๋ฃ๋ก ์ฌ์ฉํ์๋ ค๋ฉด Groq, Google Gemini, ๋๋ Ollama ๋ฅผ ์ ํํ์๊ธฐ ๋ฐ๋๋๋ค.
Note
Gemini ๋ฌด๋ฃ ํฐ์ด๋ ์ธ๊ธฐ ๋ง์ ์๊ฐ๋์ 503 (high demand) ์๋ต์ด ์์ฃผ ๋ฐ์ํ ์ ์์ต๋๋ค. ์๋ ์ฌ์๋๊ฐ ์ ์ฉ๋์ด ์๊ธด ํ์ง๋ง ๋น๋๊ฐ ๋๋ค๋ฉด Groq ์ผ๋ก ์ ํ์ ๊ถ์ฅํฉ๋๋ค (sm login ๋ค์ ์คํ). ๋๋ sm config โ fallback ์์ Groq ์ ํด๋ฐฑ์ผ๋ก ๋ฑ๋กํด๋์๋ฉด, Gemini ์คํจ ์ ์๋์ผ๋ก Groq ์ผ๋ก ์ ํํฉ๋๋ค.
Ollama ๋ ๋ก์ปฌ์ LLM ์ ์คํํ๋ ๋๊ตฌ์ ๋๋ค. ์ฝ๋๊ฐ ์ธ๋ถ ์๋ฒ๋ก ์ ์ก๋์ง ์์ผ๋ฏ๋ก ํ์ฌ ๋ณด์ ํ๊ฒฝ์ ์ ํฉํฉ๋๋ค.
# 1) Ollama ์ค์น (https://ollama.com)
# 2) ๋ชจ๋ธ ๋ฏธ๋ฆฌ ๋ฐ๊ธฐ
ollama pull llama3.2
# 3) smart-msg ๋ฑ๋ก
sm login # provider ์ ํ์์ 'Ollama' ์ ํ, ๋ชจ๋ธ์ llama3.2 ์
๋ ฅ๊ธฐ๋ณธ endpoint ๋ http://localhost:11434 ์ด๋ฉฐ, ์๊ฒฉ Ollama ์๋ฒ๋ฅผ ์ฌ์ฉํ์๋ ค๋ฉด sm config โ baseUrl ์์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
์ค์น์ ๋ก๊ทธ์ธ์ด ์๋ฃ๋์๋ค๋ฉด, ์ดํ์ ์ฌ์ฉ์ ํ์ git ์ฌ์ฉ๊ณผ ๋์ผํฉ๋๋ค.
git add .
git commitgit commit ๋ช
๋ น์ ์คํํ๋ฉด AI ๊ฐ staged ๋ ๋ณ๊ฒฝ๋ถ์ ๋ถ์ํ์ฌ ๋ฉ์์ง๋ฅผ ์๋์ผ๋ก ์ฑ์์ค๋๋ค. ์๋ํฐ(๋๋ IDE ์ปค๋ฐ ์ฐฝ)์์ ๋ฉ์์ง๋ฅผ ๊ฒํ ํ ๋ค ๊ทธ๋๋ก commit ํ๊ฑฐ๋ ์์ ํ์ฌ commit ํฉ๋๋ค.
$ git add .
$ git commit
# ์๋ํฐ(๋๋ IDE ์ปค๋ฐ ์ฐฝ)์ ๋ค์ ๋ฉ์์ง๊ฐ ์๋ ์
๋ ฅ๋ฉ๋๋ค.
feat(auth): add OAuth login flow
IDE ์ปค๋ฐ ์ฐฝ ๋์ ํฐ๋ฏธ๋์์ ์ฆ์ ๋ฉ์์ง๋ฅผ ์์ฑํ๊ณ commit ๊น์ง ํ ๋ฒ์ ์งํํ๋ ค๋ฉด ๋ค์์ ์ฌ์ฉํฉ๋๋ค.
git add .
sm c$ sm c
์์ฑ๋ ์ปค๋ฐ ๋ฉ์์ง:
feat(auth): add OAuth login flow
y: ๊ทธ๋๋ก commit
r: ๋ฉ์์ง ๋ค์ ์์ฑ
e: ์๋ํฐ๋ก ์ด์ด ์์ ํ commit
n: ์ทจ์
? ์ด ๋ฉ์์ง๋ก ์ปค๋ฐ์ ์งํํ์๊ฒ ์ต๋๊น? [Y/r/e/n]
y(๋๋ Enter) โ ๊ทธ๋๋ก commitrโ AI ๊ฐ ๋ค์ ๋ฉ์์ง ์์ฑ (์ต๋ 5ํ)eโ$EDITOR(๋๋ git core.editor) ๋ก ๋ฉ์์ง๋ฅผ ์ด์ด ์์ ํ commitnโ ์ทจ์
sm c --dry-run ์ ์ฌ์ฉํ๋ฉด commit ์์ด ๋ฉ์์ง๋ง ์์ฑํ์ฌ ์ถ๋ ฅํฉ๋๋ค.
| ๋ช ๋ น | ์ค๋ช |
|---|---|
sm login |
์ต์ด ์ค์ (์ธ์ด, provider, ๋ชจ๋ธ, ๊ฐ๋, ํค, ๊ธ๋ก๋ฒ hook) |
sm c (= sm commit) |
staged diff ๋ก ๋ฉ์์ง๋ฅผ ์์ฑํ๊ณ ์ฆ์ commit (y/r/e/n ์ ํ) |
sm c --dry-run |
commit ์์ด ๋ฉ์์ง๋ง ์์ฑํ์ฌ ์ถ๋ ฅ |
sm c --intent "..." |
์ด๋ฒ ๋ณ๊ฒฝ์ "์" ํ ์ค์ ๋ช ์ (1.3.0+) |
sm c --skip-risk |
์ํ๋ ํ๊ฐ/confirm ๊ฑด๋๋ (1.3.0+) |
sm c --skip-revert |
revert ๊ฐ์ง ๊ฑด๋๋ (1.3.0+) |
sm v (= sm voice) |
์์ฑ ๋ น์ โ Whisper ์ ์ฌ โ intent โ commit (1.3.0+) |
sm v --file <path> |
๋ฏธ๋ฆฌ ๋ น์ํ ์ค๋์ค ํ์ผ๋ก ์ ์ฌ (1.3.0+) |
sm pr [--base <ref>] |
ํ์ฌ ๋ธ๋์น์ base..HEAD ๋ณ๊ฒฝ์ผ๋ก PR ๋ณธ๋ฌธ (Summary + Test plan) ์์ฑ |
sm amend |
๋ง์ง๋ง commit ์ ๋ฉ์์ง๋ฅผ AI ๋ก ์ฌ์์ฑํ์ฌ amend |
sm split [--no-ai] |
ํฐ staged diff ๋ถํ ์ ์ โ ๋ก์ปฌ ํด๋ฆฌ์คํฑ + AI ๋ ์ ์ (1.3.0+ ๋ก์ปฌ ์ถ๊ฐ) |
sm style learn / show / clear |
์ ์ฅ์ commit ์คํ์ผ ํ์ต โ prompt ์๋ ๋ฐ์ (1.3.0+) |
sm config |
์ธ์ด/๊ฐ๋/๋ชจ๋ธ/ํค/gitmoji/autoIssue/fallback/verbose/baseUrl/intent/risk/revert/privacy ๋ณ๊ฒฝ |
sm status |
ํ์ฌ ์ ์ฅ๋ ์ค์ + ๋ฒ์ (ํ์ฌ/์ต์ ) ๋น๊ต ์ถ๋ ฅ |
sm update |
npm registry ์ ์ต์ ๋ฒ์ ์ผ๋ก ์์ฒด ์ ๋ฐ์ดํธ |
sm logout |
์ ์ฅ๋ API ํค ์ ๊ฑฐ (๋ค๋ฅธ ์ค์ /hook ์ ๋ณด๋ ๋ณด์กด) |
sm uninstall |
๋ชจ๋ ์ค์ ๋ฐ hook ์ ๊ฑฐ |
sm completion <shell> |
์ ธ ์๋์์ฑ ๋ฑ๋ก ์คํฌ๋ฆฝํธ ์ถ๋ ฅ (bash/zsh/powershell/clink) |
sm help [command] |
๋์๋ง ์ถ๋ ฅ. ํน์ ๋ช
๋ น์ ์ธ์๋ก ์ฃผ๋ฉด ๊ทธ ๋ช
๋ น์ ์์ธ ๋์๋ง (์: sm help commit) |
# ์๋ base ํ์ง (origin/main โ main โ master โ develop ์)
sm pr
# ํน์ base ์ง์
sm pr --base origin/develop
# gh CLI ์ ํ์ดํ ์ฐ๊ฒฐ๋ก ๋ฐ๋ก PR ์์ฑ
sm pr | gh pr create --body-file -# ๋ง์ง๋ง commit ๋ฉ์์ง๊ฐ ๋ง์์ ์ ๋ค ๋ (push ์ )
sm amend
# โ ๋ง์ง๋ง commit ์ diff ๋ก ์ ๋ฉ์์ง๋ฅผ AI ๊ฐ ์์ฑ
# โ y/r/e/n ์ ํ ํ git commit --amend1.3.0 ์ commit ์ํฌํ๋ก์ฐ ์์ฒด๋ฅผ ํ ๋จ๊ณ ๋ฐ์ ์ํค๋ 7 ๊ฐ์ง ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ต๋๋ค. ๋ชจ๋ ๊ธฐ๋ณธ๊ฐ์์ ๋น์ฐจ๋จ์ฑ (์๋ด๋ง, ์ฌ์ฉ์ ํ๋ฆ ๋์ง ์์) ์ด๊ณ ์ต์ ์ผ๋ก ๋๊ฑฐ๋ ๊ฐํํ ์ ์์ต๋๋ค.
diff ๋ง ๋ถ์ํ๋ฉด "๋ฌด์์ ๋ฐ๊ฟจ๋์ง" ๋ ์ ์ก์ง๋ง "์" ๋ ์กํ์ง ์์ต๋๋ค. sm c ๊ฐ ๋ฉ์์ง ์์ฑ ์ง์ ํ ์ค ์๋๋ฅผ ๋ฐ์ prompt ์ ๋ณ๋ ๋ธ๋ก์ผ๋ก ์ฃผ์
ํฉ๋๋ค.
sm c # ์ธํฐ๋ํฐ๋ธ prompt (๋น Enter ๋ก ์คํต)
sm c --intent "IE ๋ก๊ทธ์ธ ๋ฃจํ ์์ " # ์ธ๋ผ์ธ ๋ช
์
sm c --no-intent # prompt ๊ฐ์ ์คํต (always ๋ชจ๋๋ ์ฐํ)
SM_INTENT="..." sm c # non-TTY (hook/CI) ํ๊ฒฝ์ฉsm config โ captureIntent: ask (๊ธฐ๋ณธ) / always (ํ์) / never
staged diff ์ ์ํฅ๋๋ฅผ ํด๋ฆฌ์คํฑ์ผ๋ก 1~5์ ํ๊ฐ. DB migration, prod env, CI ์ค์ , ํฐ diff ๋ฑ์ด ๊ฐ์ฐ. ๊ธ์์ผ 18์+ / ์ฃผ๋ง / ์ผ๊ฐ (22:00~06:00) ์ ๋ณ๋ ์๊ฐ๋ ๊ฒฝ๊ณ .
์ํ๋ ํ๊ฐ:
์ ์ : โ
โ
โ
โ
โ (4/5)
- DB migration
- CI/CD config
์๊ฐ๋ : โ ์ํ ์๊ฐ๋ (Friday 18:00+)
๊ณ ์ํ ๋ณ๊ฒฝ์
๋๋ค. ๊ทธ๋๋ ์งํํ์๊ฒ ์ต๋๊น? [y/N]
sm config โ riskCheck: warn (๊ธฐ๋ณธ โ 4์ + AND ์ํ ์๊ฐ๋๋ง confirm) / on (4์ + ํญ์ confirm) / off
sm c ๊ฐ staged ๋ณ๊ฒฝ์ ์ต๊ทผ N ๊ฐ (๊ธฐ๋ณธ 20) commit ์ patch ์ ๋น๊ตํด, ์ด commit ์ด ๊ณผ๊ฑฐ commit ์ (๋ถ๋ถ) ๋๋๋ฆฌ๋์ง ๊ฐ์งํ๊ณ ์๋ดํฉ๋๋ค. "fix A ํ๋๋ฐ ๋ฉฐ์น ๋ค ๋ฌด๊ดํ ์์
์์ ๊ทธ ๋ผ์ธ์ ๋๋๋ ค A ์ฌ๋ฐ" ํจํด์ ์ก์ต๋๋ค.
โ ์ต๊ทผ commit ์ ๋๋๋ฆด ๊ฐ๋ฅ์ฑ (2 ๊ฑด):
src/auth.ts: removes line(s) added in abc1234 "auth: persist session token"
- session.token = token;
sm config โ revertCheck: on (๊ธฐ๋ณธ) / off. revertLookback ์ผ๋ก ์ค์บ ๊น์ด ์กฐ์ .
sm style learn ์ผ๋ก ์ ์ฅ์์ commit ๋ฉ์์ง ์คํ์ผ (CC ์ฑํ๋ฅ , ์์ฃผ ์ฐ๋ type/scope, ๋ณธ๋ฌธ ๊ธธ์ด, bullet ์คํ์ผ, ์ถ๋ ฅ ์ธ์ด, ์ด์ footer ํ์ ๋ฑ) ์ ํ์ต โ ~/.smart-msg/styles/<repoKey>.json ์ ์ฅ โ ์ดํ sm c ๊ฐ prompt ์ ์๋ ์ฃผ์
.
sm style learn # ์ต๊ทผ 200 ๊ฐ ๋ถ์ (--sample ์ผ๋ก ์กฐ์ , 10~2000)
sm style show # ํ์ฌ ํ๋กํ ์ถ๋ ฅ
sm style clear # ํ๋กํ ์ ๊ฑฐgeneric Conventional Commits ๊ฐ ์๋๋ผ "๊ทธ ํ์ด ์ด ๋ฏํ ํค" ์ด ๋์ค๊ฒ ๋ง๋๋ ์ฅ๊ธฐ lock-in ๊ธฐ๋ฅ.
sm split ์ด LLM ์์ด ํ์ผ ๊ฒฝ๋ก/๋ด์ฉ์ผ๋ก ์นดํ
๊ณ ๋ฆฌ๋ฅผ ์ฆ์ ๋ถ๋ฅํ๊ณ ๊ถ์ฅ ๋ถํ + git ๋ช
๋ น ์ํ์ค๋ฅผ ์ถ๋ ฅ. AI ํ
์คํธ ์ ์๊ณผ ๋ณํ ๋
ธ์ถ.
sm split # ๋ก์ปฌ + AI ๋ ๋ค
sm split --no-ai # ๋ก์ปฌ๋ง (๋คํธ์ํฌ/๋น์ฉ ์ ๊ฐ)์นดํ
๊ณ ๋ฆฌ: formatting / docs / tests / ci / deps / config / typesOnly / feature. ์ ๋ ฌ: ๋ถ์์ ์ธ ๊ฒ ๋จผ์ , ํฐ feature ๊ฐ ๋ง์ง๋ง.
๊ธฐ์กด [REDACTED] ๋ง์คํน ์์ ์๋ฏธ ๋ณด์กด ํ ํฐํ ์ถ๊ฐ. email/JWT/UUID/IP/CC/phone/auth-URL ๋ฑ์ด <EMAIL_1>, <UUID_1>, ... ํํ๋ก ์นํ๋๋ฉฐ ๊ฐ์ ๊ฐ์ ๊ฐ์ ํ ํฐ. ๋ชจ๋ธ์ด ์๋ฏธ๋ฅผ ์์ง ์๊ณ ๋ฉ์์ง ์์ฑ ๊ฐ๋ฅ.
sm config โ privacyMode: off / standard (๊ธฐ๋ณธ โ ๋ณดํธ PII) / strict (+์ผ๋ฐ URL +Bearer)
IPv4 ์ฅํ ๊ฒ์ฆ + ์ ์ฉ์นด๋ Luhn ๊ฒ์ฆ์ผ๋ก false positive ์ฐจ๋จ.
sm v (alias sm voice) โ ffmpeg ๋ง์ดํฌ ๋
น์ ๋๋ --file ์
๋ ฅ โ Whisper API ์ ์ฌ โ ๊ทธ ํ
์คํธ๋ฅผ intent ๋ก ์ฌ์ฉํด sm c ํ๋ฆ ์ง์
. ํฐ ๋ณ๊ฒฝ์ ๊ธด ๋ณธ๋ฌธ์ด ํ์ํ ๋ typing ๋น์ฉ 0.
sm v # 10์ด ๋
น์
sm v --seconds 20 # 20์ด ๋
น์
sm v --file pre-recorded.wav # ffmpeg ๋ถํ์
sm v --dry-run # ๋ฉ์์ง๋ง ์ถ๋ ฅOpenAI ํค ํ์ (๋ฉ์ธ provider ๊ฐ openai ๊ฐ ์๋์ด๋ openaiApiKey ๋ง ์์ผ๋ฉด ๋์). 10 ์ด ํด๋ฆฝ ๋น์ฉ โ $0.0001 USD.
| Provider | ๊ถ์ฅ ๋ชจ๋ธ |
|---|---|
| Gemini | gemini-2.5-flash, gemini-2.5-flash-lite, gemini-2.0-flash |
| Groq | llama-3.1-8b-instant, llama-3.3-70b-versatile, gemma2-9b-it |
| OpenAI | gpt-4.1-nano, gpt-4o-mini, gpt-4.1-mini |
| Claude | claude-haiku-4-5, claude-3-5-haiku-latest |
| Ollama | llama3.2, qwen2.5-coder, mistral, phi3 (๋๋ ์ง์ ์
๋ ฅ) |
| ๊ฐ | ์ถ๋ ฅ ์ธ์ด |
|---|---|
ko |
ํ๊ตญ์ด (feat, fix ๋ฑ type ํค์๋๋ ์์ด ์ ์ง) |
en |
์์ด |
๋ฉ์์ง์ ๊ธธ์ด์ ์์ธ๋๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
simple ย โย ํ ์ค (Conventional Commit ํ์)
feat(auth): add OAuth login flow
middle ย โย ์ฒซ ์ค + ๋ณธ๋ฌธ 2~5์ค
feat(auth): add OAuth login flow
- PKCE ๊ธฐ๋ฐ OAuth ์ฝ๋ฐฑ ์ฒ๋ฆฌ ์ถ๊ฐ
- ๋ก์ปฌ ์ฝ๋ฐฑ ์๋ฒ๋ฅผ ์์๋ก ์์ฑ
- ๋ฐ๊ธ๋ ํ ํฐ์ ~/.smart-msg/config.json ์ ์ ์ฅ
hard ย โย ์ฒซ ์ค + README ์์ค ๋ณธ๋ฌธ
feat(auth): add OAuth login flow
๊ธฐ์กด API ํค ์
๋ ฅ ๋ฐฉ์์ ๋งค๋ฒ ๋ฐ๊ธ ํ์ด์ง๋ก ์ด๋ํ์ฌ ๋ณต์ฌ ๋ฐ ๋ถ์ฌ๋ฃ๊ธฐ๋ฅผ
์ํํ๋ ๋ถ๋ด์ด ์์์ต๋๋ค. ํ์ค OAuth ํ๋ฆ์ ๋์
ํ์ฌ ์ด๋ฅผ ํด์ํฉ๋๋ค.
- PKCE flow ๋ก ํ ํฐ์ ์์ ํ๊ฒ ํ๋
- ๋ก์ปฌ 8765 ํฌํธ์ ์์ ์ฝ๋ฐฑ ์๋ฒ ์ด์
- ํ ํฐ์ OS keychain ์ ๋ณด๊ด
- ํ ํฐ ๋ง๋ฃ ์ ์๋ ๊ฐฑ์
์ํฅ: ๊ธฐ์กด API ํค ์ฌ์ฉ์์ ๋์์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
ํ๊ตญ์ด ์ถ๋ ฅ์๋ง ์ ์ฉ๋๋ ๋ณธ๋ฌธ ์ข ๊ฒฐ ์คํ์ผ์ ๋๋ค. ์์ด ์ถ๋ ฅ์๋ ์ํฅ์ด ์์ต๋๋ค.
| ๊ฐ | ์ถ๋ ฅ ์์ |
|---|---|
report (๊ธฐ๋ณธ) |
๋ฉ๋ด ํญ๋ชฉ ์ถ๊ฐ, ์๋ํฌ์ธํธ ๋ถ๋ฆฌ, ์ค๋ ๋ ํ ์ ๊ฑฐ. ํ์ ์ ์ถํ ํ์ฅ. (๋ช
์ฌํ/์์ด์ฒด) |
polite |
~๋ฅผ ์ถ๊ฐํ์ต๋๋ค., ~๋ก ๋ณ๊ฒฝํ์ต๋๋ค., ~๋ฅผ ๋ถ๋ฆฌํ๊ธฐ ์ํด ๋ณ๊ฒฝํ์ต๋๋ค. (์ ์ค์ฒด) |
sm config โ tone ๋ฉ๋ด์์ ๋ณ๊ฒฝ ๊ฐ๋ฅํฉ๋๋ค.
Note
์ ๊ท ์ค์น + ๊ธฐ์กด ์ค์น(๋ฏธ์ค์ ) ๋ชจ๋ report ํค์ด ๊ธฐ๋ณธ ์ ์ฉ๋ฉ๋๋ค. commit ๋ฉ์์ง๋ ์งง์ ๊ธฐ์ ๋ณด๊ณ ์ ํค์ด ์์ฐ์ค๋ฝ๋ค๋ ํ๋จ์
๋๋ค. ์ ์ค์ฒด๋ฅผ ์ํ์๋ฉด sm config ์์ polite ๋ก ์ ํํ์๊ธฐ ๋ฐ๋๋๋ค.
sm config โ gitmoji ๋ฅผ on ์ผ๋ก ์ค์ ํ๋ฉด commit type ์์ ์ด๋ชจ์ง๊ฐ ์๋์ผ๋ก ๋ถ์ต๋๋ค.
โจ feat(auth): add OAuth login flow
๐ fix(parser): handle empty input
โป๏ธ refactor(api): split endpoint by pageType
๋งคํ: feat โ โจ, fix โ ๐, docs โ ๐, refactor โ โป๏ธ, perf โ โก๏ธ, test โ โ
, chore โ ๐ง, build โ ๐ฆ, style โ ๐
sm config โ autoIssue ๋ฅผ on ์ผ๋ก ์ค์ ํ๋ฉด ํ์ฌ ๋ธ๋์น๋ช
์์ ์ด์ ํค๋ฅผ ์ถ์ถํ์ฌ commit ๋ฉ์์ง footer ์ Refs: ๋ก ์๋ ์ฒจ๋ถํฉ๋๋ค.
git checkout -b feature/AUTH-123-oauth-login
git add .
sm c
# โ
# feat(auth): add OAuth login flow
#
# - PKCE ๊ธฐ๋ฐ OAuth ์ฝ๋ฐฑ ์ฒ๋ฆฌ ์ถ๊ฐ
# ...
#
# Refs: AUTH-123์ถ์ถ ํจํด:
- JIRA ๋ฅ:
AUTH-123,PROJ-9999๋ฑ (๋๋ฌธ์ prefix + ์ซ์) - GitHub ๋ฅ:
#123,gh-123,issue-123,issue/123๋ฑ
sm config โ fallback ์์ ํด๋ฐฑ provider ๋ฅผ ๋ฑ๋กํ๋ฉด, ๋ฉ์ธ provider ๊ฐ ์คํจ (503, timeout ๋ฑ) ํ์ ๋ ์๋์ผ๋ก ๋ค๋ฅธ provider ๋ก ์ฌ์๋ํฉ๋๋ค.
provider : gemini โ ๋ฉ์ธ
fallback : groq โ Gemini 503 ์ ์๋์ผ๋ก Groq ํธ์ถ
๋ provider ์ ํค๊ฐ ๋ชจ๋ sm login ์ผ๋ก ๋ฑ๋ก๋์ด ์์ด์ผ ๋์ํฉ๋๋ค.
๋ฌธ์ ์ง๋จ์ด ํ์ํ ๋ sm config โ verbose ๋ฅผ on ์ผ๋ก ์ค์ ํ๋ฉด prompt ์ ์๋ต์ด stderr ์ ์ถ๋ ฅ๋ฉ๋๋ค. ํ๊ฒฝ๋ณ์๋ก๋ ํ์ฑํ ๊ฐ๋ฅํฉ๋๋ค.
SM_DEBUG=1 sm c.env ๋ฅ์ secret, AWS/GitHub ํ ํฐ, PEM private key ๋ฑ์ AI ์ ๋ณด๋ด๊ธฐ ์ ์๋์ผ๋ก [REDACTED] ๋ก ๋ง์คํน๋ฉ๋๋ค. ์ฌ์ฉ์๊ฐ ์ค์๋ก secret ์ staged ํ ๊ฒฝ์ฐ์ 1์ฐจ ๋ฐฉ์ด์ ์
๋๋ค.
Warning
๋ง์คํน์ ์์ ํ ๋ณดํธ ์๋จ์ด ์๋๋๋ค. secret ํ์ผ์ .gitignore ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ฐ์ ์
๋๋ค.
| ๊ฐ | ๋์ |
|---|---|
fallback (๊ธฐ๋ณธ) |
์๋ด ์ฝ๋ฉํธ๊ฐ ๋ด๊ธด ๋น ํ ํ๋ฆฟ์ ์ ์ด git ์๋ํฐ๊ฐ ์ด๋ฆผ. ์ฌ์ฉ์๊ฐ ์ง์ ๋ฉ์์ง ์์ฑ ๊ฐ๋ฅ |
abort |
๋ฉ์์ง๋ฅผ ๋น์๋ฌ git ์ด commit ์์ฒด๋ฅผ ์ทจ์ |
sm config โ on-failure ๋ฉ๋ด์์ ๋ณ๊ฒฝ ๊ฐ๋ฅ.
Note
Gemini ์ 503 (high demand), ์ผ์ ๋คํธ์ํฌ ๋จ์ ๋ฑ์ผ๋ก AI ๋ฉ์์ง ์์ฑ์ด ์คํจํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์๋ ์ฌ์๋(429/5xx ๋์, ๋ฐฑ์คํ 0.6์ดยท1.2์ด, ๋จ์ผ ํธ์ถ 30์ด ํ์์์) + ํด๋ฐฑ provider (๋ฑ๋ก ์) ๊ฐ 1์ฐจ ๋ฐฉ์ด์ ์ด๋ฉฐ, ๊ทธ๋๋ ์คํจํ ๊ฒฝ์ฐ ์ ์ต์ ์ด ์ ์ฉ๋ฉ๋๋ค.
sm config โ baseUrl ์์ OpenAI ํธํ endpoint ๋๋ ์๊ฒฉ Ollama ์๋ฒ์ URL ์ ์ง์ ํ ์ ์์ต๋๋ค.
- OpenAI: Azure OpenAI, OpenRouter, ์์ฒด ํธ์คํ
vLLM ๋ฑ์ ์ฌ์ฉ (
https://your-resource.openai.azure.com/...) - Ollama: ์๊ฒฉ ๋จธ์ ์์ ์คํ ์ค์ธ Ollama (
http://192.168.1.10:11434)
sm config๋ฉ๋ด์์ ๋ณ๊ฒฝํ ํญ๋ชฉ์ ์ ํํฉ๋๋ค. provider ์์ฒด๋ฅผ ๋ฐ๊พธ๋ ค๋ฉด sm login ์ ๋ค์ ์คํํฉ๋๋ค (๋ค๋ฅธ provider ์ ํค๋ ๋ณด์กด๋ฉ๋๋ค).
sm updatesm update ๋ฅผ ์คํํ๋ฉด ํ์ฌ ๋ฒ์ ๊ณผ npm registry ์ ์ต์ ๋ฒ์ ์ ๋น๊ตํ ๋ค, ๋ค๋ฅธ ๊ฒฝ์ฐ์ ํํด ์๋์ผ๋ก npm install -g smart-msg@latest ๋ฅผ ์ํํฉ๋๋ค.
์๋์ผ๋ก ์งํํ์๋ ค๋ฉด ๋ค์๊ณผ ๋์ผํฉ๋๋ค.
npm install -g smart-msg@latestsm --version # ํ์ฌ ๋ฒ์ ๋ง ์ถ๋ ฅ
sm status # ํ์ฌ ๋ฒ์ + ์ต์ ๋ฒ์ ๋น๊ต + ์ค์ ์ ๋ณด ํจ๊ป ์ถ๋ ฅsm status ์ถ๋ ฅ ์์:
provider : gemini
model : gemini-2.5-flash
language : ko
strength : middle
tone : report
gitmoji : off
autoIssue: on
fallback : groq
onFail : fallback
verbose : off
config : C:\Users\you\.smart-msg\config.json
version : 1.1.54 โ latest 1.2.0 โฃ run `sm update` to upgrade
Note
์
๋ฐ์ดํธ ํ์๋ ๊ธฐ์กด ~/.smart-msg/config.json ์ ์ค์ ๊ณผ API ํค๋ ๊ทธ๋๋ก ์ ์ง๋ฉ๋๋ค. ๋ค์ ๋ก๊ทธ์ธํ ํ์๊ฐ ์์ต๋๋ค.
์๋ก ์ถ๊ฐ๋ provider (์: Ollama) ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด sm login ์ ๋ค์ ์คํํ์ฌ ์ถ๊ฐ ํค๋ฅผ ๋ฑ๋กํ ์ ์์ต๋๋ค. ๊ธฐ์กด ํค๋ ๋ฎ์ด์ฐ์ฌ์ง์ง ์์ต๋๋ค.
sm <TAB> ์
๋ ฅ ์ ์๋ธ์ปค๋งจ๋(login, logout, commit, pr, amend, split ๋ฑ) ๊ฐ ์๋์ผ๋ก ์์ฑ๋๋๋ก ์
ธ๋ณ ๋ฑ๋ก ์คํฌ๋ฆฝํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
echo 'eval "$(sm completion bash)"' >> ~/.bashrc
source ~/.bashrcecho 'eval "$(sm completion zsh)"' >> ~/.zshrc
source ~/.zshrcsm completion powershell | Out-String | Invoke-Expression์๊ตฌ ์ ์ฉ์ ์ํ์๋ ๊ฒฝ์ฐ ์ ์ค์ $PROFILE ํ์ผ์ ์ถ๊ฐํฉ๋๋ค. (notepad $PROFILE)
cmd.exe ์์ฒด๋ ์ฌ์ฉ์ ์ ์ ์๋์์ฑ์ ์ง์ํ์ง ์์ต๋๋ค. clink ๋ฅผ ์ค์นํ์๋ฉด cmd ์์์๋ ์๋์์ฑ์ด ๋์ํฉ๋๋ค.
sm completion clink > %LOCALAPPDATA%\clink\sm.lua์ cmd ์ฐฝ๋ถํฐ ์๋์์ฑ์ด ์ ์ฉ๋ฉ๋๋ค.
Note
์์ cmd.exe ๋ ์๋์์ฑ์ ์ง์ํ์ง ์์ต๋๋ค. PowerShell ๋๋ clink ๋ฅผ ์ฌ์ฉํ์๊ธฐ ๋ฐ๋๋๋ค.
smart-msg ๋ git ๋ช
๋ น์ด ๋์ํ๋ ๋ชจ๋ ํ๊ฒฝ์์ ๋์ผํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Git Bash, PowerShell, Windows CMD, macOS Terminal, iTerm2, Linux Bash / Zsh ๋ชจ๋ ๋ณ๋ ์ค์ ์์ด ๋์ํฉ๋๋ค.
Note
PowerShell ์์ sm ์คํ์ด ์ฐจ๋จ๋๋ ๊ฒฝ์ฐ ๋ค์ ๋ช
๋ น์ผ๋ก ์ ์ฑ
์ ์ํํฉ๋๋ค.
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned| IDE | ์ฌ์ฉ ๋ฐฉ๋ฒ |
|---|---|
| IntelliJ IDEA / WebStorm / PyCharm | Ctrl + K ๋ก ์ปค๋ฐ ์ฐฝ์ ์ด๋ฉด ๋ฉ์์ง๊ฐ ์๋์ผ๋ก ์ฑ์์ง๋๋ค |
| VS Code, Cursor | Ctrl + Shift + G ๋ก Source Control ํจ๋์ ์ด๊ณ commit ์ ๋ฉ์์ง๊ฐ ์๋์ผ๋ก ์ฑ์์ง๋๋ค |
| ๊ทธ ์ธ IDE | ๋ด์ฅ ํฐ๋ฏธ๋์ด ์๋ ๋ชจ๋ IDE ์์ ๋์ผํ๊ฒ ๋์ํฉ๋๋ค |
Tip
IDE ์ปค๋ฐ ์ฐฝ ํตํฉ์ sm login ์ ๋ง์ง๋ง ๋จ๊ณ์์ ๊ธ๋ก๋ฒ hook ์ ์ค์นํ ๊ฒฝ์ฐ์๋ง ๋์ํฉ๋๋ค. ์ค์นํ์ง ์์ ๊ฒฝ์ฐ sm login ์ ๋ค์ ์คํํ์ฌ ํ์ฑํํ ์ ์์ต๋๋ค.
smart-msg ๋ ๊ธ๋ก๋ฒ CLI ์ด๋ฏ๋ก ํ๋ก์ ํธ ์ธ์ด์ ๋ฌด๊ดํ๊ฒ ๋์ํฉ๋๋ค. Java, Python, Go ๋ฑ ์ด๋ค ์ธ์ด ํ๋ก์ ํธ์์๋ ๋์ผํ๊ฒ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, node_modules ํด๋๊ฐ ํ๋ก์ ํธ์ ์์ฑ๋์ง ์์ต๋๋ค.
sm uninstall
npm uninstall -g smart-msgsm uninstall ์ด ๋ค์ ํญ๋ชฉ์ ๋ชจ๋ ์ ๋ฆฌํฉ๋๋ค.
- ์ค์ ๋๋ ํ ๋ฆฌ (
~/.smart-msg/) - ๊ธ๋ก๋ฒ git hook ์ค์ (์ด์ ๊ฐ์ด ์๋ค๋ฉด ๋ณต์)
- ํ๋ก์ ํธ๋ณ ์ค์น๋ hook (์๋ ๊ฒฝ์ฐ)
์ดํ npm uninstall -g smart-msg ๋ก ํจํค์ง ๋ณธ์ฒด๋ฅผ ์ ๊ฑฐํ๋ฉด ์์ ํ ์ ๋ฆฌ๋ฉ๋๋ค.
Warning
npm ์ ๊ธ๋ก๋ฒ ํจํค์ง uninstall ์ lifecycle script ์ ์คํ์ ์ฐจ๋จํฉ๋๋ค. sm uninstall ์ ๋จผ์ ์คํํ์ง ์์ผ๋ฉด ~/.smart-msg/ ๊ฐ ๊ทธ๋๋ก ๋จ์ API ํค๋ ๋ณด์กด๋ฉ๋๋ค.
ISC