- Codex์์ ์๋๋ฐ์ค ์ธ๋ถ ๋ช ๋ น ์คํ์ ์ ์ดํ๋ ์ ์ธ์ ๊ท์น ์์คํ (์คํ์ ๊ธฐ๋ฅ)
.rulesํ์ผ์prefix_rule()์ ์ ์ํ๋ฉด, ๋ช ๋ น์ด ํจํด๋ณ๋ก allow / prompt / forbidden ๊ฒฐ์ - Starlark(Python ์ ์ฌ ์ธ์ด)๋ก ์์ฑ๋๋ฉฐ, ํ์ผ์์คํ ์ ๊ทผ ์์ด ์์ ํ๊ฒ ํ๊ฐ
- ์ฌ์ฉ์๊ฐ ํฐ๋ฏธ๋ UI์์ ๋ช ๋ น์ ์น์ธํ๋ฉด, ํด๋น ํจํด์ด ์๋์ผ๋ก ๊ท์น์ ๊ธฐ๋ก๋์ด ์ดํ ํ๋กฌํํธ ์๋ต
ํด๋น ๊ฐ๋ ์ด ํ์ํ ์ด์
- ๋ณด์ ๊ฒฝ๊ณ ์ค์ : ์ด๋ค ๋ช ๋ น์ด ์น์ธ ์์ด ์คํ๋๊ณ , ์ด๋ค ๋ช ๋ น์ด ์ฐจ๋จ๋๋์ง ๋ช ์์ ์ผ๋ก ์ ์ธ
- ํ ํ์ค ๊ฐ์ : ๊ด๋ฆฌ์๊ฐ
requirements.toml๋ก ์ ํ์ ๊ท์น์ ๋ฐฐํฌํ์ฌ ์กฐ์ง ์ ์ฒด์ ์ ์ฉ - ๋ฐ๋ณต ์น์ธ ์ ๊ฑฐ: ํ ๋ฒ ์น์ธํ ๋ช ๋ น ํจํด์ ๊ท์น์ผ๋ก ์ ์ฅํ์ฌ ์ดํ ์๋ ํ์ฉ
- ๋ณต์กํ ์
ธ ์คํฌ๋ฆฝํธ ์์ ์ฒ๋ฆฌ:
&&,|๋ฑ์ผ๋ก ์ฐ๊ฒฐ๋ ๋ช ๋ น์ ๊ฐ๋ณ ๋ถ๋ฆฌํ์ฌ ๊ฐ๊ฐ ๊ท์น ํ๊ฐ
AS-IS
# ๋งค๋ฒ ๋์ผํ ๋ช
๋ น์ ์น์ธ ํ๋กฌํํธ ๋ฐ๋ณต
Codex: "gh pr view 7888 ์คํํด๋ ๋ ๊น์?" โ ์น์ธ
Codex: "gh pr view 7889 ์คํํด๋ ๋ ๊น์?" โ ๋ ์น์ธ
Codex: "gh pr list ์คํํด๋ ๋ ๊น์?" โ ๋ ์น์ธ
TO-BE
# ~/.codex/rules/default.rules (ํ ๋ฒ๋ง ์ ์)
prefix_rule(
pattern=["gh", "pr", ["view", "list"]],
decision="allow",
justification="gh pr ์กฐํ ๋ช
๋ น์ ์ฝ๊ธฐ ์ ์ฉ์ด๋ฏ๋ก ํญ์ ํ์ฉ",
)# ์ดํ์๋ ํ๋กฌํํธ ์์ด ๋ฐ๋ก ์คํ
Codex: gh pr view 7888 โ โ
์๋ ์คํ
Codex: gh pr list โ โ
์๋ ์คํ
Codex: gh pr merge โ โ ๏ธ ๋งค์นญ ์ ๋จ โ ์น์ธ ์์ฒญ
๊ท์น ํ์ผ ์์น
.rules ํ์ผ์ ~/.codex/rules/ ๋๋ ํ ๋ฆฌ์ ์ ์ฅํ๋ฉฐ, Codex๊ฐ ์์ ์ Team Config ๊ณ์ธต์ ๋ชจ๋ ๋๋ ํ ๋ฆฌ๋ฅผ ์ค์บํ๋ค.
| ์์น | ๊ฒฝ๋ก | ์ฉ๋ |
|---|---|---|
| User | ~/.codex/rules/default.rules | ๊ฐ์ธ ๊ท์น |
| Admin | requirements.toml (managed config) | ์กฐ์ง ์ ์ฒด ๊ฐ์ ๊ท์น |
prefix_rule() ์์ฑ๋ฒ
ํ์ ํ๋ผ๋ฏธํฐ
| ํ๋ผ๋ฏธํฐ | ์ค๋ช | ์์ |
|---|---|---|
pattern | ๋งค์นญํ ๋ช ๋ น์ด ์ ๋์ฌ (๋น์ด์์ง ์์ ๋ฆฌ์คํธ) | ["gh", "pr", "view"] |
pattern ์์๋ ๋ ๊ฐ์ง ํํ:
- ๋ฆฌํฐ๋ด ๋ฌธ์์ด:
"pr"โ ์ ํํpr๋ง ๋งค์นญ - ๋์ ์ ๋์ธ:
["view", "list"]โview๋๋list๋งค์นญ
# "gh pr view" ๋๋ "gh pr list"์ ๋งค์นญ
prefix_rule(
pattern=["gh", "pr", ["view", "list"]],
decision="allow",
)์ ํ ํ๋ผ๋ฏธํฐ
| ํ๋ผ๋ฏธํฐ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช |
|---|---|---|
decision | "allow" | "allow": ์ฆ์ ์คํ, "prompt": ๋งค๋ฒ ์น์ธ ์์ฒญ, "forbidden": ์ฐจ๋จ |
justification | - | ์ฌ๋์ด ์ฝ์ ์ ์๋ ์ค๋ช . ์น์ธ ํ๋กฌํํธ๋ ๊ฑฐ๋ถ ๋ฉ์์ง์ ํ์ |
match | - | ์ด ๊ท์น์ด ๋งค์นญํด์ผ ํ๋ ์์ ๋ฐฐ์ด (๋ก๋ฉ ์ ๊ฒ์ฆ์ฉ) |
not_match | - | ์ด ๊ท์น์ด ๋งค์นญํ๋ฉด ์ ๋๋ ์์ ๋ฐฐ์ด (๋ก๋ฉ ์ ๊ฒ์ฆ์ฉ) |
decision ์ฐ์ ์์
์ฌ๋ฌ ๊ท์น์ด ๋์์ ๋งค์นญ๋๋ฉด, ๊ฐ์ฅ ์ ํ์ ์ธ ๊ฒฐ์ ์ด ์ฐ์ ํ๋ค:
forbidden > prompt > allow
์ ธ ๋ช ๋ น ์ฒ๋ฆฌ
์์ ํ ์ฒด์ธ ๋ช ๋ น ๋ถ๋ฆฌ
bash/zsh์ -c ๋๋ -lc ํ๋๊ทธ๋ก ์คํ๋๋ ์
ธ ๋ช
๋ น์ด ์์ ํ ์ฐ์ฐ์(&&, ||, ;, |)๋ก ์ฐ๊ฒฐ๋๊ณ ๋จ์ ๋จ์ด๋ง ํฌํจํ๋ฉด, Codex๊ฐ ๊ฐ๋ณ ๋ช
๋ น์ผ๋ก ๋ถ๋ฆฌํ์ฌ ๊ฐ๊ฐ ๊ท์น์ ํ๊ฐํ๋ค:
# ์ด ๋ช
๋ น์ "git status"์ "git diff"๋ก ๋ถ๋ฆฌ๋์ด ๊ฐ๊ฐ ๊ท์น ํ๊ฐ
bash -c "git status && git diff"๋ณต์กํ ์คํฌ๋ฆฝํธ ์ฒ๋ฆฌ
๋ฆฌ๋ค์ด๋ ์ , ์นํ, ํ๊ฒฝ๋ณ์, ์์ผ๋์นด๋, ์ ์ด ํ๋ฆ ๋ฑ ๊ณ ๊ธ ์ ธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ์คํฌ๋ฆฝํธ๋ ๋จ์ผ ํธ์ถ๋ก ์ทจ๊ธํ๋ค:
# ์ ์ฒด ์คํฌ๋ฆฝํธ๊ฐ ํ๋์ ํจํด์ผ๋ก ํ๊ฐ๋จ
["bash", "-lc", "<์ ์ฒด ์คํฌ๋ฆฝํธ>"]์ด ๋ณด์์ ์ ๊ทผ์ ๋ณต์กํ ์คํฌ๋ฆฝํธ ์์ ์ํํ ๋ช ๋ น์ด ์จ๊ฒจ์ง๋ ๊ฒ์ ๋ฐฉ์งํ๋ค.
๊ท์น ํ ์คํธ
CLI๋ก ๊ท์น์ ๋งค์นญ ๋์์ ์ฌ์ ๊ฒ์ฆํ ์ ์๋ค:
codex execpolicy check --pretty \
--rules ~/.codex/rules/default.rules \
-- gh pr view 7888 --json title,body,comments์ฌ๋ฌ ๊ท์น ํ์ผ์ ์กฐํฉํ์ฌ ํ ์คํธ ๊ฐ๋ฅ.
์ฌ์ฉ์ ์น์ธ ์๋ ๊ธฐ๋ก
ํฐ๋ฏธ๋ UI์์ ์ฌ์ฉ์๊ฐ ๋ช
๋ น์ ์น์ธํ๋ฉด, Codex๊ฐ prefix_rule ํญ๋ชฉ์ ์๋์ผ๋ก ~/.codex/rules/default.rules์ ๊ธฐ๋กํ๋ค. ์ดํ ๋์ผํ ํจํด์ ๋ช
๋ น์ ํ๋กฌํํธ ์์ด ์คํ๋๋ค.
sequenceDiagram autonumber actor User participant Codex participant Rules as default.rules Codex->>User: "gh pr view ์คํํด๋ ๋ ๊น์?" User->>Codex: ์น์ธ Codex->>Rules: prefix_rule(pattern=["gh","pr","view"],<br/>decision="allow") ์๋ ๊ธฐ๋ก Note over Codex: ๋ค์ ๋ฒ "gh pr view" โ ํ๋กฌํํธ ์์ด ์คํ
Smart Approvals (๊ด๋ฆฌ์ ๊ธฐ๋ฅ)
๊ด๋ฆฌ์๊ฐ managed config์ requirements.toml๋ก ์ ํ์ ๊ท์น์ ๊ฐ์ ํ ์ ์๋ค. Smart approvals๊ฐ ํ์ฑํ๋๋ฉด(๊ธฐ๋ณธ๊ฐ), ์ฌ์ฉ์๊ฐ ๊ถํ ์์น์ ์์ฒญํ ๋ Codex๊ฐ prefix_rule ํญ๋ชฉ์ ์ ์ํ์ฌ ๊ด๋ฆฌ์ ๋ฆฌ๋ทฐ๋ฅผ ๊ฑฐ์น๋ค.
๊ท์น ์ธ์ด: Starlark
.rules ํ์ผ์ Starlark๋ก ์์ฑํ๋ค. Starlark๋ Python๊ณผ ์ ์ฌํ ๋ฌธ๋ฒ์ด์ง๋ง, ๋ถ์์ฉ(side effect)์ด ์๋๋ก ์ค๊ณ๋์ด ํ์ผ์์คํ
์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๋ค. ์ด ๋๋ถ์ ์ ๋ขฐํ ์ ์๋ ํ๊ฒฝ์์๋ ์์ ํ๊ฒ ๊ท์น์ ํ๊ฐํ ์ ์๋ค.
Claude Code Permissions์ ๋น๊ต
| ํญ๋ชฉ | Codex Rules | Claude Code Permissions |
|---|---|---|
| ์ ์ ํ์ | .rules ํ์ผ (Starlark) | settings.json (JSON) |
| ๊ท์น ๋จ์ | ๋ช
๋ น์ด ์ ๋์ฌ ํจํด (prefix_rule) | ๋๊ตฌ ์ด๋ฆ + glob ํจํด |
| ๊ฒฐ์ ์ต์ | allow / prompt / forbidden | allow / deny |
| ์ถฉ๋ ํด๊ฒฐ | ๊ฐ์ฅ ์ ํ์ ์ธ ๊ฒฐ์ ์ฐ์ | deny๊ฐ allow๋ณด๋ค ์ฐ์ |
| ์๋ ๊ธฐ๋ก | ์น์ธ ์ ๊ท์น ์๋ ์์ฑ | ์น์ธ ์ allowlist์ ์๋ ์ถ๊ฐ |
| ์ ธ ๋ช ๋ น ๋ถ๋ฆฌ | ์ฒด์ธ ๋ช ๋ น์ ๊ฐ๋ณ ํ๊ฐ | ํด๋น ์์ (๋๊ตฌ ๋จ์ ์ ์ด) |
| ํ ์คํธ ๋๊ตฌ | codex execpolicy check CLI | ํด๋น ์์ |
| ๊ท์น ์ธ์ด | Starlark (Python-like) | JSON |
| ๊ด๋ฆฌ์ ๊ฐ์ | requirements.toml | Enterprise managed settings |
์ฐธ๊ณ ๋ฌธ์
- Codex Rules ๊ณต์ ๋ฌธ์
- Codex Subagents - ํ์ ์์ด์ ํธ (์๋๋ฐ์ค ์ ์ฑ ์์)
- Codex Skills - ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ํฌํ๋ก์ฐ ํจํค์ง