commitgate 0.9.1 โ†’ 0.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,605 +1,98 @@
1
- # CommitGate
2
-
3
- ๐ŸŒ **ํ•œ๊ตญ์–ด** ยท [English](./README.en.md)
4
-
5
- **AI ์ฝ”๋”ฉ ๋ณ€๊ฒฝ์„ Codex ๋ฆฌ๋ทฐ ์Šน์ธ ์—†์ด๋Š” ์ปค๋ฐ‹ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋ง‰๋Š” ์ปค๋ฐ‹ ๊ฒŒ์ดํŠธ์ž…๋‹ˆ๋‹ค.**
6
-
7
- AI ์—์ด์ „ํŠธ๊ฐ€ ์ฝ”๋“œ๋ฅผ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค๋”๋ผ๋„, ๋ฆฌ๋ทฐ ์—†์ด ๋ฐ”๋กœ ์ปค๋ฐ‹๋˜๋ฉด ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค. CommitGate๋Š” ๋ณ€๊ฒฝ์„ ํ‹ฐ์ผ“ ๋‹จ์œ„๋กœ ๋ฌถ๊ณ , Codex๊ฐ€ ์Šน์ธํ•œ staged tree๋งŒ ์ปค๋ฐ‹๋˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์Šน์ธ ํ›„ ์ฝ”๋“œ๊ฐ€ ๋ฐ”๋€Œ๊ฑฐ๋‚˜ ์ฆ๊ฑฐ๊ฐ€ ๋ถ€์กฑํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ง‰์Šต๋‹ˆ๋‹ค.
8
-
9
- > **โš ๏ธ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๋‘ ๊ฐ€์ง€๋ฅผ ์•Œ์•„ ๋‘์„ธ์š”.**
10
- >
11
- > 1. **๋ฆฌ๋ทฐ๋Š” staged diff๋ฅผ ์™ธ๋ถ€๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.** `req:review-codex`๋Š” `git diff --cached` **์ „๋ฌธ**์„ Codex(OpenAI)๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค. codex๋Š” `--sandbox read-only`๋กœ ์ €์žฅ์†Œ ๋ฃจํŠธ๋ฅผ ์ฝ์œผ๋ฏ€๋กœ diff์— ์—†๋Š” ํŒŒ์ผ๋„ ์ฝํž ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์Šคํ‚นยทํ•„ํ„ฐยท๊ธธ์ด ์ƒํ•œ์€ **์—†์Šต๋‹ˆ๋‹ค.** ๋ฆฌ๋ทฐ ์ „์— staged ๋‚ด์šฉ์— ์ž๊ฒฉ์ฆ๋ช…ยทํ† ํฐยท๊ฐœ์ธ์ •๋ณด๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.
12
- > 2. **git hook์„ ์„ค์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.** `req:commit` ๋Œ€์‹  `git commit`์„ ์ง์ ‘ ์น˜๋ฉด ๊ฒŒ์ดํŠธยท์Šน์ธ ๋ฐ”์ธ๋”ฉยท์ฆ๊ฑฐ ๊ธฐ๋ก์ด ์ „๋ถ€ ์šฐํšŒ๋ฉ๋‹ˆ๋‹ค. CommitGate์˜ ๊ฐ•์ œ๋ ฅ์€ **ํ˜‘์กฐํ•˜๋Š” ์—์ด์ „ํŠธ๋ฅผ ๊ณ„์•ฝ ๊ถค๋„์— ์œ ์ง€ํ•˜๋Š” ๊ฒƒ**์— ์žˆ์ง€, ์‚ฌ๋žŒ์˜ ์šฐํšŒ๋ฅผ ๋ง‰๋Š” ๋ฐ ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
13
-
14
- [![CI](https://github.com/sol5288/commitgate/actions/workflows/ci.yml/badge.svg)](https://github.com/sol5288/commitgate/actions/workflows/ci.yml)
15
- [![npm version](https://img.shields.io/npm/v/commitgate.svg)](https://www.npmjs.com/package/commitgate)
16
- [![license](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE)
17
-
18
- ---
19
-
20
- ## Quick Start
21
-
22
- ์•„๋ž˜๋Š” ๊ฐ€์žฅ ์งง์€ ์‚ฌ์šฉ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ๋Š” **git ์ €์žฅ์†Œ์ด๊ณ  `package.json`์ด ์žˆ๋Š” ํด๋”**์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
23
-
24
- ```sh
25
- # ์•„์ง git ์ €์žฅ์†Œ๊ฐ€ ์•„๋‹ˆ๊ฑฐ๋‚˜ package.json์ด ์—†๋Š” ์ƒˆ ํด๋”๋ผ๋ฉด ๋จผ์ €:
26
- git init
27
- npm init -y
28
-
29
- # 1) CommitGate๋ฅผ devDependency๋กœ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค โ€” ์‹คํ–‰ ์ฝ”๋“œ๊ฐ€ ์—ฌ๊ธฐ ๋“ค์–ด์˜ต๋‹ˆ๋‹ค:
30
- npm install -D commitgate
31
-
32
- # 2) ํ”„๋กœ์ ํŠธ์— ์„ค์ •ยท๊ณ„์•ฝยท์Šคํ‚ค๋งˆ์™€ req:* ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊น๋‹ˆ๋‹ค:
33
- npx commitgate init
34
-
35
- codex --version
36
- codex login status
37
- ```
38
-
39
- > **์™œ ๋‘ ๋‹จ๊ณ„์ธ๊ฐ€์š”?** CommitGate๋Š” ์‹คํ–‰ ์ฝ”๋“œ๋ฅผ ํ”„๋กœ์ ํŠธ์— **๋ณต์‚ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค**. 1๋‹จ๊ณ„๊ฐ€ ๋Ÿฐํƒ€์ž„์„ `node_modules/commitgate`์— ๋„ฃ๊ณ , 2๋‹จ๊ณ„๋Š” ํ”„๋กœ์ ํŠธ์— **๊ฑฐ๋ฒ„๋„Œ์Šค ์ž์‚ฐ**(์„ค์ •ยท๊ณ„์•ฝยท์Šคํ‚ค๋งˆยทpersona)๊ณผ `req:* = commitgate <verb>` ์Šคํฌ๋ฆฝํŠธ๋งŒ ๊น๋‹ˆ๋‹ค.
40
- > ๋Ÿฐํƒ€์ž„ ์ œ๊ฑฐ๋Š” `npm uninstall -D commitgate` ํ•œ ๋ฒˆ์ž…๋‹ˆ๋‹ค. **์—…๋ฐ์ดํŠธ๋Š” ์•„๋ž˜ [์—…๊ทธ๋ ˆ์ด๋“œ (0.x)](#์—…๊ทธ๋ ˆ์ด๋“œ-0x) ์ ˆ์„ ๋”ฐ๋ฅด์„ธ์š”** โ€” ๋Ÿฐํƒ€์ž„(`node_modules`)์€ `npm`์œผ๋กœ ์˜ฌ๋ฆฌ์ง€๋งŒ, ํ”„๋กœ์ ํŠธ์— ๊น”๋ฆฐ vendored ์ž์‚ฐ(์Šคํ‚ค๋งˆยทpersona)์€ `commitgate sync`๋กœ ๋”ฐ๋กœ ๋งž์ถฐ์•ผ ํ•˜๊ณ , 0.x ์บ๋Ÿฟ ๋ฒ”์œ„(`^0.y`)๋Š” minor๋ฅผ ์ž๋™์œผ๋กœ ๋„˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
41
- > `init`์€ `devDependencies.commitgate` ์„ ์–ธ์ด ์—†์œผ๋ฉด **์ค‘๋‹จ**ํ•ฉ๋‹ˆ๋‹ค โ€” `req:*`๊ฐ€ ๊ฐ€๋ฆฌํ‚ฌ ๋Ÿฐํƒ€์ž„์ด ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
42
-
43
- ์„ค์น˜๋Š” ํŒŒ์ผ์„ ๋†“๊ธฐ๋งŒ ํ•˜๊ณ  ์ปค๋ฐ‹ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. `req:new`๋Š” **clean ์›Œํ‚นํŠธ๋ฆฌ๋ฅผ ์š”๊ตฌ**ํ•˜๋ฏ€๋กœ, ์„ค์น˜๋ถ„์„ ๋จผ์ € ์ปค๋ฐ‹ํ•˜์„ธ์š”. ์„ค์น˜ ์ถœ๋ ฅ์˜ `๋‹ค์Œ:` ์•ˆ๋‚ด๊ฐ€ stageํ•  ์ •ํ™•ํ•œ ๊ฒฝ๋กœ ๋ชฉ๋ก์„ ์•Œ๋ ค ์ค๋‹ˆ๋‹ค.
44
-
45
- ```sh
46
- git add -- <์„ค์น˜ ์ถœ๋ ฅ์ด ์•Œ๋ ค ์ค€ ๊ฒฝ๋กœ๋“ค>
47
- git status # ์˜๋„ํ•œ ๊ฒƒ๋งŒ staged ์ธ์ง€ ๋ˆˆ์œผ๋กœ ํ™•์ธ
48
- git commit -m "chore: install commitgate"
49
- ```
50
-
51
- > **์ „์ฒด๋ฅผ ๋‹ด๋Š” stage(`-A` / `.`)๋ฅผ ์“ฐ์ง€ ๋งˆ์„ธ์š”.** ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์˜ ๋ฌด๊ด€ํ•œ ๋ณ€๊ฒฝ๊ณผ `.env` ๊ฐ™์€ ๋ฏธ์ถ”์  ํŒŒ์ผ์ด ํ•จ๊ป˜ ์ปค๋ฐ‹๋˜๊ณ , ์ด์–ด์ง€๋Š” `req:review-codex`๊ฐ€ ๊ทธ staged diff ์ „๋ฌธ์„ ์™ธ๋ถ€๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
52
- > ์„ค์น˜ ์ „๋ถ€ํ„ฐ ์žˆ๋˜ ๋ฌด๊ด€ํ•œ ๋ณ€๊ฒฝ์€ ์„ค์น˜ ์ปค๋ฐ‹ ๋’ค์— **๊ฒฝ๋กœ๋ฅผ ๋ช…์‹œํ•ด** ์น˜์šฐ์„ธ์š”: `git stash push -u -- <๊ฒฝ๋กœ๋“ค>`.
53
- > `-u` ์—†์ด๋Š” untracked๊ฐ€ ๋‚จ์•„ `req:new`๊ฐ€ ๋ง‰ํžˆ๊ณ , ๊ฒฝ๋กœ ์—†์ด `git stash -u`๋งŒ ์“ฐ๋ฉด `node_modules/`์ฒ˜๋Ÿผ ๋ฌด์‹œ๋˜์ง€ ์•Š์€ ๋””๋ ‰ํ„ฐ๋ฆฌ๊นŒ์ง€ ๋”ธ๋ ค ๊ฐ‘๋‹ˆ๋‹ค. ์„ค์น˜ ์ถœ๋ ฅ์ด ๊ทธ ๊ฒฝ๋กœ ๋ชฉ๋ก๋„ ์•Œ๋ ค ์ค๋‹ˆ๋‹ค.
54
-
55
- **๊ธด ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋ถ™์—ฌ๋„ฃ์„ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.** ์„ค์น˜๊ฐ€ ์—์ด์ „ํŠธ ์ง„์ž…์ ์„ ํ•จ๊ป˜ ๊น๋‹ˆ๋‹ค.
56
-
57
- | ํŒŒ์ผ | ์ฝ๋Š” ๋„๊ตฌ |
58
- |---|---|
59
- | `AGENTS.md` | Codex CLI, Cursor โ€” **๊ณ„์•ฝ ์ •๋ณธ** |
60
- | `.claude/skills/commitgate/SKILL.md` | Claude Code (์ž๋™ ๋ฐœ๊ฒฌ โ€” ํ˜ธ์ถœ์€ ๋ชจ๋ธ ํŒ๋‹จ) |
61
- | `.claude/commands/req.md` | Claude Code (`/req` ๋ช…์‹œ ํ˜ธ์ถœ) |
62
- | `.cursor/rules/commitgate.mdc` | Cursor (`alwaysApply`) |
63
- | `CLAUDE.md` | Claude Code (ํ•ญ์ƒ ๋กœ๋“œ) โ€” ๋ถ€์žฌ ์‹œ์—๋งŒ ์ƒ์„ฑ |
64
-
65
- > **์‹ ๊ทœ ์„ค์น˜์—์„œ `CLAUDE.md`์™€ `AGENTS.md`๋Š” ๋งจ ์•ž์— ์ž๋ฆฝํ˜• Quick Start**(์š”๊ตฌ 4์นธ ํ™•์ธ โ†’ `req:new` โ†’ `req:next` ๋ฃจํ”„)๋ฅผ ๋‹ด์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ ์ฝํžˆ๋Š” ์ฑ„๋„์ด๋ผ, ์—์ด์ „ํŠธ๊ฐ€ ๊ณ„์•ฝ ๋ณธ๋ฌธ์„ ๋” ์ฝ์ง€ ์•Š์•„๋„ ์ฒซ ์š”์ฒญ์—์„œ ์˜ฌ๋ฐ”๋ฅธ ์ฒซ ํ–‰๋™์„ ๊ณ ๋ฆ…๋‹ˆ๋‹ค. ๊ธฐ์กด `CLAUDE.md`/`AGENTS.md`๊ฐ€ ์žˆ์œผ๋ฉด ๋ณด์กด๋˜์–ด ์ด๋•Œ Quick Start๋Š” ์ƒˆ๋กœ ์ฃผ์ž…๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
66
-
67
- ์—์ด์ „ํŠธ์—๊ฒŒ ์š”๊ตฌ์‚ฌํ•ญ๋งŒ ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
68
-
69
- ```text
70
- /req ํ”„๋กœํ•„ ์ˆ˜์ • API๋ฅผ ์ถ”๊ฐ€ํ•ด์ค˜
71
-
72
- - ๋ฌด์—‡์„: PATCH /profile ๋กœ ๋‹‰๋„ค์ž„ยท์†Œ๊ฐœ๊ธ€ ์ˆ˜์ •
73
- - ์™œ: ์ง€๊ธˆ์€ ๊ฐ€์ž… ํ›„ ํ”„๋กœํ•„์„ ๋ฐ”๊ฟ€ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค
74
- - ์ œ์•ฝ: ๊ธฐ์กด ์ธ์ฆ ๋ฏธ๋“ค์›จ์–ด ์žฌ์‚ฌ์šฉ, ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ ์—†์Œ
75
- - ์™„๋ฃŒ ๊ธฐ์ค€: ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ํ†ต๊ณผ, ๊ถŒํ•œ ์—†๋Š” ์‚ฌ์šฉ์ž๋Š” 403
76
- ```
77
-
78
- Claude Code๊ฐ€ ์•„๋‹ˆ๋ฉด ์Šฌ๋ž˜์‹œ ์ปค๋งจ๋“œ ์—†์ด ์š”๊ตฌ์‚ฌํ•ญ๋งŒ ์ฃผ์–ด๋„ ๋ฉ๋‹ˆ๋‹ค(`.cursor/rules`ยท`AGENTS.md`๊ฐ€ ๊ทœ์น™์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค). ๋„ค ์นธ์ด ๋น„์–ด ์žˆ์œผ๋ฉด ์—์ด์ „ํŠธ๊ฐ€ ๋จผ์ € ๋ฌผ์–ด๋ด…๋‹ˆ๋‹ค.
79
-
80
- ์ฒซ ์‘๋‹ต์€ ๋ณดํ†ต ์ด๋ ‡๊ฒŒ ๋‚˜์˜ต๋‹ˆ๋‹ค.
81
-
82
- ```text
83
- REQ-2026-002 ๋ฐœํ–‰
84
- ๋ธŒ๋žœ์น˜: feat/req-2026-002-profile-edit-api
85
- phase:
86
- - phase-1: PATCH /profile ๊ตฌํ˜„
87
- - phase-2: ํ…Œ์ŠคํŠธ์™€ ํšŒ๊ท€ ํ™•์ธ
88
- ํ†ต์ œ์ : req:commit --run ์ง์ „ / [B1] main direct push ์ง์ „ (๋˜๋Š” [I1] PR ์ƒ์„ฑ โ†’ [I2] merge)
89
- ```
90
-
91
- ### ์—์ด์ „ํŠธ๋Š” `req:next`๊ฐ€ ์‹œํ‚ค๋Š” ๋Œ€๋กœ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค
92
-
93
- ๋‹ค์Œ ํ–‰๋™์„ ์—์ด์ „ํŠธ๊ฐ€ ์ถ”์ธกํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋„๊ตฌ๊ฐ€ `state.json`๊ณผ git ์ƒํƒœ์—์„œ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
94
-
95
- ```sh
96
- npm run req:next -- 2026-002
97
- ```
98
-
99
- ```text
100
- [req:next] RUN REQ-2026-002
101
- phase `phase-1`์˜ staged ๋ณ€๊ฒฝ์„ ๋ฆฌ๋ทฐ๋ฐ›๋Š”๋‹ค.
102
-
103
- $ npm run req:review-codex -- 2026-002 --kind phase --phase phase-1 --run
104
- ```
105
-
106
- | kind | ๋œป | exit |
107
- |---|---|---|
108
- | `RUN` | ์ถœ๋ ฅ๋œ ๋ช…๋ น์„ ๊ทธ๋Œ€๋กœ ์‹คํ–‰ํ•˜๊ณ  ๋‹ค์‹œ `req:next` | 0 |
109
- | `AGENT` | ๋„๊ตฌ๊ฐ€ ๋Œ€์‹  ๋ชป ํ•˜๋Š” ์ž‘์—…(๊ตฌํ˜„ยท๋ฌธ์„œ ์ž‘์„ฑยท`git add`) | 0 |
110
- | `AWAIT_HUMAN` | **ํ†ต์ œ์ ** โ€” ์ถœ๋ ฅ๋œ ์Šน์ธ ๋ฌธ์žฅ์„ ๊ทธ๋Œ€๋กœ ๋ฐ›๊ธฐ ์ „์—” ์ง„ํ–‰ ๊ธˆ์ง€ | 10 |
111
- | `DONE` | ์ด ํ‹ฐ์ผ“์—์„œ ๋„๊ตฌ๊ฐ€ ํ•  ์ผ ์—†์Œ. ํ†ตํ•ฉ์€ ๋ณ„๋„ ํ†ต์ œ์  | 11 |
112
- | `BLOCKED` | ์‚ฌ๋žŒ์—๊ฒŒ ๋ณด๊ณ . ๊ฐ™์€ ๋ฆฌ๋ทฐ ์žฌ์‹œ๋„ ๊ธˆ์ง€ | 2 |
113
-
114
- `--json`์œผ๋กœ ๊ธฐ๊ณ„ ํŒ๋…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. **์ฝ๊ธฐ ์ „์šฉ**์ด๋ผ ์–ด๋–ค ์ƒํƒœ๋„ ๋ฐ”๊พธ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
115
-
116
- ์ด ๋ฃจํ”„๋ฅผ ๋Š์ง€ ๋ง๊ณ  ๋ฐ˜๋ณตํ•˜๋ฉด ์„ค๊ณ„ โ†’ Codex ๋ฆฌ๋ทฐ โ†’ ๊ตฌํ˜„ โ†’ ์žฌ๋ฆฌ๋ทฐ โ†’ ์ปค๋ฐ‹์ด ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” `AWAIT_HUMAN`์—์„œ๋งŒ ํ™•์ธํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
117
-
118
- > **phase ์ž๋™ ์ปค๋ฐ‹(opt-in).** ๊ธฐ๋ณธ๊ฐ’์€ ๋งค phase ์ปค๋ฐ‹ ์ „์— `AWAIT_HUMAN`์œผ๋กœ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค. `req.config.json`์—
119
- > `"phaseCommit": { "autoApprove": "low-only" }`๋ฅผ ๋‘๋ฉด, **LOW ์œ„ํ—˜** ํ‹ฐ์ผ“์˜ Codex ์Šน์ธ phase๋Š” ์‚ฌ๋žŒ ์ •์ง€ ์—†์ด
120
- > ์ž๋™ ์ปค๋ฐ‹๋˜๊ณ (`req:next`๊ฐ€ `req:commit --run`์„ RUN์œผ๋กœ ์ง€์‹œ), ์‚ฌ๋žŒ ํ™•์ธ์€ **featureโ†’main ๋ณ‘ํ•ฉ ์ง์ „ ํ•œ ๋ฒˆ**์œผ๋กœ
121
- > ๋ชจ์ž…๋‹ˆ๋‹ค(์ข…๋‹จ์ด `DONE` ๋Œ€์‹  `AWAIT_HUMAN`(ํ†ตํ•ฉ)). **HIGH ํ‹ฐ์ผ“์€ ์ •์ฑ…๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ๋งค phase ํ™•์ธ**์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
122
- > ์ด๋•Œ๋„ Codex ๋ฆฌ๋ทฐ ๊ฒŒ์ดํŠธ๋Š” ๊ทธ๋Œ€๋กœ์ž…๋‹ˆ๋‹ค โ€” ์ œ๊ฑฐ๋˜๋Š” ๊ฒƒ์€ LOW phase์˜ *์‚ฌ๋žŒ ์ •์ง€*๋ฟ์ž…๋‹ˆ๋‹ค.
123
-
124
- ### ๋ฆฌ๋ทฐ์–ด ํŽ˜๋ฅด์†Œ๋‚˜๋Š” ๋„๊ตฌ๊ฐ€ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค
125
-
126
- `req:review-codex`๋Š” `workflow/review-persona.md`๋ฅผ ํ”„๋กฌํ”„ํŠธ **์ฒซ ๋ธ”๋ก**์œผ๋กœ ๋„ฃ์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ์ด ์ง์ ‘ ์‹คํ–‰ํ•˜๋“ , Cursor๊ฐ€ ์‹คํ–‰ํ•˜๋“ , Claude๊ฐ€ ์‹คํ–‰ํ•˜๋“  ๋™์ผํ•ฉ๋‹ˆ๋‹ค โ€” ์—์ด์ „ํŠธ๊ฐ€ ์žŠ์„ ์ˆ˜ ์žˆ๋Š” ์ž๋ฆฌ์— ๋‘์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ์ด ์—†๊ฑฐ๋‚˜ ๋น„์–ด ์žˆ์œผ๋ฉด ๋ฆฌ๋ทฐ๊ฐ€ fail-closed๋กœ ๋ฉˆ์ถฅ๋‹ˆ๋‹ค.
127
-
128
- ๋‚ด์šฉ์„ ํ”„๋กœ์ ํŠธ์— ๋งž๊ฒŒ ๊ณ ์น˜๊ฑฐ๋‚˜, `req.config.json`์˜ `reviewPersonaPath`๋กœ ๋‹ค๋ฅธ ํŒŒ์ผ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. `null`๋กœ ๋‘๋ฉด ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค โ€” ๋‹ค๋งŒ **delta design ๋ฆฌ๋ทฐ์—๋Š” ๋‚ด์žฅ delta ๊ณ„์•ฝ์ด ์ฃผ์ž…๋œ๋‹ค**(์Šน์ธ baseline ์ดํ›„ ๋ณ€๊ฒฝ๋ถ„๋งŒ ์žฌ๊ฒ€ํ† ํ•˜๋„๋ก ๋ฆฌ๋ทฐ์–ด์—๊ฒŒ ๊ฑฐ๋Š” ๊ณ„์•ฝ์ด๋ผ, ์„ค์ • persona์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ๋ถ™์Šต๋‹ˆ๋‹ค).
129
-
130
- ### ์„ค๊ณ„ ์žฌ๋ฆฌ๋ทฐ๋Š” delta๋กœ ์ขํ˜€์ง‘๋‹ˆ๋‹ค
131
-
132
- ์„ค๊ณ„๊ฐ€ ํ•œ ๋ฒˆ ์Šน์ธ๋˜๋ฉด ๊ทธ ์‹œ์ ์˜ ์„ค๊ณ„ ๋ฌธ์„œ(๊ธฐ๋ณธ `00/01/02`, `designDocs` ์„ค์ •์œผ๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ)๋ฅผ baseline์œผ๋กœ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ ์„ค๊ณ„๋ฅผ ๊ณ ์ณ ์žฌ๋ฆฌ๋ทฐํ•˜๋ฉด, ๋ฆฌ๋ทฐ์–ด์—๊ฒŒ **๋ณ€๊ฒฝ๋œ ๋ฌธ์„œ์™€ ๊ทธ ์ง์ ‘ ์˜ํ–ฅ ๋ฒ”์œ„๋งŒ** ์‹ฌ์‚ฌํ•˜๋„๋ก ํ”„๋กฌํ”„ํŠธ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ๋ฌธ์„œ๋Š” `[๋ณ€๊ฒฝ๋จ โ€” ์‹ฌ์‚ฌ ๋Œ€์ƒ]`, ๋ฏธ๋ณ€๊ฒฝ ๋ฌธ์„œ๋Š” `[์Šน์ธ baseline โ€” ๋ณ€๊ฒฝ ์—†์Œ, ์ฐธ์กฐ]`๋กœ ํ‘œ์‹œํ•˜๊ณ , ์Šน์ธ๋œ ์˜์—ญ์„ ๋‹ค์‹œ ๋ฌธ์ œ ์‚ผ์ง€ ๋ง๋ผ๋Š” ๊ณ„์•ฝ์„ ๊ฒ๋‹ˆ๋‹ค. ๋ฏธ๋ณ€๊ฒฝ ๋ฌธ์„œ๋Š” ๋ณธ๋ฌธ ๋Œ€์‹  ์ƒ๋žต ํ‘œ์‹๋งŒ ์ „๋‹ฌํ•ด ํ† ํฐ์„ ์•„๋‚๋‹ˆ๋‹ค. ์Šน์ธ ํ›„ ์ž‘์€ ํŽธ์ง‘์ด ์ „์ฒด ์žฌ๋ฆฌ๋ทฐ๋ฅผ ์œ ๋ฐœํ•ด ์Šน์ธ์ด ๋˜๋Œ๋ ค์ง€๋˜ ๋ฌธ์ œ๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค.
133
-
134
- ๋ณ€๊ฒฝ์ด ๋„ˆ๋ฌด ๊ทผ๋ณธ์ ์ด๋ผ delta๋กœ ํŒ๋‹จํ•  ์ˆ˜ ์—†์œผ๋ฉด ๋ฆฌ๋ทฐ์–ด๊ฐ€ `full_review_requested: "yes"`(๊ทธ๋•Œ `commit_approved: "no"`)๋กœ ์ „์ฒด ์žฌ๋ฆฌ๋ทฐ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด baseline์ด ๋น„์›Œ์ ธ ๋‹ค์Œ ์„ค๊ณ„ ๋ฆฌ๋ทฐ๊ฐ€ full ๋ชจ๋“œ๋กœ ๋Œ์•„๊ฐ€๊ณ , ๊ทธ ์„ค๊ณ„๊ฐ€ ๋‹ค์‹œ ์Šน์ธ๋˜๋ฉด ์ƒˆ baseline์ด ์žกํ˜€ delta๊ฐ€ ์žฌ๊ฐœ๋ฉ๋‹ˆ๋‹ค.
135
-
136
- main์— ๋ฐ˜์˜ํ•˜๋Š” ๊ฒฝ๋กœ๋Š” **PR ๊ฒฝ์œ (์„ ํƒ)**์™€ **direct push** ๋‘˜ ๋‹ค ์œ ํšจํ•ฉ๋‹ˆ๋‹ค. PR์€ ์˜๋ฌด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‹ค๋งŒ protected branch๋กœ ์ง์ ‘ pushํ•˜๋ฉด required checks๋ฅผ **์šฐํšŒ**ํ•˜๋ฏ€๋กœ "branch protection bypass๋ฅผ ์‚ฌ์šฉํ•œ direct push ์Šน์ธ"์„ ๋”ฐ๋กœ ๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค โ€” bypass ๊ถŒํ•œ์ด ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์€ ์Šน์ธ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋•Œ CI๋Š” push **์ดํ›„์—** ๋„๋Š” **์‚ฌํ›„ ๊ฒ€์ฆ**์ด๋ผ, ๊ทธ ์‚ฌ์‹ค์„ ๋ณด๊ณ ์—์„œ ์ƒ๋žตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. tag, npm publish, GitHub release๋Š” ๋ฐ˜์˜๊ณผ ๋ฌถ์ด์ง€ ์•Š๋Š” ๋ณ„๋„ ํ†ต์ œ์ ์ด๊ณ  CI green ์ดํ›„์— ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๊ณ„์•ฝ์€ [AGENTS.template.md](AGENTS.template.md)์™€ [docs/RELEASING.md](docs/RELEASING.md)๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
137
-
138
- ---
139
-
140
- ## ๋ฌด์—‡์„ ๋ณด์žฅํ•˜๋‚˜์š”?
141
-
142
- CommitGate๊ฐ€ ๋ง‰๋Š” ๊ฒƒ์€ ๋‹จ์ˆœํ•œ ๋ช…๋ น ์‹ค์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ **๋ฆฌ๋ทฐ๋ฐ›์ง€ ์•Š์€ ๋ณ€๊ฒฝ์ด ์ปค๋ฐ‹๋˜๋Š” ์ƒํ™ฉ**์ž…๋‹ˆ๋‹ค.
143
-
144
- - Codex ๋ฆฌ๋ทฐ๊ฐ€ ์‹คํŒจํ•˜๊ฑฐ๋‚˜ ์—†์œผ๋ฉด ์ปค๋ฐ‹ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
145
- - ์Šน์ธ๋œ staged tree์™€ ์ง€๊ธˆ ์ปค๋ฐ‹ํ•˜๋ ค๋Š” staged tree๊ฐ€ ๋‹ค๋ฅด๋ฉด ๋ง‰์Šต๋‹ˆ๋‹ค.
146
- - `state.json`, `responses/` ๊ฐ™์€ ์›Œํฌํ”Œ๋กœ ๋‚ด๋ถ€ ํŒŒ์ผ์„ source ์ปค๋ฐ‹์— ์„ž์œผ๋ฉด ๋ง‰์Šต๋‹ˆ๋‹ค.
147
- - Codex CLI๊ฐ€ ์—†๊ฑฐ๋‚˜ ์‹คํ–‰์— ์‹คํŒจํ•˜๋ฉด ์กฐ์šฉํžˆ ํ†ต๊ณผํ•˜์ง€ ์•Š๊ณ  ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.
148
- - ๋ฆฌ๋ทฐ ์ข…๋ฃŒ์ฝ”๋“œ๋Š” outcome ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค: `0` ์Šน์ธ, `1` ๋ฌดํšจ/fail-closed, `2` blocked(์ง€์  ์—†์Œ+๋ฏธ์Šน์ธ), `3` needs-fix.
149
- - ์ง€์ ์€ ์—†์ง€๋งŒ ์Šน์ธ๋„ ์—†๋Š” ์‘๋‹ต์€ NEEDS_FIX๊ฐ€ ์•„๋‹ˆ๋ผ BLOCKED์ด๋ฉฐ, ์—์ด์ „ํŠธ๋Š” ๊ฐ™์€ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
150
- - ์—ด๋ฆฐ `(review_kind, phase_id)` review series๋ณ„๋กœ ์žฌ๋ฆฌ๋ทฐ ์‹œ๋„๋ฅผ ๊ณ„์ˆ˜ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’ `{ autoBudget: 5, hardCap: 8 }`์—์„œ 1~5ํšŒ์ฐจ๋Š” ์ž๋™, 6~8ํšŒ์ฐจ๋Š” ํšŒ์ฐจ๋งˆ๋‹ค ์‚ฌ๋žŒ ์˜ˆ์™ธ ๊ธฐ๋ก์ด ์žˆ์–ด์•ผ ์ง„ํ–‰, `hardCap` ํšŒ๋ฅผ ์†Œ์ง„ํ•˜๋ฉด ๊ทธ ๋‹ค์Œ ์‹œ๋„(9ํšŒ์ฐจ๋ถ€ํ„ฐ)๋Š” ์˜ˆ์™ธ๊ฐ€ ์žˆ์–ด๋„ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค โ€” ๋ฌดํ•œ ์žฌ๋ฆฌ๋ทฐ ๋ฃจํ”„๋ฅผ ๋ง‰์Šต๋‹ˆ๋‹ค. ์Šน์ธ๋˜๋ฉด ๊ทธ series๊ฐ€ ๋‹ซํžˆ๊ณ , ๋ฏธ์ˆ˜๋ ด series๋ฅผ ์‚ฌ๋žŒ์ด `human-resolution`์œผ๋กœ ์ข…๋ฃŒํ•˜๋ฉด ๊ฐ™์€ ํ‚ค์˜ ์ž๋™ ์žฌ๊ฐœ๊ฐ€ ๋ง‰ํž™๋‹ˆ๋‹ค.
151
- - ๋ฆฌ๋ทฐ์–ด๋Š” ํ•œ ํ˜ธ์ถœ์—์„œ ํŒŒ์•…ํ•œ P1์„ ๋ชจ๋‘ `findings[]`์— ํ•จ๊ป˜ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค(๋ฐฐ์นญ). ํ•œ ๊ฑด์”ฉ ๋‚ด๊ณ  ์žฌ๊ฒ€์ˆ˜๋ฐ›๋Š” ์ง๋ ฌ ํ๋ฆ„์ด ๋ฆฌ๋ทฐ ๋ผ์šด๋“œ๋ฅผ ๋ถ€ํ’€๋ฆฌ๋˜ ๋ฌธ์ œ๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค โ€” P1 ๊ธฐ์ค€์„ ๋‚ฎ์ถ”๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ด๋ฏธ ์•„๋Š” P1์„ ๋‹ค์Œ ๋ผ์šด๋“œ๋กœ ๋ฏธ๋ฃจ์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
152
- - ์„ค์น˜ ์‹œ ๊ธฐ์กด `cross-spawn`์ด ๊ฒ€์ฆ ํ•˜ํ•œ๋ณด๋‹ค ๋‚ฎ์œผ๋ฉด ๊ฒฝ๊ณ ํ•˜๊ณ , `--strict`์—์„œ๋Š” ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.
153
- - ์Šน์ธ ์‘๋‹ต๊ณผ ์ฆ๊ฑฐ ํŒŒ์ผ์€ `workflow/REQ-.../responses/`์— ๋‚จ์Šต๋‹ˆ๋‹ค.
154
-
155
- ํ•œ ์ค„๋กœ ๋งํ•˜๋ฉด, **ํ™•์‹คํžˆ ์Šน์ธ๋œ ๋ณ€๊ฒฝ๋งŒ ํ†ต๊ณผํ•˜๊ณ  ์• ๋งคํ•˜๋ฉด ๋ฉˆ์ถ”๋Š” ๋ฐฉ์‹**์ž…๋‹ˆ๋‹ค.
156
-
157
- ### ๋ณด์žฅํ•˜์ง€ ์•Š๋Š” ๊ฒƒ
158
-
159
- ๋ฐฉ์–ด์„ ์„ ์ž˜๋ชป ๊ณ„์‚ฐํ•˜์ง€ ์•Š๋„๋ก, ์ด ๋„๊ตฌ๊ฐ€ **ํ•˜์ง€ ์•Š๋Š” ์ผ**์„ ๋ถ„๋ช…ํžˆ ํ•ด ๋‘ก๋‹ˆ๋‹ค.
160
-
161
- - **ํ•˜๋“œ ๊ฐ•์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.** git hook์„ ์„ค์น˜ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ `req:commit` ๋Œ€์‹  `git commit`์„ ์ง์ ‘ ์น˜๋ฉด doctorยท์Šน์ธ ๋ฐ”์ธ๋”ฉยท์ฆ๊ฑฐ ๊ธฐ๋ก์ด ์ „๋ถ€ ์šฐํšŒ๋ฉ๋‹ˆ๋‹ค. ์šด์˜ ๋ฐ˜์˜์˜ ์‹ค์ œ ๋ฐฉ์–ด์„ ์€ ์—ฌ์ „ํžˆ CI์™€ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ์ž…๋‹ˆ๋‹ค.
162
- - **staged ๋‚ด์šฉ์˜ ๋น„๋ฐ€์„ ์ง€์ผœ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.** `req:review-codex`๋Š” `git diff --cached` ์ „๋ฌธ์„ Codex(OpenAI)๋กœ ์ „์†กํ•˜๊ณ , codex๋Š” `--sandbox read-only`๋กœ ์ €์žฅ์†Œ ๋ฃจํŠธ๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค. ๋งˆ์Šคํ‚นยท์Šคํฌ๋Ÿฌ๋น™ยท๊ธธ์ด ์ƒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ฒฐ์ œยท์ž๊ฒฉ์ฆ๋ช…์ฒ˜๋Ÿผ ๋ฏผ๊ฐํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ผ๋ฉด ๋ฆฌ๋ทฐ ์ „ staged diff๋ฅผ ์œก์•ˆ์œผ๋กœ ํ™•์ธํ•˜๋Š” ์ ˆ์ฐจ๋ฅผ ๊ณ„์•ฝ(`AGENTS.md`)์— ๋ช…๋ฌธํ™”ํ•˜์„ธ์š”.
163
- - **์ปค๋ฐ‹ ์ดํ›„๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.** ์Šน์ธ์€ ์ปค๋ฐ‹ ์‹œ์ ์˜ staged tree์— ๋Œ€ํ•œ ๊ฒƒ์ด๊ณ , ๋จธ์ง€ยทํƒœ๊ทธยทpublish๋Š” ๊ฐ๊ฐ ๋ณ„๋„ ํ†ต์ œ์ ์ž…๋‹ˆ๋‹ค.
164
-
165
- ---
166
-
167
- ## ์„ค์น˜๊ฐ€ ํ•˜๋Š” ์ผ
168
-
169
- `npx commitgate init`์€ ๋Œ€์ƒ ํ”„๋กœ์ ํŠธ์— ์•„๋ž˜ ํŒŒ์ผ๊ณผ ์„ค์ •์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ํŒŒ์ผ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฎ์–ด์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
170
-
171
- | ์ถ”๊ฐ€ ํ•ญ๋ชฉ | ์„ค๋ช… |
172
- |---|---|
173
- | `workflow/*.schema.json` | Codex ์‘๋‹ต๊ณผ ์„ค์ • ๊ฒ€์ฆ ์Šคํ‚ค๋งˆ |
174
- | `workflow/review-persona.md` | Codex ๋ฆฌ๋ทฐ ํ”„๋กฌํ”„ํŠธ์— ์ฃผ์ž…๋˜๋Š” ๋ฆฌ๋ทฐ์–ด ํŽ˜๋ฅด์†Œ๋‚˜ (์—†์„ ๋•Œ๋งŒ ์ƒ์„ฑ) |
175
- | `req.config.json` | ํ”„๋กœ์ ํŠธ๋ณ„ ์„ค์ • |
176
- | `AGENTS.md` | ๊ณ„์•ฝ ์ •๋ณธ (์—†์„ ๋•Œ๋งŒ ์ƒ์„ฑ) |
177
- | `CLAUDE.md` | Claude Code ์ง€์นจ ํฌ์ธํ„ฐ (์—†์„ ๋•Œ๋งŒ ์ƒ์„ฑ) |
178
- | `.claude/skills/commitgate/SKILL.md` | Claude Code ์Šคํ‚ฌ (ํฌ์ธํ„ฐ) |
179
- | `.claude/commands/req.md` | `/req` ์Šฌ๋ž˜์‹œ ์ปค๋งจ๋“œ (ํฌ์ธํ„ฐ) |
180
- | `.cursor/rules/commitgate.mdc` | Cursor ๊ทœ์น™ (ํฌ์ธํ„ฐ) |
181
- | `.claude/skills/commitgate-*/SKILL.md` | **Companion Skills** 4์ข… โ€” ์•„๋ž˜ ์ฐธ์กฐ (๊ธฐ์กด ํŒŒ์ผ ๋ณด์กด) |
182
- | `package.json` ์Šคํฌ๋ฆฝํŠธ | `req:new`ยท`req:next`ยท`req:review-codex`ยท`req:doctor`ยท`req:commit` = `commitgate <verb>` (์—†๋Š” ํ‚ค๋งŒ) |
183
-
184
- ### Companion Skills
185
-
186
- CommitGate๋Š” **๊ฑฐ๋ฒ„๋„Œ์Šค ๋ ˆ์ด์–ด**์ž…๋‹ˆ๋‹ค โ€” `req:next`๊ฐ€ ๋‹ค์Œ ํ–‰๋™์„ ๊ณ„์‚ฐํ•˜๊ณ , ๋ฆฌ๋ทฐยท์Šน์ธยท์ฆ๊ฑฐ๊ฐ€ ์ปค๋ฐ‹์„ ๊ฒŒ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
187
- ๊ทธ๋Ÿฐ๋ฐ "๋ฌด์—‡์„ ๋งŒ๋“ค์ง€ ์ •๋ฆฌํ•˜๋Š” ๋ฒ•", "ํ…Œ์ŠคํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ๋จผ์ € ์“ฐ๋Š”์ง€" ๊ฐ™์€ **๋ฐฉ๋ฒ•๋ก **์€ ๋น„์–ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
188
- Matt Pocock์˜ ๊ณต๊ฐœ skills(MIT)๋ฅผ CommitGate์˜ ๊ถŒํ•œ ๊ฒฝ๊ณ„์— ๋งž๊ฒŒ ์ ์‘ํ•ด 4์ข…์„ ํ•จ๊ป˜ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
189
-
190
- | ์Šคํ‚ฌ | ์–ธ์ œ |
191
- |---|---|
192
- | `commitgate-discovery` | `req:new` **์ „** โ€” ๋ชจํ˜ธํ•œ ์š”๊ตฌ๋ฅผ REQ Brief๋กœ ์ •๋ฆฌ. **์‚ฌ์šฉ์ž ํ˜ธ์ถœํ˜•** |
193
- | `commitgate-tdd` | `req:next`๊ฐ€ `AGENT`์ผ ๋•Œ โ€” Red โ†’ Green โ†’ Refactor โ†’ stage |
194
- | `commitgate-diagnosing-bugs` | ๋ฒ„๊ทธยทํšŒ๊ท€ยท์„ฑ๋Šฅ โ€” ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„ โ†’ ์žฌํ˜„ยท์ตœ์†Œํ™” โ†’ ๊ฐ€์„ค โ†’ ๊ณ„์ธก โ†’ ์ˆ˜์ • |
195
- | `commitgate-research` | ์™ธ๋ถ€ ๊ธฐ์ˆ  ์„ ํƒ โ€” 1์ฐจ ์ถœ์ฒ˜ ์กฐ์‚ฌ, ๊ฒฐ๋ก ยท์ถœ์ฒ˜ยทํ•œ๊ณ„ |
196
-
197
- **์ž๋™ ๋ฐœ๊ฒฌ ยท ๋ชจ๋ธ ํŒ๋‹จ ํ˜ธ์ถœ.** harness๊ฐ€ ์Šคํ‚ฌ์„ ์ž๋™์œผ๋กœ **๋ฐœ๊ฒฌ**ํ•˜์ง€๋งŒ, ์“ธ์ง€ **ํŒ๋‹จํ•˜๋Š” ๊ฑด ๋ชจ๋ธ**์ž…๋‹ˆ๋‹ค โ€”
198
- ํ™•๋ฅ ์ ์ด๋ฉฐ ํ•ญ์ƒ ๋œฌ๋‹ค๊ณ  ๊ธฐ๋Œ€ํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. Claude Code์—์„œ๋Š” `/commitgate-<์ด๋ฆ„>`์œผ๋กœ **์ง์ ‘ ํ˜ธ์ถœ**ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
199
- ๋‹ค๋ฅธ harness์—์„œ๋Š” ๊ทธ harness๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํ˜ธ์ถœ ๋ฐฉ์‹์„ ์“ฐ๊ฑฐ๋‚˜, `AGENTS.md`์˜ ์ง„์ž… ํ๋ฆ„์„ ๋”ฐ๋ฅด์„ธ์š”.
200
-
201
- **๊ถŒ์žฅ ํ๋ฆ„**: `commitgate-discovery`๋กœ ์š”๊ตฌ ์ •๋ฆฌ โ†’ `/req`(Claude Code) ๋˜๋Š” `AGENTS.md` ์ง„์ž… โ†’ `req:new` โ†’ `req:next` ๋ฐ˜๋ณต.
202
-
203
- #### ๊ฒฝ๊ณ„ โ€” ๋ฐ˜๋“œ์‹œ ์•Œ์•„ ๋‘์„ธ์š”
204
-
205
- - ๐Ÿ”ด **`AGENTS.md`๊ฐ€ ๊ณ„์•ฝ ์ •๋ณธ์ž…๋‹ˆ๋‹ค.** ์Šคํ‚ฌ์€ **๋ฐฉ๋ฒ•๋ก **์ด์ง€ ๊ณ„์•ฝ์ด ์•„๋‹™๋‹ˆ๋‹ค.
206
- ์Šคํ‚ฌ์„ ์„ค์น˜ํ•˜์ง€ ์•Š์•„๋„ **ํ•ต์‹ฌ ์›Œํฌํ”Œ๋กœ๋Š” ์™„์ „ํžˆ ๋™์ผํ•˜๊ฒŒ** ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
207
- - ๐Ÿ”ด **์Šคํ‚ฌ ๊ฒฐ๊ณผ๋Š” ์Šน์ธ ์ฆ๊ฑฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.** companion skills์˜ ์‚ฐ์ถœ๋ฌผ๋„, ์™ธ๋ถ€ Matt skills๋ฅผ ๋”ฐ๋กœ ๋Œ๋ฆฐ ๊ฒฐ๊ณผ๋„
208
- CommitGateยทCodex์˜ **์Šน์ธ ๊ทผ๊ฑฐ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค**. ๋ฆฌ๋ทฐ ์‹คํ–‰ยท์Šน์ธ ํŒ์ •ยท์ƒํƒœ ์ „์ดยท์ปค๋ฐ‹์€ **CommitGate๋งŒ** ๋‹ด๋‹นํ•˜๋ฉฐ,
209
- ๋‹ค์Œ ํ–‰๋™์€ `req:next`๊ฐ€ ์ •๋ณธ์ž…๋‹ˆ๋‹ค.
210
- - ์Šคํ‚ฌ์€ **ํ˜‘์กฐ์  ํ…์ŠคํŠธ**์ž…๋‹ˆ๋‹ค โ€” ์Šคํ‚ฌ์ด ์ปค๋ฐ‹์„ ๋ง‰๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ๋ง‰๋Š” ๊ฑด CommitGate์˜ ๊ฒŒ์ดํŠธ์ž…๋‹ˆ๋‹ค.
211
-
212
- #### ์„ค์น˜ยท๋ณด์กดยท์˜ต์…˜
213
-
214
- - **`--no-agent-entrypoints`**: `.claude/` ๊ณ„์ธต ์ „์ฒด๋ฅผ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค(companion 4์ข… ํฌํ•จ).
215
- - **๊ธฐ์กด ํŒŒ์ผ ๋ณด์กด(seed-once)**: ์Šคํ‚ฌ์€ **๊ณ ์น˜๋ผ๊ณ  ๋งŒ๋“  ์ž์‚ฐ**์ž…๋‹ˆ๋‹ค. ์ˆ˜์ •ํ•œ ์Šคํ‚ฌ์€ **`--force`๋กœ๋„ ๋ฎ์–ด์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.**
216
- `AGENTS.md`ยท`CLAUDE.md`ยท`workflow/.gitignore`๋„ ๊ฐ™์€ ์ •์ฑ…์ž…๋‹ˆ๋‹ค.
217
- - **gitignore ๊ฒฝ๊ณ **: `.claude/`๋ฅผ gitignoreํ•˜๋ฉด ํŒ€์›์˜ fresh clone์— ์Šคํ‚ฌ์ด ์ „๋‹ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
218
- ์„ค์น˜๋Š” ์ง„ํ–‰ํ•˜๋˜ **๊ฒฝ๊ณ **ํ•˜๊ณ  ์ถ”์  ๋ฐฉ๋ฒ•์„ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค. **`--strict`๋ฉด ์„ค์น˜ ์ „์— ์ค‘๋‹จ**ํ•ฉ๋‹ˆ๋‹ค.
219
- - **ํƒ€์‚ฌ skill๊ณผ ๊ณต์กด**: ํƒ€์‚ฌ `tdd`ยท`grill-me` ๋“ฑ์€ `.claude/skills/<์ด๋ฆ„>/`, companion์€ `.claude/skills/commitgate-<์ด๋ฆ„>/` โ€”
220
- **๊ฒฝ๋กœ๊ฐ€ ๋‹ฌ๋ผ ์„œ๋กœ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.**
221
-
222
- #### ์ถœ์ฒ˜
223
-
224
- Matt Pocock์˜ MIT ๊ณต๊ฐœ skills๋ฅผ ๊ธฐ์ค€ SHA `d574778f94cf620fcc8ce741584093bc650a61d3`์—์„œ ์ ์‘ํ•ด
225
- **ํŒจํ‚ค์ง€ payload๋กœ ํฌํ•จ**ํ•ฉ๋‹ˆ๋‹ค. **์™ธ๋ถ€ skill installer๋ฅผ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ๋Ÿฐํƒ€์ž„ ์˜์กดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค** โ€”
226
- ํŒจํ‚ค์ง€ ์•ˆ์— ๊ณ ์ •๋œ ์‚ฌ๋ณธ์ž…๋‹ˆ๋‹ค. ๊ฐ SKILL.md์— MIT ๊ณ ์ง€ ์ „๋ฌธ์ด ๋™ํ–‰ํ•˜๋ฉฐ, ์ž์„ธํ•œ ์ถœ์ฒ˜๋Š” ํŒจํ‚ค์ง€์˜
227
- `skills/ATTRIBUTION.md`์— ์žˆ์Šต๋‹ˆ๋‹ค.
228
-
229
- ### ์„ค์น˜ํ•˜์ง€ **์•Š๋Š”** ๊ฒƒ
230
-
231
- | ํ•ญ๋ชฉ | ์–ด๋””์— ์žˆ๋‚˜ |
232
- |---|---|
233
- | `scripts/req/**` ์‹คํ–‰ ์ฝ”๋“œ | `node_modules/commitgate` โ€” ํ”„๋กœ์ ํŠธ์— ๋ณต์‚ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค |
234
- | `tsx` ยท `ajv` ยท `cross-spawn` | `commitgate` ํŒจํ‚ค์ง€์˜ runtime dependency โ€” ๋Œ€์ƒ `package.json`์— ์ฃผ์ž…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค |
235
-
236
- ํ”„๋กœ์ ํŠธ์— ๋‚จ๋Š” ๊ฒƒ์€ **๊ฑฐ๋ฒ„๋„Œ์Šคยท๊ฐ์‚ฌ ๋ฐ์ดํ„ฐ**(์„ค์ •ยท๊ณ„์•ฝยท์Šคํ‚ค๋งˆยทpersonaยท`workflow/REQ-*` ์ฆ๊ฑฐ)๋ฟ์ž…๋‹ˆ๋‹ค. **์‹คํ–‰ ์ฝ”๋“œ**๋Š” ํŒจํ‚ค์ง€์—๋งŒ ์žˆ์œผ๋ฏ€๋กœ `npm update commitgate`๋กœ ๊ฐฑ์‹ ๋˜๊ณ  ๋ณต์‚ฌ๋ณธ์ด ๊ฐˆ๋ผ์งˆ ์ผ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ํ”„๋กœ์ ํŠธ์— ๊น”๋ฆฐ **vendored ์ž์‚ฐ**(์Šคํ‚ค๋งˆยทpersona)์€ ๋Ÿฐํƒ€์ž„๊ณผ ๋ณ„๊ฐœ๋ผ, minor ์—…๊ทธ๋ ˆ์ด๋“œ ๋•Œ [์—…๊ทธ๋ ˆ์ด๋“œ (0.x)](#์—…๊ทธ๋ ˆ์ด๋“œ-0x) ์ ˆ์„ ๋”ฐ๋ผ `commitgate sync`๋ฅผ ํ•จ๊ป˜ ์‹คํ–‰ํ•ด์•ผ ๋Ÿฐํƒ€์ž„๊ณผ ๊ฐˆ๋ผ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
237
-
238
- `req:*` ์Šคํฌ๋ฆฝํŠธ๋Š” ์„ค์น˜๋œ ํŒจํ‚ค์ง€ bin์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค โ€” `npm run req:new -- <slug>` โ†’ `commitgate req:new <slug>` โ†’ `node_modules/.bin/commitgate`.
239
-
240
- ์ง„์ž…์  ํŒŒ์ผ๋“ค์€ **์–‡์€ ํฌ์ธํ„ฐ**์ž…๋‹ˆ๋‹ค. ๊ณ„์•ฝ ๋ณธ๋ฌธ์€ `AGENTS.md` ํ•˜๋‚˜์—๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.
241
-
242
- `.claude/`ยท`.cursor/`๋ฅผ ๋‹ค๋ฅธ ๋„๊ตฌ๊ฐ€ ์“ฐ๊ณ  ์žˆ๋‹ค๋ฉด ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
243
-
244
- ```sh
245
- npx commitgate --no-agent-entrypoints
246
- ```
247
-
248
- ๊ธฐ์กด `AGENTS.md`๊ฐ€ ์žˆ๋Š”๋ฐ CommitGate ๊ณ„์•ฝ ๋งˆ์ปค(`<!-- commitgate:contract -->`)๊ฐ€ ์—†์œผ๋ฉด, ๊ณ„์•ฝ ํ…œํ”Œ๋ฆฟ์„ `AGENTS.commitgate.md`๋กœ ํ•จ๊ป˜ ๋†“๊ณ  ๋ณ‘ํ•ฉ์„ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ํŒŒ์ผ์€ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
249
-
250
- ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋งŒ ํ•˜๋ ค๋ฉด:
251
-
252
- ```sh
253
- npx commitgate --dry-run
254
- ```
255
-
256
- ์ •ํ•ฉ์„ฑ ๊ฒฝ๊ณ ๋ฅผ ์„ค์น˜ ์‹คํŒจ๋กœ ์ทจ๊ธ‰ํ•˜๋ ค๋ฉด:
257
-
258
- ```sh
259
- npx commitgate --strict
260
- ```
261
-
262
- **ํŒŒ์ผ์„ ํ•˜๋‚˜๋„ ์“ฐ๊ธฐ ์ „์—** ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
263
-
264
- - ๊ณ„์•ฝ ํฌ์ธํ„ฐ(`.claude/`ยท`.cursor/`ยท`AGENTS.md`ยท`CLAUDE.md`)๊ฐ€ `.gitignore`์— ๊ฑธ๋ ค ํŒ€ยทCI์— ๊ณต์œ ๋˜์ง€ ์•Š์„ ๋•Œ
265
- - `workflow/.gitignore` ์ •์ฑ… ํŒŒ์ผ์ด ๋ฌด์‹œ๋ผ fresh cloneยทCI์— scratch ๊ทœ์น™์ด ์ „๋‹ฌ๋˜์ง€ ์•Š์„ ๋•Œ
266
- - ์„ค์น˜ ์ „ ์›Œํ‚นํŠธ๋ฆฌ์— staged ๋ณ€๊ฒฝ์ด ์žˆ๊ฑฐ๋‚˜ ์„ค์น˜ ์‚ฐ์ถœ๋ฌผ๊ณผ ๊ฒน์น˜๋Š” ์ˆ˜์ •์ด ์žˆ์–ด, ์„ค์น˜๋ถ„๋งŒ ๋‹ด์€ ์ปค๋ฐ‹์„ ๋งŒ๋“ค ์ˆ˜ ์—†์„ ๋•Œ
267
- - ๊ธฐ์กด `cross-spawn`์ด ๊ฒ€์ฆ ํ•˜ํ•œ๋ณด๋‹ค ๋‚ฎ์„ ๋•Œ(ํ”„๋กœ์ ํŠธ๊ฐ€ ๊ทธ ํŒจํ‚ค์ง€๋ฅผ ์ด๋ฏธ ์“ฐ๋Š” ๊ฒฝ์šฐ)
268
-
269
- > `--strict`๋Š” **์„ ํ–‰ `npm install -D commitgate`๊ฐ€ ๋‚จ๊ธด `package.json`ยทlockfile ๋ณ€๊ฒฝ๋„** preexisting-dirty๋กœ ๋ด…๋‹ˆ๋‹ค. ๊ถŒ์žฅ ์ˆœ์„œ: `npm i -D commitgate` โ†’ **์ปค๋ฐ‹** โ†’ `npx commitgate init --strict` โ†’ ์„ค์น˜๋ถ„ ์ปค๋ฐ‹.
270
-
271
- > `workflow/machine.schema.json`๊ณผ `workflow/req.config.schema.json`์€ `req.config.json`์˜ `ticketRoot` ์„ค์ •๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ **ํ•ญ์ƒ `workflow/` ์•„๋ž˜**์— ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค.
272
-
273
- ---
274
-
275
- ## ์—…๊ทธ๋ ˆ์ด๋“œ (0.x)
276
-
277
- ๋Ÿฐํƒ€์ž„์„ ์ƒˆ ๋ฒ„์ „์œผ๋กœ ์˜ฌ๋ฆด ๋•Œ **๋‘ ๊ฐ€์ง€**๋ฅผ ์ฑ™๊ฒจ์•ผ ํ•ฉ๋‹ˆ๋‹ค. `npm update`๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.
278
-
279
- **โ‘  ์บ๋Ÿฟ ๋ฒ”์œ„๊ฐ€ 0.x minor๋ฅผ ๋ง‰์Šต๋‹ˆ๋‹ค.** `npm install -D commitgate`๋Š” `^0.y.z` ๋ฒ”์œ„๋ฅผ ์”๋‹ˆ๋‹ค. npm semver์—์„œ
280
- `^0.7.0`์€ `>=0.7.0 <0.8.0`์„ ๋œปํ•˜๋ฏ€๋กœ `npm update`/`pnpm update`๋Š” **0.x minor๋ฅผ ๋„˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค**(0.7.x ์•ˆ์— ๋จธ๋ญ…๋‹ˆ๋‹ค).
281
- minor๋ฅผ ๋„˜์œผ๋ ค๋ฉด ๋ฒ”์œ„๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์˜ฌ๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค:
282
-
283
- ```sh
284
- npm install -D commitgate@latest # ๋˜๋Š” ํŠน์ • ๋ฒ„์ „: commitgate@^0.8.0
285
- ```
286
-
287
- **โ‘ก vendored ์ž์‚ฐ์€ ๋Ÿฐํƒ€์ž„๊ณผ ๋ณ„๊ฐœ๋กœ ๊ฐฑ์‹ ๋ฉ๋‹ˆ๋‹ค.** ๋Ÿฐํƒ€์ž„(`node_modules/commitgate`)์€ ์œ„ ๋ช…๋ น์ด ๊ฐฑ์‹ ํ•˜์ง€๋งŒ,
288
- ํ”„๋กœ์ ํŠธ `workflow/`์— ๊น”๋ฆฐ ๊ณ„์•ฝ ์ž์‚ฐ(`machine.schema.json`ยท`req.config.schema.json`)์€ **๊ทธ๋Œ€๋กœ ๋‚จ์Šต๋‹ˆ๋‹ค**.
289
- ๋Ÿฐํƒ€์ž„๋งŒ ์˜ฌ๋ฆฌ๊ณ  ์ž์‚ฐ์„ ๋‘๋ฉด, ์ƒˆ ๋Ÿฐํƒ€์ž„์ด **์˜› ๊ณ„์•ฝ์„ ์ฝ์–ด** ์ƒˆ ๊ธฐ๋Šฅ(์˜ˆ: design delta ๋ฆฌ๋ทฐ์˜ full-review
290
- ์—์Šค์ปฌ๋ ˆ์ด์…˜)์ด ์กฐ์šฉํžˆ ๋น„ํ™œ์„ฑํ™”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. `commitgate sync`๊ฐ€ ์ด ์ž์‚ฐ์„ ์„ค์น˜๋œ ํŒจํ‚ค์ง€ ์‚ฌ๋ณธ์œผ๋กœ ๋˜๋Œ๋ฆฝ๋‹ˆ๋‹ค:
291
-
292
- ```sh
293
- npx commitgate sync # ๊ณ„ํš๋งŒ ์ถœ๋ ฅ(dry-run โ€” ๋ฌด์—‡์ด ๋ฐ”๋€”์ง€ ํ™•์ธ)
294
- npx commitgate sync --apply # ์Šคํ‚ค๋งˆ ์ถ• ์žฌ๋™๊ธฐํ™”
295
- npx commitgate sync --apply --persona # ํŽ˜๋ฅด์†Œ๋‚˜๋„ ํ•จ๊ป˜(๋ถ€์žฌ๋ฉด ๋ณต์›, ์ง์ ‘ ์ˆ˜์ •๋ณธ์€ ๋ณด์กด)
296
- ```
297
-
298
- - `sync`๋Š” **์Šคํ‚ค๋งˆ ์ถ•๋งŒ** ๋˜๋Œ๋ฆฝ๋‹ˆ๋‹ค(๊ณ„์•ฝ์ด๋ผ ํ•ญ์ƒ ์ตœ์‹ ์œผ๋กœ). companion skillsยท`workflow/.gitignore`ยท
299
- `package.json`ยท`req:*`๋Š” ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
300
- - **ํŽ˜๋ฅด์†Œ๋‚˜(`review-persona.md`)๋Š” `--persona`์—์„œ๋งŒ**, ๊ทธ๊ฒƒ๋„ **๋ถ€์žฌ ๋ณต์›**๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ์ง์ ‘ ์ˆ˜์ •ํ•œ ํŽ˜๋ฅด์†Œ๋‚˜๋Š”
301
- ๋ฎ์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋‹ค๋ฅด๋ฉด ๋ณด์กดํ•˜๊ณ  ์•Œ๋ฆผ๋งŒ) โ€” ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆํ•˜๋ ค๋ฉด `req.config.json`์˜ `reviewPersonaPath`๋ฅผ ๋ณ„๋„ ํŒŒ์ผ๋กœ ์ง€์ •ํ•˜์„ธ์š”.
302
- - `req:doctor`์˜ **D20**์ด vendored ์Šคํ‚ค๋งˆ๊ฐ€ ์„ค์น˜ ์‚ฌ๋ณธ๊ณผ ์–ด๊ธ‹๋‚˜๋ฉด **WARN**์œผ๋กœ ์•Œ๋ ค ์ค๋‹ˆ๋‹ค(์ปค๋ฐ‹์€ ๋ง‰์ง€ ์•Š์Šต๋‹ˆ๋‹ค).
303
-
304
- **โ‘ข ์˜ˆ์ „(vendored) ์„ค์น˜๋ณธ์ด๋ฉด** ์ด์–ด์„œ ์•„๋ž˜ `migrate`๋กœ Stage B ์ „ํ™˜๊นŒ์ง€ ํ•˜์„ธ์š”.
305
-
306
- > ์ •๋ฆฌ: `commitgate@latest` ์„ค์น˜ โ†’ `commitgate sync --apply` โ†’ (ํ•„์š” ์‹œ) `commitgate migrate`.
307
-
308
- ---
309
-
310
- ## ์˜ˆ์ „ ์„ค์น˜๋ณธ์—์„œ ์˜ฎ๊ฒจ์˜ค๊ธฐ (`migrate`)
311
-
312
- `scripts/req/`๊ฐ€ ํ”„๋กœ์ ํŠธ์— ๋ณต์‚ฌ๋ผ ์žˆ๊ณ  `req:*`๊ฐ€ `tsx scripts/req/*.ts`๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค๋ฉด **์˜ˆ์ „(vendored) ์„ค์น˜๋ณธ**์ž…๋‹ˆ๋‹ค. `init`์€ ์ด ์ƒํƒœ๋ฅผ ๊ฐ์ง€ํ•˜๋ฉด ์กฐ์šฉํžˆ ์„ž์ด์ง€ ์•Š๋„๋ก **์ค‘๋‹จํ•˜๊ณ ** ์ด ๋ช…๋ น์„ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.
313
-
314
- ```sh
315
- npm install -D commitgate # ์•„์ง devDependency๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๋จผ์ €
316
- npx commitgate migrate # ๊ณ„ํš๋งŒ ์ถœ๋ ฅ โ€” ์•„๋ฌด๊ฒƒ๋„ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค
317
- npx commitgate migrate --apply # package.json ์˜ req:* ๋งŒ ์ „ํ™˜
318
- ```
319
-
320
- `migrate`๊ฐ€ ํ•˜๋Š” ์ผ์€ **ํ•˜๋‚˜**์ž…๋‹ˆ๋‹ค: `req:*` ์ค‘ **ํ˜„์žฌ ๊ฐ’์ด ์ •ํ™•ํžˆ ์˜ˆ์ „ ์ฃผ์ž…๊ฐ’์ธ ํ‚ค๋งŒ** `commitgate <verb>`๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
321
-
322
- - **์•„๋ฌด๊ฒƒ๋„ ์‚ญ์ œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.** `scripts/req/`ยท์Šคํ‚ค๋งˆยทpersonaยท์„ค์ •ยท์ง„์ž…์ ยท`workflow/REQ-*` ์ฆ๊ฑฐ๋ฅผ ์ „๋ถ€ ๊ทธ๋Œ€๋กœ ๋‘ก๋‹ˆ๋‹ค. ๋‚จ์€ `scripts/req/`๋Š” ๋” ์ด์ƒ ์‹คํ–‰๋˜์ง€ ์•Š์œผ๋‹ˆ, ์ •๋ฆฌํ•˜๋ ค๋ฉด `npx commitgate uninstall` ๊ณ„ํš์„ ๋จผ์ € ํ™•์ธํ•˜์„ธ์š”.
323
- - **์ง์ ‘ ๊ณ ์นœ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋ฎ์–ด์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.** ๊ฐ’์ด ํ•œ ๊ธ€์ž๋ผ๋„ ๋‹ค๋ฅด๋ฉด ์‚ฌ์šฉ์ž ๊ฐ’์œผ๋กœ ๋ณด๊ณ  ๋ณด์กดํ•œ ๋’ค ์ˆ˜๋™ ์กฐ์น˜๋ฅผ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.
324
- - **์ปค๋ฐ‹ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.** `package.json` ํ•œ ํŒŒ์ผ๋งŒ ์“ฐ๊ณ , ๊ฒ€ํ† ๋Š” ์‚ฌ์šฉ์ž ๋ชซ์ž…๋‹ˆ๋‹ค.
325
-
326
- `req:doctor`๋„ ์„ค์น˜ ๋ชจ๋“œ(์˜ˆ์ „/ํ˜„์žฌ/ํ˜ผํ•ฉ)๋ฅผ ์ง„๋‹จํ•ด ์•Œ๋ ค ์ค๋‹ˆ๋‹ค.
327
-
328
- ---
329
-
330
- ## ์ง€์› ๋ฒ”์œ„
331
-
332
- | ํ™˜๊ฒฝ | ์ƒํƒœ |
333
- |---|---|
334
- | **npm** | ์™„์ „ ์ง€์› โ€” ๋งค ๋ฆด๋ฆฌ์Šค packed tarball smoke๋กœ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค |
335
- | **pnpm ยท yarn** (`node_modules` linker) | ์ง€์› โ€” `node_modules/.bin/commitgate`๋กœ ํ•ด์†Œ๋˜๋Š” ํ‘œ์ค€ ๊ฒฝ๋กœ๋ฅผ ์”๋‹ˆ๋‹ค |
336
- | **Yarn PnP** | **์ด๋ฒˆ ๋ฆด๋ฆฌ์Šค ๋ฏธ์ง€์›**(๊ฒ€์ฆํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค). `nodeLinker: node-modules`๋ฅผ ์“ฐ์„ธ์š” |
337
- | **workspace/monorepo** | **์›Œํฌ์ŠคํŽ˜์ด์Šค root ์„ค์น˜**๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค(root์— `req.config.json`ยท`workflow/`). ํ•˜์œ„ ํŒจํ‚ค์ง€์— ๋…๋ฆฝ ์„ค์น˜ํ•˜๋Š” ๋ฐฐ์น˜๋Š” ๋ฏธ์ง€์› |
338
-
339
- **์žฌํ˜„์„ฑ**: `req.config.json`์˜ ๋ฆฌ๋ทฐ ๋ชจ๋ธยท์ถ”๋ก ๊ฐ•๋„ ํ•€๊ณผ ์Šคํ‚ค๋งˆยทpersona๊ฐ€ ํ”„๋กœ์ ํŠธ์— ๋‚จ์•„ ๊ณผ๊ฑฐ ๋ฆฌ๋ทฐ ์ž…๋ ฅ์ด git ์ด๋ ฅ์œผ๋กœ ์žฌํ˜„๋ฉ๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„ ๋ฒ„์ „์€ **lockfile์ด ๊ณ ์ •**ํ•˜๋ฏ€๋กœ `package-lock.json`(pnpm/yarn์€ ๊ฐ lockfile)์„ **์ปค๋ฐ‹ํ•˜์„ธ์š”**.
340
-
341
- ### Companion Skills ๋ฐœ๊ฒฌ ๋ฒ”์œ„
342
-
343
- **์„ค์น˜๋Š” ๋ชจ๋“  ํ™˜๊ฒฝ์—์„œ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.** ์•„๋ž˜๋Š” harness๊ฐ€ ๊ทธ ํŒŒ์ผ์„ **๋ฐœ๊ฒฌํ•˜๋Š”์ง€**์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
344
-
345
- | harness | ๋ฐœ๊ฒฌ |
346
- |---|---|
347
- | **Claude Code** | `.claude/skills/<์ด๋ฆ„>/SKILL.md`๋ฅผ native๋กœ ์ฝ์Šต๋‹ˆ๋‹ค |
348
- | **Cursor (editor)** | `.claude/skills`๋ฅผ ํ˜ธํ™˜ ๊ฒฝ๋กœ๋กœ ์ฝ์Šต๋‹ˆ๋‹ค |
349
- | **Cursor (CLI)** | โš ๏ธ **๋ฒ„์ „ยท์‹คํ–‰ ๋ชจ๋“œ๋ณ„ ๋™์ž‘ ์ฐจ์ด ๊ฐ€๋Šฅ โ€” ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค** |
350
- | **Codex** | **์ œํ’ˆ ๋ฒ”์œ„ ๋ฐ–** โ€” companion entrypoint๋ฅผ ์„ค์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. CommitGate์—์„œ Codex๋Š” **Reviewer**์ด๊ณ  ์ด 4์ข…์€ **Builder ๋ณด์กฐ**์ž…๋‹ˆ๋‹ค |
351
-
352
- โš ๏ธ **๊ทผ๊ฑฐ๋Š” ๋ฒค๋” 1์ฐจ ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค โ€” CommitGate ํŒ€์ด ์‹ค์ธกํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.** ํ™•์ธ ์‹œ์  **2026-07-17**, ํ™•์ธ ํ™˜๊ฒฝ win32 x64 / Node v20.19.5.
353
- ๋ฒค๋”๊ฐ€ ๋™์ž‘์„ ๋ฐ”๊พธ๋ฉด ์ด ํ‘œ๋Š” ๋‚ก์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
354
-
355
- โš ๏ธ **Cursor CLI๋ฅผ "์ง€์›"ยท"๋ฏธ์ง€์›" ์–ด๋А ์ชฝ์œผ๋กœ๋„ ๋‹จ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.** Cursor๋Š” editorยทCLI ์–‘์ชฝ์˜ Agent Skills ์ง€์›์„
356
- ๋ฐœํ‘œํ–ˆ์ง€๋งŒ, `.claude/skills` ํ˜ธํ™˜ ๊ฒฝ๋กœ์˜ CLI ๋ฐœ๊ฒฌ์€ ๋ฒ„์ „ยท๋ชจ๋“œ์— ๋”ฐ๋ผ ์ฐจ์ด๊ฐ€ ๋ณด๊ณ ๋ผ ์žˆ๊ณ  ์šฐ๋ฆฌ๋Š” ๊ฒ€์ฆํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.
357
- ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š์•„๋„ **ํ•ต์‹ฌ ์›Œํฌํ”Œ๋กœ์—๋Š” ์˜ํ–ฅ์ด ์—†์Šต๋‹ˆ๋‹ค** โ€” ์Šคํ‚ฌ์€ ํ’ˆ์งˆ ๋ณด์กฐ ๋ ˆ์ด์–ด์ด๊ณ  ๊ณ„์•ฝ ์ •๋ณธ์€ `AGENTS.md`์ž…๋‹ˆ๋‹ค.
358
-
359
- ์šฐํšŒ๋ฅผ ์œ„ํ•ด `.cursor/skills`์— **์ด์ค‘ ์„ค์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค** โ€” ๊ทธ ๊ฒฝ๋กœ๋„ CLI์—์„œ ๋™์ž‘์ด ๋ถˆํ™•์‹คํ•˜๊ณ , ๊ฐ™์€ ๋‚ด์šฉ์ด ๋‘ ๊ณณ์—
360
- ๊น”๋ฆฌ๋ฉด drift ์œ„ํ—˜์ด ์ƒ๊น๋‹ˆ๋‹ค. ๋ฒค๋”๊ฐ€ ๊ณ ์น˜๋ฉด **์šฐ๋ฆฌ ๋ณ€๊ฒฝ ์—†์ด** ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค(๊ฐ™์€ ๊ฒฝ๋กœ๋ฅผ ์ฝ์œผ๋ฏ€๋กœ).
361
-
362
- ---
363
-
364
- ## ์ œ๊ฑฐํ•˜๋ ค๋ฉด
365
-
366
- CommitGate๋Š” ๋‘ ๊ณณ์— ์žˆ์Šต๋‹ˆ๋‹ค. **๋Ÿฐํƒ€์ž„**(`node_modules/commitgate`)๊ณผ **ํ”„๋กœ์ ํŠธ์— ๊น”๋ฆฐ ๊ฑฐ๋ฒ„๋„Œ์Šค ํŒŒ์ผ**์ž…๋‹ˆ๋‹ค.
367
-
368
- ๋Ÿฐํƒ€์ž„์€ package manager๊ฐ€ ์ง€์›๋‹ˆ๋‹ค:
369
-
370
- ```sh
371
- npm uninstall -D commitgate # pnpm remove -D commitgate ยท yarn remove commitgate
372
- ```
373
-
374
- ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์€ ์•„๋ž˜ ๊ณ„ํš์„ ๋ณด๊ณ  ์ง์ ‘ ์ •๋ฆฌํ•˜์„ธ์š”. ๋จผ์ € ์•Œ์•„๋‘˜ ๊ฒƒ: **`npx commitgate`๋Š” ์ „์—ญ ์„ค์น˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.** npx๋Š” ํŒจํ‚ค์ง€๋ฅผ npm ์บ์‹œ(`_npx/<hash>/`)์— ๋ฐ›์•„ ํ•œ ๋ฒˆ ์‹คํ–‰ํ•  ๋ฟ์ด๊ณ , ์ „์—ญ `node_modules`์—๋„ PATH์—๋„ ์•„๋ฌด๊ฒƒ๋„ ๋‚จ๊ธฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
375
-
376
- ์ œ๊ฑฐ ๊ณ„ํš์„ ๋จผ์ € ํ™•์ธํ•˜์„ธ์š”. ์ด ๋ช…๋ น์€ **์•„๋ฌด๊ฒƒ๋„ ์ง€์šฐ์ง€ ์•Š๊ณ ** ๊ณ„ํš๋งŒ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค:
377
-
378
- ```sh
379
- npx commitgate uninstall
380
- ```
381
-
382
- repo๋ฅผ ์ฝ์–ด (1) CommitGate๊ฐ€ ์„ค์น˜ํ•œ ํŒŒ์ผ ์ค‘ ํŒจํ‚ค์ง€ ์›๋ณธ๊ณผ ๋ฐ”์ดํŠธ๊ฐ€ ๋™์ผํ•œ ๊ฒƒ, (2) ํŽธ์ง‘๋ผ์„œ ์ง์ ‘ ํ™•์ธ์ด ํ•„์š”ํ•œ ๊ฒƒ, (3) ์ž๋™ ์ œ๊ฑฐํ•˜๋ฉด ์•ˆ ๋˜๋Š” ๊ฒƒ, (4) ๊ฐ์‚ฌ ์ฆ๊ฑฐ๋ฅผ ๋ถ„๋ฅ˜ํ•ด ๋ณด์—ฌ์ฃผ๊ณ , ์ปค๋ฐ‹ ์—ฌ๋ถ€์— ๋งž๋Š” ๋˜๋Œ๋ฆฌ๊ธฐ ๋ช…๋ น์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์‚ญ์ œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒ€ํ† ํ•œ ๋’ค ์ง์ ‘ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
383
-
384
- ### ์™œ ์ž๋™์œผ๋กœ ์ง€์›Œ์ฃผ์ง€ ์•Š๋‚˜์š”?
385
-
386
- `init`์€ **๋ฌด์—‡์„ ์ƒˆ๋กœ ๋งŒ๋“ค์—ˆ๋Š”์ง€ ๋””์Šคํฌ์— ๊ธฐ๋กํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.** ๊ทธ๋ž˜์„œ ์ œ๊ฑฐ ์‹œ์ ์—๋Š” ์•„๋ž˜๋ฅผ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
387
-
388
- - `AGENTS.md`๋Š” **์—†์„ ๋•Œ๋งŒ** ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์žˆ์—ˆ๋‹ค๋ฉด ๊ทธ๋Œ€๋กœ ๋‘๋ฏ€๋กœ, init์ด ๋งŒ๋“  ํŒŒ์ผ๊ณผ ์‚ฌ์šฉ์ž๊ฐ€ ์“ด ํŒŒ์ผ์ด ๋””์Šคํฌ์ƒ ๊ฐ™์•„ ๋ณด์ž…๋‹ˆ๋‹ค.
389
- - `req.config.json`์€ ์ด๋ฏธ ์žˆ์œผ๋ฉด **๋ˆ„๋ฝ๋œ ํ‚ค๋งŒ ๋ณ‘ํ•ฉ**ํ•ฉ๋‹ˆ๋‹ค. ์›๋ณธ์„ ๋ณด๊ด€ํ•˜์ง€ ์•Š์•„ ๋ณ‘ํ•ฉ์„ ๋˜๋Œ๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
390
- - `package.json`์€ **์—†๋Š” ํ‚ค๋งŒ** ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค. ์›๋ž˜ ์žˆ๋˜ `req:doctor`๋‚˜ `cross-spawn`์€ CommitGate ์†Œ์œ ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. `ajv`ยท`cross-spawn`ยท`tsx`๋Š” ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋„ ํ”ํžˆ ์“ฐ๋Š” devDependency์ž…๋‹ˆ๋‹ค.
391
- - `ticketRoot`(๊ธฐ๋ณธ `workflow/`)์—๋Š” REQ ํ‹ฐ์ผ“์˜ `state.json`๊ณผ `approvals.jsonl` โ€” ์ด ๋„๊ตฌ์˜ **๊ฐ์‚ฌ ์ฆ๊ฑฐ** โ€” ๊ฐ€ ์Œ“์ž…๋‹ˆ๋‹ค.
392
-
393
- ์›์žฅ์ด ์—†๋Š” ์ƒํƒœ์—์„œ ์ผ๊ด„ ์‚ญ์ œํ•˜๋ฉด ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ๊ดดํ•ฉ๋‹ˆ๋‹ค. CommitGate๋Š” git hook์„ ์„ค์น˜ํ•˜์ง€ ์•Š๊ณ  git config๋„ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๋Š” ์ˆœ์ˆ˜ in-tree ์Šค์บํด๋”์ด๋ฏ€๋กœ, ๋˜๋Œ๋ฆฌ๊ธฐ์˜ ์ •๋ณธ์€ git์ž…๋‹ˆ๋‹ค.
394
-
395
- ### ์•„์ง ์ปค๋ฐ‹ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด
396
-
397
- ```sh
398
- git status --porcelain -uall # ๋ฌด์—‡์ด ์ถ”๊ฐ€๋๋Š”์ง€ ํ™•์ธ
399
- git diff -- package.json # ์ฃผ์ž…๋œ req:* ์Šคํฌ๋ฆฝํŠธ์™€ devDependencies ํ™•์ธ
400
- ```
401
-
402
- ํ™•์ธํ•œ ๋’ค ์ง์ ‘ ๋˜๋Œ๋ฆฝ๋‹ˆ๋‹ค. `package.json`์€ ๋ฐ˜๋“œ์‹œ `HEAD` ๊ธฐ์ค€์œผ๋กœ ๋ณต์›ํ•˜์„ธ์š”.
403
-
404
- ```sh
405
- git checkout HEAD -- package.json
406
- ```
407
-
408
- > โš ๏ธ `HEAD`๋ฅผ ๋นผ๋ฉด **์ธ๋ฑ์Šค**์—์„œ ๋ณต์›๋˜์–ด, `git add` ์ดํ›„์—๋Š” ์ฃผ์ž…๋œ `req:*` ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๊ทธ๋Œ€๋กœ ๋‚จ์Šต๋‹ˆ๋‹ค.
409
- > โš ๏ธ ์ด ๋ช…๋ น์€ `package.json`์˜ **๋‹ค๋ฅธ ๋ฏธ์ปค๋ฐ‹ ํŽธ์ง‘๋„ ํ•จ๊ป˜ ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.** ๋จผ์ € ์œ„ diff๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
410
-
411
- ํŒŒ์ผ ์‚ญ์ œ๋Š” `npx commitgate uninstall`์ด ๋‚˜์—ดํ•ด ์ค€ ๊ฒฝ๋กœ๋งŒ ์ง€์šฐ์„ธ์š”. `scripts/req/`๋‚˜ `workflow/`๋ฅผ ๋””๋ ‰ํ„ฐ๋ฆฌ์งธ ์ง€์šฐ๋ฉด ๊ทธ ์•ˆ์˜ ์‚ฌ์šฉ์ž ํŒŒ์ผ์ด๋‚˜ ํ‹ฐ์ผ“ ์ฆ๊ฑฐ๊ฐ€ ํ•จ๊ป˜ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.
412
-
413
- > git์€ ๋นˆ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ถ”์ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ์„ ๋‹ค ์ง€์šด ๋’ค `git status`๊ฐ€ clean์ด์–ด๋„ ๋นˆ `scripts/`ยท`workflow/`ยท`.claude/`ยท`.cursor/`๊ฐ€ ํŒŒ์ผ์‹œ์Šคํ…œ์— ๋‚จ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
414
-
415
- ### ์ด๋ฏธ ์ปค๋ฐ‹ํ–ˆ๋‹ค๋ฉด
416
-
417
- ์Šค์บํด๋”ฉ์„ ์ถ”๊ฐ€ํ•œ ์ปค๋ฐ‹์„ ๋˜๋Œ๋ฆฝ๋‹ˆ๋‹ค.
418
-
419
- ```sh
420
- git log --diff-filter=A --format='%H %s' -- scripts/req/req-new.ts
421
- git revert <sha>
422
- ```
423
-
424
- `npx commitgate uninstall`์ด ๋„์ž… ์ปค๋ฐ‹ ํ›„๋ณด๋ฅผ ์ฐพ์•„ ์ค๋‹ˆ๋‹ค. ๊ทธ ์ปค๋ฐ‹์— ๋‹ค๋ฅธ ๋ณ€๊ฒฝ์ด ์„ž์—ฌ ์žˆ์œผ๋ฉด revert๊ฐ€ ๋ฌด๊ด€ํ•œ ์ž‘์—…๊นŒ์ง€ ๋˜๋Œ๋ฆฌ๋ฏ€๋กœ, ๋จผ์ € `git show <sha>`๋กœ ํ™•์ธํ•˜์„ธ์š”. ๋„์ž… ์ปค๋ฐ‹์ด ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ํฉ์–ด์ ธ ์žˆ์œผ๋ฉด ๋‹จ์ผ revert๋กœ๋Š” ๋˜๋Œ๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
425
-
426
- ### npx ์บ์‹œ ์ •๋ฆฌ (repo์™€ ๋ฌด๊ด€)
427
-
428
- ์ „์—ญ ์„ค์น˜ ์—ฌ๋ถ€๋ถ€ํ„ฐ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
429
-
430
- ```sh
431
- npm ls -g commitgate # ๋น„์–ด ์žˆ์œผ๋ฉด ์ „์—ญ ์„ค์น˜๊ฐ€ ์•„๋‹˜
432
- npm uninstall -g commitgate # ์ „์—ญ์œผ๋กœ ์„ค์น˜ํ–ˆ๋˜ ๊ฒฝ์šฐ์—๋งŒ
433
- ```
434
-
435
- npx๊ฐ€ ๋ฐ›์•„ ๋‘” ํŒจํ‚ค์ง€๋Š” npm ์บ์‹œ์˜ `_npx/` ์•„๋ž˜์— ๋‚จ์Šต๋‹ˆ๋‹ค.
436
-
437
- ```powershell
438
- # Windows (PowerShell)
439
- Remove-Item -Recurse -Force "$(npm config get cache)\_npx"
440
- ```
441
-
442
- ```sh
443
- # macOS / Linux
444
- rm -rf "$(npm config get cache)/_npx"
445
- ```
446
-
447
- > โš ๏ธ **`npm cache clean --force`๋Š” CommitGate ์ œ๊ฑฐ ๋ช…๋ น์ด ์•„๋‹™๋‹ˆ๋‹ค.** ์ด ๋ช…๋ น์€ `_cacache`๋งŒ ๋น„์šฐ๊ณ  `_npx`๋Š” ๊ทธ๋Œ€๋กœ ๋‘ก๋‹ˆ๋‹ค. repo์˜ ์Šค์บํด๋”ฉ๊ณผ๋„ ์•„๋ฌด ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค.
448
-
449
- ---
450
-
451
- ## ์ค€๋น„๋ฌผ
452
-
453
- | ํ•„์š” | ํ™•์ธ ๋ช…๋ น | ๋น„๊ณ  |
454
- |---|---|---|
455
- | Git | `git --version` | ํ•„์ˆ˜ |
456
- | Node.js 18.17+ | `node --version` | ํ•„์ˆ˜ |
457
- | npm, pnpm, yarn ์ค‘ ํ•˜๋‚˜ | `npm --version` | npm ๊ธฐ์ค€์œผ๋กœ ์•ˆ๋‚ด |
458
- | Codex CLI | `codex --version` | ๋ฆฌ๋ทฐ ์‹คํ–‰์— ํ•„์š” |
459
-
460
- Codex CLI๊ฐ€ ์—†๋‹ค๋ฉด:
461
-
462
- ```sh
463
- npm install -g @openai/codex
464
- codex login
465
- codex login status
466
- ```
467
-
468
- Windows์—์„œ ์„ค์น˜ ์งํ›„ `codex` ๋ช…๋ น์„ ๋ชป ์ฐพ์œผ๋ฉด ์ƒˆ ํ„ฐ๋ฏธ๋„์„ ์—ด์–ด PATH๋ฅผ ๋‹ค์‹œ ์ฝ๊ฒŒ ํ•˜์„ธ์š”.
469
-
470
- ---
471
-
472
- ## ์ˆ˜๋™ ๋ช…๋ น
473
-
474
- ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž๋Š” `req:next`๊ฐ€ ์‹œํ‚ค๋Š” ๋Œ€๋กœ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ๋‚ด๋ถ€์—์„œ ์–ด๋–ค ๋ช…๋ น์ด ์‹คํ–‰๋˜๋Š”์ง€ ์ดํ•ดํ•˜๊ฑฐ๋‚˜ ์ง์ ‘ ๋””๋ฒ„๊น…ํ•  ๋•Œ๋งŒ ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค.
475
-
476
- ```sh
477
- # 1. ํ‹ฐ์ผ“๊ณผ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ
478
- npm run req:new -- my-feature --run
479
-
480
- # 2. ์„ค๊ณ„ ๋ฌธ์„œ ์ž‘์„ฑ ํ›„ stage
481
- git add workflow/REQ-2026-001/00-requirement.md workflow/REQ-2026-001/01-design.md workflow/REQ-2026-001/02-plan.md
482
-
483
- # 3. ์„ค๊ณ„ ๋ฆฌ๋ทฐ
484
- npm run req:review-codex -- 2026-001 --kind design --run
485
-
486
- # 4. ์ฝ”๋“œ ๊ตฌํ˜„ ํ›„ stage
487
- git add <changed-source-files>
488
-
489
- # 5. ๊ฒŒ์ดํŠธ ์ ๊ฒ€
490
- npm run req:doctor -- 2026-001
491
-
492
- # 6. ๊ตฌํ˜„ ๋ฆฌ๋ทฐ
493
- npm run req:review-codex -- 2026-001 --kind phase --run
494
-
495
- # 7. ์Šน์ธ๋œ ์ฝ”๋“œ ์ปค๋ฐ‹
496
- npm run req:commit -- 2026-001 --run -m "feat: my feature"
497
- ```
498
-
499
- ์ค‘์š”: source ์ปค๋ฐ‹์—๋Š” ๋‚ด๊ฐ€ ๋งŒ๋“  ์ฝ”๋“œ์™€ ๋ฌธ์„œ๋งŒ stageํ•˜์„ธ์š”. `state.json`๊ณผ `responses/`๋Š” ๋„๊ตฌ๊ฐ€ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
500
-
501
- ์—ฌ๋Ÿฌ ์ค„ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋Š” `-m` ๋Œ€์‹  ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
502
-
503
- ```sh
504
- npm run req:commit -- 2026-001 --run --message-file commit-message.txt
505
- ```
506
-
507
- ---
508
-
509
- ## ๋ช…๋ น์–ด ์š”์•ฝ
510
-
511
- | ๋ช…๋ น | ์šฉ๋„ |
512
- |---|---|
513
- | `npm install -D commitgate` | **๋Ÿฐํƒ€์ž„ ์„ค์น˜ (์„ ํ–‰ ํ•„์ˆ˜)** โ€” ์‹คํ–‰ ์ฝ”๋“œ๊ฐ€ `node_modules/commitgate`์— ๋“ค์–ด์˜ต๋‹ˆ๋‹ค |
514
- | `npx commitgate init` | ํ”„๋กœ์ ํŠธ์— ์„ค์ •ยท๊ณ„์•ฝยท์Šคํ‚ค๋งˆ์™€ `req:*` ์Šคํฌ๋ฆฝํŠธ ์„ค์น˜ |
515
- | `npx commitgate init --dry-run` | ํŒŒ์ผ์„ ์“ฐ์ง€ ์•Š๊ณ  ์„ค์น˜ ๊ณ„ํš ํ™•์ธ |
516
- | `npx commitgate init --strict` | ์ •ํ•ฉ์„ฑ ๊ฒฝ๊ณ ๋ฅผ ์„ค์น˜ ์‹คํŒจ๋กœ ์ฒ˜๋ฆฌ (gitignore๋œ ๊ณ„์•ฝ ํฌ์ธํ„ฐ, ์„ค์น˜ ์ปค๋ฐ‹์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์—†๋Š” ์›Œํ‚นํŠธ๋ฆฌ ๋“ฑ) โ€” ํŒŒ์ผ์„ ํ•˜๋‚˜๋„ ์“ฐ๊ธฐ ์ „์— ์ค‘๋‹จ |
517
- | `npx commitgate init --no-agent-entrypoints` | `.claude/`ยท`.cursor/`ยท`CLAUDE.md` ์„ค์น˜ ๊ฑด๋„ˆ๋›ฐ๊ธฐ |
518
- | `npx commitgate sync [--apply] [--persona]` | ์—…๊ทธ๋ ˆ์ด๋“œ ํ›„ vendored **์Šคํ‚ค๋งˆ ์ถ•**(machineยทreq.config schema)์„ ์„ค์น˜ ํŒจํ‚ค์ง€ ์‚ฌ๋ณธ์œผ๋กœ ์žฌ๋™๊ธฐํ™” (๊ธฐ๋ณธ: ๊ณ„ํš๋งŒ). `--persona`๋Š” ํŽ˜๋ฅด์†Œ๋‚˜ **๋ถ€์žฌ ๋ณต์›๋งŒ**(์‚ฌ์šฉ์ž ์ˆ˜์ •๋ณธ ๋ฏธํ›ผ์†). ์ž์„ธํžˆ๋Š” [์—…๊ทธ๋ ˆ์ด๋“œ (0.x)](#์—…๊ทธ๋ ˆ์ด๋“œ-0x) |
519
- | `npx commitgate migrate [--apply]` | ์˜ˆ์ „ vendored ์„ค์น˜๋ณธ โ†’ ๋Ÿฐํƒ€์ž„ ํŒจํ‚ค์ง€ ์ „ํ™˜ (๊ธฐ๋ณธ: ๊ณ„ํš๋งŒ, ๋น„ํŒŒ๊ดด) |
520
- | `npx commitgate uninstall` | ์ œ๊ฑฐ ๊ณ„ํš ํ™•์ธ (์ฝ๊ธฐ ์ „์šฉ โ€” ์•„๋ฌด๊ฒƒ๋„ ์ง€์šฐ์ง€ ์•Š์Œ) |
521
- | `npm uninstall -D commitgate` | ๋Ÿฐํƒ€์ž„ ์ œ๊ฑฐ |
522
- | `npm run req:new -- <slug> --run [--successor-of <REQ-id>]` | REQ ํ‹ฐ์ผ“, ๋ธŒ๋žœ์น˜, ์„ค๊ณ„๋ฌธ์„œ ์ƒ์„ฑ. `--successor-of`๋Š” ๋Œ€์ฒด REQ (์•„๋ž˜ ์ฐธ์กฐ) |
523
- | `npm run req:next -- <id> [--json]` | **๋‹ค์Œ ํ–‰๋™ ๊ณ„์‚ฐ** (์ฝ๊ธฐ ์ „์šฉ) |
524
- | `npm run req:review-codex -- <id> --kind design --run` | ์„ค๊ณ„ ๋ฆฌ๋ทฐ |
525
- | `npm run req:review-codex -- <id> --kind phase --phase <p> --run` | ๊ตฌํ˜„ ๋ฆฌ๋ทฐ |
526
- | `npm run req:doctor -- <id>` | ๊ฒŒ์ดํŠธ ์ƒํƒœ ํ™•์ธ |
527
- | `npm run req:commit -- <id> --run -m "message"` | ์Šน์ธ๋œ ๋ณ€๊ฒฝ ์ปค๋ฐ‹ |
528
-
529
- `req:*`๋Š” PATH์— ์žกํžˆ๋Š” ์‹คํ–‰ ํŒŒ์ผ์ด ์•„๋‹ˆ๋ผ **`package.json` ์Šคํฌ๋ฆฝํŠธ**์ž…๋‹ˆ๋‹ค. npm์€ ์ธ์ž ์ „๋‹ฌ์— `--` ๊ตฌ๋ถ„์ž๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
530
-
531
- ```sh
532
- npm run req:next -- 2026-002 # npm
533
- pnpm req:next 2026-002 # pnpm
534
- yarn req:next 2026-002 # yarn
535
- ```
536
-
537
- **๋Œ€์ฒด REQ (`--successor-of`)**: ์–ด๋–ค review series๊ฐ€ ๋ฏธ์ˆ˜๋ ด์ด๋ผ๊ณ  ํŒ๋‹จํ•ด ์‚ฌ๋žŒ์ด ๊ทธ๊ฒƒ์„ `human-resolution`์œผ๋กœ **๋Œ€์ฒด(replace)** ์ข…๊ฒฐํ•œ ๊ฒฝ์šฐ์—๋งŒ, `req:new --successor-of <REQ-id>`๋กœ ๋ถ€๋ชจ ์ด๋ ฅ(์‹œ๋„ ํ•ฉ๊ณ„ยท์ข…๊ฒฐ ๊ธฐ๋ก)์„ ๋ณด์กดํ•œ ๋Œ€์ฒด REQ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ€๋ชจ์— ์œ ํšจํ•œ replace ์ข…๊ฒฐ ๊ธฐ๋ก์ด ์—†์œผ๋ฉด ํ‹ฐ์ผ“ ์ƒ์„ฑ์ด fail-closed๋กœ ๋ง‰ํž™๋‹ˆ๋‹ค โ€” ์ผ๋ฐ˜์ ์ธ ์ƒˆ REQ ์ƒ์„ฑ ์ž์ฒด๋ฅผ ๋„๊ตฌ๊ฐ€ ๋ง‰๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.
538
-
539
- ---
540
-
541
- ## ์„ค์ •
542
-
543
- ๋Œ€๋ถ€๋ถ„์€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•˜๋ฉด ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์˜ `req.config.json`์„ ์ˆ˜์ •ํ•˜์„ธ์š”.
544
-
545
- | ํ•ญ๋ชฉ | ๊ธฐ๋ณธ๊ฐ’ | ์„ค๋ช… |
546
- |---|---|---|
547
- | `branchPrefix` | `"feat/req-"` | ์ƒˆ ๋ธŒ๋žœ์น˜ prefix |
548
- | `ticketRoot` | `"workflow"` | REQ ํ‹ฐ์ผ“ ํด๋” |
549
- | `packageManager` | ์ž๋™ ๊ฐ์ง€ | `npm`, `pnpm`, `yarn` |
550
- | `designDocs` | `00/01/02` ๋ฌธ์„œ | ์„ค๊ณ„ ๋ฌธ์„œ ํŒŒ์ผ๋ช… |
551
- | `reviewPersonaPath` | `"workflow/review-persona.md"` | ๋ฆฌ๋ทฐ ํ”„๋กฌํ”„ํŠธ ์ฒซ ๋ธ”๋ก. `null`์ด๋ฉด ๋น„ํ™œ์„ฑ โ€” ๋‹จ delta design ๋ฆฌ๋ทฐ์—๋Š” ๋‚ด์žฅ delta ๊ณ„์•ฝ์ด ์ฃผ์ž…๋œ๋‹ค |
552
- | `reviewModel` | `"gpt-5.6-terra"` | codex ๋ฆฌ๋ทฐ ๋ชจ๋ธ(`-c model=`๋กœ ๊ณ ์ •). `null`์ด๋ฉด codex ์ „์—ญ ์„ค์ •์„ ์ƒ์† |
553
- | `reviewReasoningEffort` | `"high"` | codex ๋ฆฌ๋ทฐ ์ถ”๋ก ๊ฐ•๋„. `none`ยท`minimal`ยท`low`ยท`medium`ยท`high`ยท`xhigh` ์ค‘ ํ•˜๋‚˜. `null`์ด๋ฉด ์ „์—ญ ์ƒ์† |
554
- | `reviewBudget` | `{ "autoBudget": 5, "hardCap": 8 }` | ์—ด๋ฆฐ `(review_kind, phase_id)` review series์˜ ์žฌ๋ฆฌ๋ทฐ ์‹œ๋„ ์˜ˆ์‚ฐ. ๊ธฐ๋ณธ๊ฐ’ ๊ธฐ์ค€ 1~5ํšŒ์ฐจ๋Š” ์ž๋™, 6~8ํšŒ์ฐจ๋Š” ํšŒ์ฐจ๋งˆ๋‹ค ๊ทธ seriesยทํšŒ์ฐจ์— ๋ฐ”์ธ๋”ฉ๋œ ์‚ฌ๋žŒ ์˜ˆ์™ธ ๊ธฐ๋ก์ด ์žˆ์–ด์•ผ ์ง„ํ–‰, `hardCap` ํšŒ๋ฅผ ์ด๋ฏธ ์†Œ์ง„ํ•˜๋ฉด ๊ทธ ๋‹ค์Œ ์‹œ๋„(9ํšŒ์ฐจ๋ถ€ํ„ฐ)๋Š” ์˜ˆ์™ธ๊ฐ€ ์žˆ์–ด๋„ ์ฐจ๋‹จ. `hardCap โ‰ค 8`ยท`autoBudget โ‰ค hardCap` |
555
- | `phaseCommit` | `{ "autoApprove": "never" }` | phase ์ž๋™ ์ปค๋ฐ‹ ์ •์ฑ…. `never`(๊ธฐ๋ณธ)๋ฉด ๋งค phase ์ปค๋ฐ‹ ์ „์— ์‚ฌ๋žŒ ํ™•์ธ(ํ˜„ํ–‰). `low-only`๋ฉด **LOW ์œ„ํ—˜** ํ‹ฐ์ผ“์˜ Codex ์Šน์ธ phase๋ฅผ ์‚ฌ๋žŒ ์ •์ง€ ์—†์ด ์ž๋™ ์ปค๋ฐ‹ํ•˜๊ณ  ์‚ฌ๋žŒ ํ™•์ธ์€ featureโ†’main ๋ณ‘ํ•ฉ ์ง์ „ ํ•œ ๋ฒˆ์œผ๋กœ ๋ชจ์€๋‹ค. HIGH ํ‹ฐ์ผ“์€ ์–ด๋А ๊ฐ’์—์„œ๋„ ๋งค phase ํ™•์ธ(`userConfirmGate` ๋ฐฑ์Šคํ†ฑ). `"all"` ๊ฐ™์€ ๊ฐ’์€ ์—†๋‹ค(HIGH livelock ๋ฐฉ์ง€) |
556
-
557
- ๋นˆ `branchPrefix`๋‚˜ ํ”„๋กœ์ ํŠธ ๋ฐ–์œผ๋กœ ๋‚˜๊ฐ€๋Š” ๊ฒฝ๋กœ๋Š” ๊ฑฐ๋ถ€๋ฉ๋‹ˆ๋‹ค.
558
-
559
- **๋ฆฌ๋ทฐ ๋ชจ๋ธยท์ถ”๋ก ๊ฐ•๋„ ๊ณ ์ •**: `req:review-codex`๋Š” codex ์ธ์ž์— `-c model=`ยท`-c model_reasoning_effort=`๋ฅผ ์ฃผ์ž…ํ•ด **๋ชจ๋ธ๊ณผ ์ถ”๋ก ๊ฐ•๋„๋ฅผ ๊ณ ์ •**ํ•ฉ๋‹ˆ๋‹ค. ๊ณ ์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฆฌ๋ทฐ๊ฐ€ ์‚ฌ์šฉ์ž ์ „์—ญ `~/.codex/config.toml`(์˜ˆ: `model_reasoning_effort="ultra"`)์„ ์ƒ์†ํ•ด ๋ฆฌ๋ทฐ 1ํšŒ๊ฐ€ ์ˆ˜ ๋ถ„ยทํ† ํฐ ๊ณผ๋‹ค๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ `gpt-5.6-terra`/`high`์ด๊ณ , ํ”„๋กœ์ ํŠธ์˜ codex๊ฐ€ ๊ทธ ๋ชจ๋ธ์„ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฉด `req.config.json`์—์„œ ๋ฐ”๊พธ๊ฑฐ๋‚˜ `null`๋กœ ๋‘์–ด ์ „์—ญ ์„ค์ •์„ ์ƒ์†์‹œํ‚ต๋‹ˆ๋‹ค. override๊ฐ€ ์‹ค์ œ๋กœ ์กด์ค‘๋˜๋Š”์ง€๋Š” `npm run verify:overrides`(codex CLI ํ•„์š”)๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
560
-
561
- **์žฌ๋ฆฌ๋ทฐ๋Š” stateless**: ์žฌ๋ฆฌ๋ทฐ๋Š” ๋งค๋ฒˆ **์ƒˆ codex ์Šค๋ ˆ๋“œ**๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค(์ด์ „ ๋Œ€ํ™”๋ฅผ resumeํ•ด ๋ˆ„์ ํ•˜์ง€ ์•Š์Œ โ€” ํ† ํฐ ์ฆ๊ฐ€์™€ findings ์‹ฌํ™”ยท์ด๋™์„ ๋ง‰์Šต๋‹ˆ๋‹ค). ์ง์ „ ๊ฐ™์€ ๋Œ€์ƒ์˜ NEEDS_FIX findings๋งŒ ์ฐธ๊ณ ์šฉ์œผ๋กœ ํ”„๋กฌํ”„ํŠธ์— ๋‹ด๊ฒจ ํ•ด์†Œ ์—ฌ๋ถ€(closure)๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
562
-
563
- ---
564
-
565
- ## FAQ
566
-
567
- **Codex CLI๊ฐ€ ์—†์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋‚˜์š”?**
568
- ๋ฆฌ๋ทฐ ๋ช…๋ น์ด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์กฐ์šฉํžˆ ์Šน์ธ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
569
-
570
- **์Šน์ธ ํ›„ ์ฝ”๋“œ๋ฅผ ์กฐ๊ธˆ ๊ณ ์น˜๋ฉด ์ปค๋ฐ‹๋˜๋‚˜์š”?**
571
- ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์Šน์ธ๋œ staged tree์™€ ๋‹ฌ๋ผ์ง€๋ฉด stale ์Šน์ธ์œผ๋กœ ๋ณด๊ณ  ๋‹ค์‹œ ๋ฆฌ๋ทฐ๋ฅผ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค.
572
-
573
- **`state.json`์ด๋‚˜ `responses/`๋Š” ์™œ stageํ•˜๋ฉด ์•ˆ ๋˜๋‚˜์š”?**
574
- ์›Œํฌํ”Œ๋กœ ์ฆ๊ฑฐ์™€ ์ƒํƒœ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. source ์ปค๋ฐ‹์— ์„ž์ด๋ฉด ์Šน์ธ ๋ฐ”์ธ๋”ฉ์ด ํ๋ ค์ง€๋ฏ€๋กœ `req:commit`์ด ๋ง‰์Šต๋‹ˆ๋‹ค.
575
-
576
- **cross-spawn ๋ฒ„์ „ ๊ฒฝ๊ณ ๊ฐ€ ๋‚˜์˜ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์š”?**
577
- ๋Œ€์ƒ ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ์กด `cross-spawn`์ด CommitGate๊ฐ€ ๊ฒ€์ฆํ•œ ํ•˜ํ•œ๋ณด๋‹ค ๋‚ฎ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. `npm i -D cross-spawn@^7.0.6`์œผ๋กœ ์˜ฌ๋ฆฌ์„ธ์š”. CI๋‚˜ ๋ณด์•ˆ ๋ฏผ๊ฐ ํ™˜๊ฒฝ์—์„œ๋Š” `npx commitgate --strict`๋ฅผ ์‚ฌ์šฉํ•ด ๊ฒฝ๊ณ ๋ฅผ ์‹คํŒจ๋กœ ๋‹ค๋ฃจ์„ธ์š”.
578
-
579
- **๋‘ ๋ฒˆ ์„ค์น˜ํ•˜๋ฉด ๋ฎ์–ด์“ฐ๋‚˜์š”?**
580
- ์•„๋‹ˆ์š”. ๊ธฐ์กด ํŒŒ์ผ์€ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค. ๊ฐ•์ œ๋กœ ๊ฐฑ์‹ ํ•˜๋ ค๋ฉด `--force`๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
581
-
582
- ---
583
-
584
- ## ํ˜„์žฌ ๋ฒ”์œ„
585
-
586
- ํ˜„์žฌ ๋ฒ„์ „์€ **๋Ÿฐํƒ€์ž„ ํŒจํ‚ค์ง€ ๋ชจ๋ธ**์ž…๋‹ˆ๋‹ค. ์‹คํ–‰ ์ฝ”๋“œ์™€ ๋Ÿฐํƒ€์ž„ ์˜์กด์„ฑ์€ `node_modules/commitgate`์—๋งŒ ์žˆ๊ณ , ํ”„๋กœ์ ํŠธ์—๋Š” ๊ฑฐ๋ฒ„๋„Œ์Šคยท๊ฐ์‚ฌ ๋ฐ์ดํ„ฐ์™€ `req:* = commitgate <verb>` ์Šคํฌ๋ฆฝํŠธ๋งŒ ๋‚จ์Šต๋‹ˆ๋‹ค. (์˜ˆ์ „ vendored scaffold ์„ค์น˜๋ณธ์€ [`migrate`](#์˜ˆ์ „-์„ค์น˜๋ณธ์—์„œ-์˜ฎ๊ฒจ์˜ค๊ธฐ-migrate)๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.)
587
-
588
- ํ˜„์žฌ ์šด์˜ ์ค‘์ธ ๊ฒ€์ฆ์ž…๋‹ˆ๋‹ค.
589
-
590
- - GitHub Actions์—์„œ `ubuntu-latest`, `macos-latest`, `windows-latest` ร— Node 18/20/22 ๋งคํŠธ๋ฆญ์Šค๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
591
- - `npm run smoke`๋Š” pack tarball์„ ์ž„์‹œ ํ”„๋กœ์ ํŠธ์— ์‹ค์ œ๋กœ ์„ค์น˜ํ•ด, ๋Œ€์ƒ์— `scripts/req/`๊ฐ€ **์—†๊ณ ** `tsx`ยท`ajv`ยท`cross-spawn`์ด **์ฃผ์ž…๋˜์ง€ ์•Š์œผ๋ฉฐ** ๋‹ค์„ฏ `req:*`๊ฐ€ ํŒจํ‚ค์ง€ bin์„ ๊ฐ€๋ฆฌํ‚ค๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  `npm run req:doctor`๊ฐ€ ์‹ค์ œ๋กœ ํŒจํ‚ค์ง€ ์•ˆ์˜ ๋ชจ๋“ˆ๊นŒ์ง€ dispatch๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. `migrate` ๋น„ํŒŒ๊ดด์„ฑ๋„ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.
592
- - Windows `.cmd` ๋ž˜ํผ ์ฃผ์ž… ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๊ฐ€ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €์™€ Codex wrapper ๊ฒฝ๋กœ๋ฅผ ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค.
593
-
594
- ์•„๋ž˜๋Š” ํ›„์† ๋ฒ”์œ„์ž…๋‹ˆ๋‹ค.
595
-
596
- - Yarn PnP ์ง€์›, ์›Œํฌ์ŠคํŽ˜์ด์Šค ํ•˜์œ„ ํŒจํ‚ค์ง€ ๋…๋ฆฝ ์„ค์น˜
597
- - ์ž์‚ฐโ†”๋Ÿฐํƒ€์ž„ ๋ฒ„์ „ ๋“œ๋ฆฌํ”„ํŠธ ํƒ์ง€
598
- - ๋น„-git VCS ์ง€์›
599
- - ๋” ๋‹ค์–‘ํ•œ ์„ค๊ณ„๋ฌธ์„œ ํ…œํ”Œ๋ฆฟ
600
-
601
- ---
602
-
603
- ## License
604
-
605
- [MIT](./LICENSE) ยฉ 2026 sol5288
1
+ # CommitGate
2
+
3
+ ๐ŸŒ **ํ•œ๊ตญ์–ด** ยท [English](./README.en.md)
4
+
5
+ **AI ์ฝ”๋”ฉ ๋ณ€๊ฒฝ์„ Codex ๋ฆฌ๋ทฐ ์Šน์ธ ์—†์ด๋Š” ์ปค๋ฐ‹ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋ง‰๋Š” ์ปค๋ฐ‹ ๊ฒŒ์ดํŠธ์ž…๋‹ˆ๋‹ค.**
6
+
7
+ [![CI](https://github.com/sol5288/commitgate/actions/workflows/ci.yml/badge.svg)](https://github.com/sol5288/commitgate/actions/workflows/ci.yml)
8
+ [![npm version](https://img.shields.io/npm/v/commitgate.svg)](https://www.npmjs.com/package/commitgate)
9
+ [![license](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE)
10
+
11
+ AI ์—์ด์ „ํŠธ๊ฐ€ ์ฝ”๋“œ๋ฅผ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค์–ด๋„, ๋ฆฌ๋ทฐ ์—†์ด ๋ฐ”๋กœ ์ปค๋ฐ‹๋˜๋ฉด ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค. CommitGate๋Š” ๋ณ€๊ฒฝ์„ ํ‹ฐ์ผ“(REQ) ๋‹จ์œ„๋กœ ๋ฌถ๊ณ , **Codex๊ฐ€ ์Šน์ธํ•œ staged tree๋งŒ** ์ปค๋ฐ‹๋˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์Šน์ธ ํ›„ ์ฝ”๋“œ๊ฐ€ ๋ฐ”๋€Œ๊ฑฐ๋‚˜ ์ฆ๊ฑฐ๊ฐ€ ๋ถ€์กฑํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ง‰์Šต๋‹ˆ๋‹ค.
12
+
13
+ ## ๋ฌด์—‡์„ ๋ง‰์•„ ์ฃผ๋‚˜์š”
14
+
15
+ - ๐Ÿ”’ **Codex ๋ฆฌ๋ทฐ ์Šน์ธ ์—†์ด๋Š” ์ปค๋ฐ‹๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.** ๋ฆฌ๋ทฐ๊ฐ€ ์‹คํŒจํ•˜๊ฑฐ๋‚˜ ์•„์˜ˆ ์—†์œผ๋ฉด `req:commit`์ด ํ†ต๊ณผ์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
16
+ - ๐Ÿ” **์Šน์ธ ํ›„ staged ๋ณ€๊ฒฝ์ด ๋ฐ”๋€Œ๋ฉด ๋‹ค์‹œ ๋ฆฌ๋ทฐ๋ฅผ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค.** ์Šน์ธ๋œ tree์™€ ์ง€๊ธˆ ์ปค๋ฐ‹ํ•˜๋ ค๋Š” tree๊ฐ€ ๋‹ค๋ฅด๋ฉด stale๋กœ ๋ณด๊ณ  ๋ง‰์Šต๋‹ˆ๋‹ค.
17
+ - ๐Ÿงฏ **์• ๋งคํ•˜๋ฉด ๋ง‰์Šต๋‹ˆ๋‹ค(fail-closed).** ์ง€์ ์€ ์—†์ง€๋งŒ ์Šน์ธ๋„ ์—†๋Š” ์‘๋‹ต, Codex CLI ๋ถ€์žฌยท์‹คํ–‰ ์‹คํŒจ๋Š” ์กฐ์šฉํžˆ ํ†ต๊ณผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
18
+
19
+ ๋ฌด์—‡์„ ๋ณด์žฅํ•˜๊ณ  ๋ฌด์—‡์€ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”์ง€ ์ „๋ฌธ์€ **[๋ณด์žฅ๊ณผ ํ•œ๊ณ„](https://github.com/sol5288/commitgate/blob/main/docs/guarantees.md)**.
20
+
21
+ ## โš ๏ธ ์‹œ์ž‘ ์ „์— ์•Œ์•„ ๋‘˜ ๊ฒƒ
22
+
23
+ - **๋ฆฌ๋ทฐ๋Š” staged diff ์ „๋ฌธ์„ ์™ธ๋ถ€(CodexยทOpenAI)๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.** `req:review-codex`๋Š” `git diff --cached` ์ „์ฒด๋ฅผ ๋ณด๋‚ด๊ณ , codex๋Š” `--sandbox read-only`๋กœ ์ €์žฅ์†Œ ๋ฃจํŠธ๋ฅผ ์ฝ์–ด diff์— ์—†๋Š” ํŒŒ์ผ๋„ ์ฝํž ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์Šคํ‚นยทํ•„ํ„ฐยท๊ธธ์ด ์ƒํ•œ์ด **์—†์œผ๋‹ˆ**, ๋ฆฌ๋ทฐ ์ „ staged ๋‚ด์šฉ์— ์ž๊ฒฉ์ฆ๋ช…ยทํ† ํฐยท๊ฐœ์ธ์ •๋ณด๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.
24
+ - **git hook์„ ์„ค์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค โ€” ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.** `req:commit` ๋Œ€์‹  `git commit`์„ ์ง์ ‘ ์น˜๋ฉด ๊ฒŒ์ดํŠธยท์Šน์ธ ๋ฐ”์ธ๋”ฉยท์ฆ๊ฑฐ ๊ธฐ๋ก์ด ์ „๋ถ€ ์šฐํšŒ๋ฉ๋‹ˆ๋‹ค. ๊ฐ•์ œ๋ ฅ์€ **ํ˜‘์กฐํ•˜๋Š” ์—์ด์ „ํŠธ๋ฅผ ๊ณ„์•ฝ ๊ถค๋„์— ์œ ์ง€**ํ•˜๋Š” ๋ฐ ์žˆ์ง€, ์‚ฌ๋žŒ์˜ ์šฐํšŒ๋ฅผ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋ง‰๋Š” ๋ฐ ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
25
+
26
+ ## 3๋ถ„ ์‹œ์ž‘
27
+
28
+ git ์ €์žฅ์†Œ์ด๊ณ  `package.json`์ด ์žˆ๋Š” ํด๋”์—์„œ ๋‘ ๋‹จ๊ณ„๋ฉด ๋ฉ๋‹ˆ๋‹ค.
29
+
30
+ ```sh
31
+ npm install -D commitgate # 1) ๋Ÿฐํƒ€์ž„ ์„ค์น˜ โ€” ์‹คํ–‰ ์ฝ”๋“œ๊ฐ€ node_modules/commitgate ์— ๋“ค์–ด์˜ต๋‹ˆ๋‹ค
32
+ npx commitgate init # 2) ์„ค์ •ยท๊ณ„์•ฝยท์Šคํ‚ค๋งˆ + req:* ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ”„๋กœ์ ํŠธ์— ๊น๋‹ˆ๋‹ค
33
+ ```
34
+
35
+ ์„ค์น˜๋Š” ํŒŒ์ผ๋งŒ ๋†“๊ณ  **์ปค๋ฐ‹ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.** `req:new`๋Š” clean ์›Œํ‚นํŠธ๋ฆฌ๋ฅผ ์š”๊ตฌํ•˜๋ฏ€๋กœ ์„ค์น˜๋ถ„์„ ๋จผ์ € ์ปค๋ฐ‹ํ•˜์„ธ์š” โ€” ์„ค์น˜ ์ถœ๋ ฅ์˜ `๋‹ค์Œ:` ์•ˆ๋‚ด๊ฐ€ stageํ•  ์ •ํ™•ํ•œ ๊ฒฝ๋กœ๋ฅผ ์•Œ๋ ค ์ค๋‹ˆ๋‹ค(`-A`/`.` ์ „์ฒด stage๋Š” ์“ฐ์ง€ ๋งˆ์„ธ์š”). ์ค€๋น„๋ฌผ(Codex CLI ๋“ฑ)ยท๊ฒฝ๋กœ ๋ช…์‹œ stageยท์ „์ฒด ์ฒซ ํ๋ฆ„์€ **[Quick Start](https://github.com/sol5288/commitgate/blob/main/docs/quick-start.md)**.
36
+
37
+ ๊ทธ๋‹ค์Œ ์—์ด์ „ํŠธ์—๊ฒŒ ์š”๊ตฌ์‚ฌํ•ญ๋งŒ ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
38
+
39
+ ```text
40
+ /req ํ”„๋กœํ•„ ์ˆ˜์ • API๋ฅผ ์ถ”๊ฐ€ํ•ด์ค˜
41
+
42
+ - ๋ฌด์—‡์„: PATCH /profile ๋กœ ๋‹‰๋„ค์ž„ยท์†Œ๊ฐœ๊ธ€ ์ˆ˜์ •
43
+ - ์™œ: ์ง€๊ธˆ์€ ๊ฐ€์ž… ํ›„ ํ”„๋กœํ•„์„ ๋ฐ”๊ฟ€ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค
44
+ - ์ œ์•ฝ: ๊ธฐ์กด ์ธ์ฆ ๋ฏธ๋“ค์›จ์–ด ์žฌ์‚ฌ์šฉ, ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ ์—†์Œ
45
+ - ์™„๋ฃŒ ๊ธฐ์ค€: ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ํ†ต๊ณผ, ๊ถŒํ•œ ์—†๋Š” ์‚ฌ์šฉ์ž๋Š” 403
46
+ ```
47
+
48
+ ์ฒซ ์‘๋‹ต์€ ๋ณดํ†ต ์ด๋ ‡๊ฒŒ ํ‹ฐ์ผ“ยท๋ธŒ๋žœ์น˜ยทphase ๊ณ„ํš๊ณผ ํ†ต์ œ์ ์„ ์„ธ์›๋‹ˆ๋‹ค.
49
+
50
+ ```text
51
+ REQ-2026-002 ๋ฐœํ–‰
52
+ ๋ธŒ๋žœ์น˜: feat/req-2026-002-profile-edit-api
53
+ phase:
54
+ - phase-1: PATCH /profile ๊ตฌํ˜„
55
+ - phase-2: ํ…Œ์ŠคํŠธ์™€ ํšŒ๊ท€ ํ™•์ธ
56
+ ํ†ต์ œ์ : req:commit --run ์ง์ „ / [B1] main direct push ์ง์ „ (๋˜๋Š” [I1] PR ์ƒ์„ฑ โ†’ [I2] merge)
57
+ ```
58
+
59
+ ์—์ด์ „ํŠธ๋Š” `req:next`๊ฐ€ ์‹œํ‚ค๋Š” ๋Œ€๋กœ **์„ค๊ณ„ โ†’ Codex ๋ฆฌ๋ทฐ โ†’ ๊ตฌํ˜„ โ†’ ์žฌ๋ฆฌ๋ทฐ โ†’ ์ปค๋ฐ‹**์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ํ†ต์ œ์ (`AWAIT_HUMAN`)์—์„œ ์Šน์ธ ๋ฌธ์žฅ์„ ์ค„ ๋•Œ๋งŒ ๊ฐœ์ž…ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. (Claude Code๊ฐ€ ์•„๋‹ˆ๋ฉด `/req` ์—†์ด ์š”๊ตฌ์‚ฌํ•ญ๋งŒ ์ค˜๋„ `AGENTS.md`ยท`.cursor/rules`๊ฐ€ ๊ทœ์น™์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.)
60
+
61
+ ## ์ž‘๋™ ๋ฐฉ์‹
62
+
63
+ `req:new`๊ฐ€ ํ‹ฐ์ผ“ยท๋ธŒ๋žœ์น˜ยท์„ค๊ณ„๋ฌธ์„œ๋ฅผ ๋งŒ๋“ค๊ณ , ๋งค ๋‹จ๊ณ„์˜ ๋‹ค์Œ ํ–‰๋™์€ ํ•ญ์ƒ `req:next`๊ฐ€ `state.json`๊ณผ git ์ƒํƒœ์—์„œ **๊ณ„์‚ฐ**ํ•ฉ๋‹ˆ๋‹ค(์ฝ๊ธฐ ์ „์šฉ โ€” ์—์ด์ „ํŠธ๊ฐ€ ์ถ”์ธกํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค).
64
+
65
+ ```text
66
+ req:new โ†’ ์„ค๊ณ„ ๋ฆฌ๋ทฐ โ†’ ๊ตฌํ˜„ โ†’ phase ๋ฆฌ๋ทฐ โ†’ ์Šน์ธ โ†’ req:commit โ†’ (ํ†ตํ•ฉยท๋ฆด๋ฆฌ์Šค๋Š” ๋ณ„๋„ ํ†ต์ œ์ )
67
+ ```
68
+
69
+ ๋ฃจํ”„ ์ƒ์„ธยท`kind` ํ‘œยท๋ฆฌ๋ทฐ์–ด ํŽ˜๋ฅด์†Œ๋‚˜ยทdelta ์žฌ๋ฆฌ๋ทฐ๋Š” **[์›Œํฌํ”Œ๋กœ](https://github.com/sol5288/commitgate/blob/main/docs/workflow.md)**, ์—์ด์ „ํŠธ ์ง„์ž…์ ยท์š”๊ตฌ ์ „๋‹ฌยทcompanion skills๋Š” **[์—์ด์ „ํŠธ ๊ฐ€์ด๋“œ](https://github.com/sol5288/commitgate/blob/main/docs/agent-prompt.md)**๋ฅผ ๋ณด์„ธ์š”.
70
+
71
+ ## ์ž์ฃผ ์“ฐ๋Š” ๋ช…๋ น
72
+
73
+ | ๋ช…๋ น | ์šฉ๋„ |
74
+ |---|---|
75
+ | `npm run req:new -- <slug> --run` | REQ ํ‹ฐ์ผ“ยท๋ธŒ๋žœ์น˜ยท์„ค๊ณ„๋ฌธ์„œ ์ƒ์„ฑ |
76
+ | `npm run req:next -- <id>` | **๋‹ค์Œ ํ–‰๋™ ๊ณ„์‚ฐ** (์ฝ๊ธฐ ์ „์šฉ) |
77
+ | `npm run req:doctor -- <id>` | ๊ฒŒ์ดํŠธ ์ƒํƒœ ์ ๊ฒ€ |
78
+ | `npm run req:commit -- <id> --run -m "..."` | ์Šน์ธ๋œ ๋ณ€๊ฒฝ ์ปค๋ฐ‹ |
79
+
80
+ `req:*`๋Š” PATH ์‹คํ–‰ ํŒŒ์ผ์ด ์•„๋‹ˆ๋ผ `package.json` ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค(npm์€ ์ธ์ž ์ „๋‹ฌ์— `--` ํ•„์š”). ์ „์ฒด ๋ช…๋ น๊ณผ `pnpm`/`yarn` ํ‘œ๊ธฐ๋Š” **[์›Œํฌํ”Œ๋กœ](https://github.com/sol5288/commitgate/blob/main/docs/workflow.md)**์— ์žˆ์Šต๋‹ˆ๋‹ค.
81
+
82
+ ## ๋” ์•Œ์•„๋ณด๊ธฐ
83
+
84
+ | ๋ฌธ์„œ | ๋‚ด์šฉ |
85
+ |---|---|
86
+ | [Quick Start](https://github.com/sol5288/commitgate/blob/main/docs/quick-start.md) | ์„ค์น˜ยท์ค€๋น„๋ฌผยท์ฒซ ์‹คํ–‰ |
87
+ | [์›Œํฌํ”Œ๋กœ](https://github.com/sol5288/commitgate/blob/main/docs/workflow.md) | `req:next` ๋ฃจํ”„ยทkindยทํŽ˜๋ฅด์†Œ๋‚˜ยท๋ช…๋ น์–ด |
88
+ | [์—์ด์ „ํŠธ ๊ฐ€์ด๋“œ](https://github.com/sol5288/commitgate/blob/main/docs/agent-prompt.md) | ์ง„์ž…์ ยท์š”๊ตฌ ์ „๋‹ฌยทcompanion skills |
89
+ | [๋ณด์žฅ๊ณผ ํ•œ๊ณ„](https://github.com/sol5288/commitgate/blob/main/docs/guarantees.md) | ์•ˆ์ „ ๊ณ„์•ฝยท์ง€์› ๋ฒ”์œ„ |
90
+ | [์„ค์ •](https://github.com/sol5288/commitgate/blob/main/docs/configuration.md) | `req.config.json` |
91
+ | [์—…๊ทธ๋ ˆ์ด๋“œ (0.x)](https://github.com/sol5288/commitgate/blob/main/docs/upgrade.md) | ๋Ÿฐํƒ€์ž„ ๊ฐฑ์‹ ยท`sync`ยท`quickstart`ยท`migrate` |
92
+ | [์ œ๊ฑฐํ•˜๊ธฐ](https://github.com/sol5288/commitgate/blob/main/docs/uninstall.md) | ์•ˆ์ „ํ•œ ์ œ๊ฑฐ ์ ˆ์ฐจ |
93
+ | [๋ฌธ์ œ ํ•ด๊ฒฐ](https://github.com/sol5288/commitgate/blob/main/docs/troubleshooting.md) | FAQ |
94
+ | [๊ฐœ๋ฐœยทํ˜„์žฌ ๋ฒ”์œ„](https://github.com/sol5288/commitgate/blob/main/docs/development.md) | CIยท๊ฒ€์ฆยท๋กœ๋“œ๋งต |
95
+
96
+ ## License
97
+
98
+ [MIT](./LICENSE) ยฉ 2026 sol5288