@getsolaris/oh-my-worktree 0.7.2

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.ko.md ADDED
@@ -0,0 +1,833 @@
1
+ <p align="center">
2
+ <img src="./banner.png" alt="oh-my-worktree" />
3
+ </p>
4
+
5
+ # ๐ŸŒณ oh-my-worktree
6
+
7
+ [English](./README.md) | **ํ•œ๊ตญ์–ด**
8
+
9
+ > Git worktree ๋งค๋‹ˆ์ € โ€” oh-my-* ํŒจ๋ฐ€๋ฆฌ์—์„œ ์˜๊ฐ์„ ๋ฐ›์€ ํ„ฐ๋ฏธ๋„ UI
10
+
11
+ Git worktree๋ฅผ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•˜์„ธ์š”. ์„ค์ • ๊ธฐ๋ฐ˜ ์ž๋™ํ™”, ๋ชจ๋…ธ๋ ˆํฌ ์ง€์›, ํ—ฌ์Šค ์ฒดํฌ๋กœ worktree๋ฅผ ์ƒ์„ฑ, ์ „ํ™˜, ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
12
+
13
+ ## ์ฃผ์š” ๊ธฐ๋Šฅ
14
+
15
+ - **TUI ๋ชจ๋“œ** โ€” ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ํ„ฐ๋ฏธ๋„ UI (`omw`)
16
+ - **CLI ๋ชจ๋“œ** โ€” ์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปค๋งจ๋“œ (`omw add`, `omw list` ๋“ฑ)
17
+ - **์„ค์ • ๊ธฐ๋ฐ˜** โ€” ๋ ˆํฌ๋ณ„ ํ›…, ํŒŒ์ผ ๋ณต์‚ฌ, ์‹ฌ๋ณผ๋ฆญ ๋งํฌ
18
+ - **๋ชจ๋…ธ๋ ˆํฌ ์ง€์›** โ€” ํŒจํ‚ค์ง€ ์ž๋™ ๊ฐ์ง€, ํŒจํ‚ค์ง€๋ณ„ ํ›…, ํฌ์ปค์Šค ์ถ”์ 
19
+ - **ํ—ฌ์Šค ์ฒดํฌ** โ€” `omw doctor`๋กœ worktree ๋ฌธ์ œ ์ง„๋‹จ
20
+ - **์ค‘์•™ ์ง‘์ค‘์‹ worktree** โ€” ๊ธฐ๋ณธ์ ์œผ๋กœ `~/.omw/worktrees/`์— ๋ชจ๋“  worktree ๊ด€๋ฆฌ
21
+ - **์Šค๋งˆํŠธ ์ •๋ฆฌ** โ€” ๋จธ์ง€๋œ worktree ์ž๋™ ๊ฐ์ง€ ๋ฐ ์ œ๊ฑฐ
22
+ - **ํ…Œ๋งˆ** โ€” 6๊ฐ€์ง€ ๋‚ด์žฅ ์ปฌ๋Ÿฌ ํ…Œ๋งˆ (OpenCode, Tokyo Night, Dracula, Nord, Catppuccin, GitHub Dark)
23
+ - **ํ…œํ”Œ๋ฆฟ** โ€” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ worktree ํ”„๋ฆฌ์…‹ (`omw add --template review`)
24
+ - **ํฌ๋กœ์Šค worktree ์‹คํ–‰** โ€” ๋ชจ๋“  worktree์—์„œ ๋ช…๋ น ์‹คํ–‰ (`omw exec "bun test"`)
25
+ - **GitHub PR ์—ฐ๋™** โ€” PR์—์„œ worktree ์ƒ์„ฑ (`omw add --pr 123`)
26
+ - **ํผ์ง€ ๋ธŒ๋žœ์น˜ ํ”ผ์ปค** โ€” TUI์—์„œ ํƒ€์ดํ•‘ํ•˜๋ฉด ๋ธŒ๋žœ์น˜ ์ž๋™์™„์„ฑ
27
+ - **๋ผ์ดํ”„์‚ฌ์ดํด ๊ด€๋ฆฌ** โ€” ๋น„ํ™œ์„ฑ/๋จธ์ง€๋œ worktree ์ž๋™ ๊ฐ์ง€, ์ œํ•œ ์„ค์ •
28
+ - **์˜์กด์„ฑ ๊ณต์œ ** โ€” `node_modules` ๋“ฑ์„ ํ•˜๋“œ๋งํฌ/์‹ฌ๋ณผ๋ฆญ์œผ๋กœ ๋””์Šคํฌ ์ ˆ์•ฝ
29
+ - **Worktree ๋น„๊ต** โ€” worktree ๊ฐ„ ๋ณ€๊ฒฝ์‚ฌํ•ญ ๋น„๊ต (`omw diff feature/a feature/b`)
30
+ - **ํ•€ ๋ณดํ˜ธ** โ€” worktree๋ฅผ ์ž๋™ ์ •๋ฆฌ์—์„œ ๋ณดํ˜ธ (`omw pin`)
31
+ - **ํ™œ๋™ ๋กœ๊ทธ** โ€” ์ƒ์„ฑ/์‚ญ์ œ/์ „ํ™˜/๋ฆฌ๋„ค์ž„/์•„์นด์ด๋ธŒ/์ž„ํฌํŠธ ์ด๋ฒคํŠธ ์ถ”์  (`omw log`)
32
+ - **์•„์นด์ด๋ธŒ** โ€” ์ œ๊ฑฐ ์ „ worktree ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ํŒจ์น˜๋กœ ๋ณด์กด (`omw archive`)
33
+ - **๋ธŒ๋žœ์น˜ ๋ฆฌ๋„ค์ž„** โ€” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๊ณผ ํ•จ๊ป˜ worktree ๋ธŒ๋žœ์น˜ ์ด๋ฆ„ ๋ณ€๊ฒฝ (`omw rename`)
34
+ - **ํด๋ก  ๋ฐ ์ดˆ๊ธฐํ™”** โ€” omw ์„ค์ •๊ณผ ํ•จ๊ป˜ ๋ ˆํฌ ํด๋ก  (`omw clone`)
35
+ - **Worktree ์ž„ํฌํŠธ** โ€” ์ˆ˜๋™ ์ƒ์„ฑ๋œ worktree ์ฑ„ํƒ (`omw import`)
36
+ - **์ƒ์„ธ ๋ทฐ** โ€” ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ, diff ํ†ต๊ณ„, upstream ์ƒํƒœ ํ™•์ธ (TUI)
37
+ - **์ผ๊ด„ ์ž‘์—…** โ€” ๋‹ค์ค‘ ์„ ํƒ ๋ฐ ๋ฐฐ์น˜ ์ž‘์—… (TUI)
38
+ - **ํ† ์ŠคํŠธ ์•Œ๋ฆผ** โ€” ๋น„๋™๊ธฐ ์ž‘์—… ๊ฒฐ๊ณผ ์•Œ๋ฆผ (TUI)
39
+ - **์…ธ ์ž๋™์™„์„ฑ** โ€” bash/zsh/fish ํƒญ ์ž๋™์™„์„ฑ (`omw shell-init --completions`)
40
+ - **์„ค์ • ํ”„๋กœํ•„** โ€” ์„ค์ • ์„ธํŠธ ์ „ํ™˜ (`omw config --profiles`)
41
+ - **Tmux ์„ธ์…˜** โ€” worktree๋ณ„ tmux ์„ธ์…˜ ์ž๋™ ์ƒ์„ฑ/์ข…๋ฃŒ, ๋ ˆ์ด์•„์›ƒ ํ…œํ”Œ๋ฆฟ (`omw session`)
42
+ - **AI ์—์ด์ „ํŠธ ์ดˆ๊ธฐํ™”** โ€” ๊ธฐ๋ณธ ์„ค์ • ํŒŒ์ผ ์ƒ์„ฑ ๋˜๋Š” Claude Code, Codex, OpenCode์šฉ ์Šคํ‚ฌ ์„ค์น˜ (`omw init`, `omw init --skill`)
43
+
44
+ ## ์š”๊ตฌ์‚ฌํ•ญ
45
+
46
+ - [Bun](https://bun.sh) ๋Ÿฐํƒ€์ž„
47
+ - git 2.17+
48
+ - macOS ๋˜๋Š” Linux
49
+ - [gh CLI](https://cli.github.com) (์„ ํƒ์‚ฌํ•ญ, `--pr` ํ”Œ๋ž˜๊ทธ์šฉ)
50
+ - [tmux](https://github.com/tmux/tmux) (์„ ํƒ์‚ฌํ•ญ, `omw session`์šฉ)
51
+
52
+ ## ์„ค์น˜
53
+
54
+ ### Homebrew (macOS/Linux)
55
+
56
+ ```bash
57
+ brew install getsolaris/tap/oh-my-worktree
58
+ ```
59
+
60
+ ### curl (์›๋ผ์ด๋„ˆ)
61
+
62
+ ```bash
63
+ curl -fsSL https://raw.githubusercontent.com/getsolaris/oh-my-worktree/main/install.sh | bash
64
+ ```
65
+
66
+ ### npm / bun
67
+
68
+ ```bash
69
+ bun install -g @getsolaris/oh-my-worktree
70
+ # or
71
+ npm install -g @getsolaris/oh-my-worktree
72
+ ```
73
+
74
+ ## ๋น ๋ฅธ ์‹œ์ž‘
75
+
76
+ ```bash
77
+ # TUI ์‹คํ–‰
78
+ omw
79
+
80
+ # worktree ๋ชฉ๋ก
81
+ omw list
82
+
83
+ # ์ƒˆ worktree ์ƒ์„ฑ
84
+ omw add feature/my-feature
85
+
86
+ # ๋ชจ๋…ธ๋ ˆํฌ ํฌ์ปค์Šค์™€ ํ•จ๊ป˜ ์ƒ์„ฑ
87
+ omw add feature/my-feature --focus apps/web,apps/api
88
+
89
+ # GitHub PR์—์„œ ์ƒ์„ฑ
90
+ omw add --pr 123
91
+
92
+ # ํ…œํ”Œ๋ฆฟ ์‚ฌ์šฉ
93
+ omw add feature/login --template review
94
+
95
+ # ๋ชจ๋“  worktree์—์„œ ๋ช…๋ น ์‹คํ–‰
96
+ omw exec "bun test"
97
+
98
+ # ๋‘ worktree ๋น„๊ต
99
+ omw diff feature/a feature/b --stat
100
+
101
+ # ํ—ฌ์Šค ์ฒดํฌ
102
+ omw doctor
103
+
104
+ # worktree ์ „ํ™˜ (์…ธ ํ†ตํ•ฉ ํ•„์š”)
105
+ omw switch feature/my-feature
106
+
107
+ # worktree ์ œ๊ฑฐ
108
+ omw remove feature/my-feature --yes
109
+
110
+ # ๋จธ์ง€๋œ worktree ์ •๋ฆฌ
111
+ omw clean --dry-run
112
+
113
+ # worktree ํ•€ ์„ค์ • (์ •๋ฆฌ์—์„œ ๋ณดํ˜ธ)
114
+ omw pin feature/important --reason "active sprint"
115
+
116
+ # ํ™œ๋™ ๋กœ๊ทธ ๋ณด๊ธฐ
117
+ omw log
118
+
119
+ # worktree ์•„์นด์ด๋ธŒ ํ›„ ์ œ๊ฑฐ
120
+ omw archive feature/done --yes
121
+
122
+ # worktree ๋ธŒ๋žœ์น˜ ๋ฆฌ๋„ค์ž„
123
+ omw rename old-name new-name
124
+
125
+ # ๋ ˆํฌ ํด๋ก  ๋ฐ omw ์ดˆ๊ธฐํ™”
126
+ omw clone https://github.com/user/repo.git
127
+
128
+ # ๊ธฐ์กด worktree ์ž„ํฌํŠธ
129
+ omw import /path/to/worktree
130
+
131
+ # worktree์˜ tmux ์„ธ์…˜ ์—ด๊ธฐ/์—ฐ๊ฒฐ
132
+ omw session feature/my-feature
133
+
134
+ # tmux ์„ธ์…˜๊ณผ ํ•จ๊ป˜ worktree ์ƒ์„ฑ
135
+ omw add feature/new --session
136
+
137
+ # ์„ค์ • ํŒŒ์ผ ์ดˆ๊ธฐํ™”
138
+ omw init
139
+
140
+ # AI ์—์ด์ „ํŠธ ์Šคํ‚ฌ ํŒŒ์ผ ์ƒ์„ฑ
141
+ omw init --skill claude-code
142
+ ```
143
+
144
+ ## TUI ์‚ฌ์šฉ๋ฒ•
145
+
146
+ `omw` (์ธ์ž ์—†์ด)๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
147
+
148
+ ### ํ‚ค๋ณด๋“œ ๋‹จ์ถ•ํ‚ค
149
+
150
+ | ํ‚ค | ๋™์ž‘ |
151
+ |----|------|
152
+ | `j` / `k` | worktree ๋ชฉ๋ก ํƒ์ƒ‰ |
153
+ | `a` | worktree ์ถ”๊ฐ€ |
154
+ | `d` | worktree ์‚ญ์ œ |
155
+ | `h` | Doctor (ํ—ฌ์Šค ์ฒดํฌ) |
156
+ | `r` | ๋ชฉ๋ก ์ƒˆ๋กœ๊ณ ์นจ |
157
+ | `Ctrl+P` | ์ปค๋งจ๋“œ ํŒ”๋ ˆํŠธ |
158
+ | `Enter` | ์ƒ์„ธ ๋ทฐ ์—ด๊ธฐ |
159
+ | `Escape` | ์ƒ์„ธ ๋ทฐ ๋‹ซ๊ธฐ |
160
+ | `Space` | worktree ์„ ํƒ ํ† ๊ธ€ |
161
+ | `Ctrl+A` | ๋ชจ๋“  worktree ์„ ํƒ |
162
+ | `x` | ์ผ๊ด„ ์ž‘์—… ๋ฉ”๋‰ด |
163
+ | `?` | ๋„์›€๋ง |
164
+ | `q` | ์ข…๋ฃŒ |
165
+
166
+ ### ์ปค๋งจ๋“œ ํŒ”๋ ˆํŠธ (`Ctrl+P`)
167
+
168
+ ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅํ•œ ์ปค๋งจ๋“œ ๋ฉ”๋‰ด:
169
+ - worktree ์ถ”๊ฐ€ / ์‚ญ์ œ / ์ƒˆ๋กœ๊ณ ์นจ
170
+ - Doctor ์‹คํ–‰
171
+ - ์„ค์ • ์—ด๊ธฐ
172
+ - ํ…Œ๋งˆ ๋ณ€๊ฒฝ
173
+ - ์ข…๋ฃŒ
174
+
175
+ ํƒ€์ดํ•‘์œผ๋กœ ํ•„ํ„ฐ, `โ†‘โ†“`์œผ๋กœ ํƒ์ƒ‰, `Enter`๋กœ ์‹คํ–‰, `Esc`๋กœ ๋‹ซ๊ธฐ.
176
+
177
+ ### Worktree ์ƒ์„ฑ ํ๋ฆ„
178
+
179
+ 1. `a`๋ฅผ ๋ˆŒ๋Ÿฌ ์ƒ์„ฑ ๋ทฐ ์—ด๊ธฐ
180
+ 2. ๋ธŒ๋žœ์น˜๋ช… ์ž…๋ ฅ ์‹œ์ž‘ โ€” ํƒ€์ดํ•‘ํ•˜๋ฉด ๋งค์นญ๋˜๋Š” ๋ธŒ๋žœ์น˜๊ฐ€ ํ‘œ์‹œ๋จ
181
+ 3. `โ†‘โ†“`์œผ๋กœ ์ถ”์ฒœ ๋ธŒ๋žœ์น˜ ์„ ํƒ, ๋˜๋Š” ๊ณ„์† ์ž…๋ ฅํ•˜์—ฌ ์ƒˆ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ
182
+ 4. `Tab`์œผ๋กœ Focus ํ•„๋“œ ์ „ํ™˜ (์„ ํƒ์‚ฌํ•ญ)
183
+ 5. ํฌ์ปค์Šค ๊ฒฝ๋กœ ์ž…๋ ฅ (์˜ˆ: `apps/web,apps/api`)
184
+ 6. `Enter`๋กœ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
185
+ 7. `Enter`๋กœ ํ™•์ธ
186
+
187
+ ํผ์ง€ ๋ธŒ๋žœ์น˜ ํ”ผ์ปค๋Š” ๋กœ์ปฌ/๋ฆฌ๋ชจํŠธ ๋ธŒ๋žœ์น˜๋ฅผ ๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹ ๋‚ ์งœ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ์‹ค์‹œ๊ฐ„ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.
188
+
189
+ ์ƒ์„ฑ ํ›„ ์„ค์ •๋œ `copyFiles`, `linkFiles`, `postCreate` ํ›…, ๋ชจ๋…ธ๋ ˆํฌ ํ›…์ด ์ž๋™์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
190
+
191
+ ### Doctor ๋ทฐ
192
+
193
+ `h`๋ฅผ ๋ˆŒ๋Ÿฌ Doctor ํƒญ์„ ์—ฝ๋‹ˆ๋‹ค. ํ—ฌ์Šค ์ฒดํฌ ๊ฒฐ๊ณผ ํ‘œ์‹œ:
194
+ - โœ“ Git ๋ฒ„์ „ ํ™•์ธ
195
+ - โœ“ ์„ค์ • ์œ ํšจ์„ฑ ๊ฒ€์ฆ
196
+ - โœ“ ๋น„ํ™œ์„ฑ worktree ๊ฐ์ง€
197
+ - โœ“ ๊ณ ์•„ ๋””๋ ‰ํ† ๋ฆฌ ๊ฐ์ง€
198
+ - โœ“ ์ž ๊ธˆ ์ƒํƒœ ํ™•์ธ
199
+ - โœ“ ๋”ํ‹ฐ worktree ๊ฐ์ง€
200
+
201
+ `r`๋กœ ์žฌํ™•์ธ, `Esc`๋กœ ๋Œ์•„๊ฐ€๊ธฐ.
202
+
203
+ ## CLI ์ปค๋งจ๋“œ
204
+
205
+ | ์ปค๋งจ๋“œ | ์„ค๋ช… |
206
+ |--------|------|
207
+ | `omw` | TUI ์‹คํ–‰ |
208
+ | `omw list` | ๋ชจ๋“  worktree ๋ชฉ๋ก (ํฌ์ปค์Šค ์ •๋ณด ํฌํ•จ) |
209
+ | `omw add <branch>` | worktree ์ƒ์„ฑ |
210
+ | `omw remove <branch>` | worktree ์ œ๊ฑฐ |
211
+ | `omw switch <branch>` | worktree ์ „ํ™˜ |
212
+ | `omw clean` | ๋จธ์ง€๋œ worktree ์ œ๊ฑฐ |
213
+ | `omw doctor` | worktree ํ—ฌ์Šค ์ฒดํฌ |
214
+ | `omw config` | ์„ค์ • ๊ด€๋ฆฌ |
215
+ | `omw exec <command>` | ๊ฐ worktree์—์„œ ๋ช…๋ น ์‹คํ–‰ |
216
+ | `omw diff <ref1> [ref2]` | worktree/๋ธŒ๋žœ์น˜ ๊ฐ„ diff |
217
+ | `omw pin <branch>` | worktree ํ•€/์–ธํ•€ (์ •๋ฆฌ์—์„œ ๋ณดํ˜ธ) |
218
+ | `omw log` | worktree ํ™œ๋™ ๋กœ๊ทธ ๋ณด๊ธฐ |
219
+ | `omw archive <branch>` | ๋ณ€๊ฒฝ์‚ฌํ•ญ ์•„์นด์ด๋ธŒ ํ›„ ์„ ํƒ์  ์ œ๊ฑฐ |
220
+ | `omw rename <old> <new>` | worktree ๋ธŒ๋žœ์น˜ ๋ฆฌ๋„ค์ž„ |
221
+ | `omw clone <url>` | ๋ ˆํฌ ํด๋ก  ๋ฐ omw ์ดˆ๊ธฐํ™” |
222
+ | `omw import <path>` | omw ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋กœ worktree ์ฑ„ํƒ |
223
+ | `omw session [branch]` | worktree์˜ tmux ์„ธ์…˜ ๊ด€๋ฆฌ |
224
+ | `omw init` | ์„ค์ • ์ดˆ๊ธฐํ™” ๋˜๋Š” AI ์—์ด์ „ํŠธ ์Šคํ‚ฌ ์„ค์น˜ |
225
+
226
+ ### `omw add`
227
+
228
+ ```bash
229
+ omw add feature/login # ํ•„์š”ํ•˜๋ฉด ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค๊ณ  worktree ์ƒ์„ฑ
230
+ omw add feature/login --base main # ์ƒˆ ๋ธŒ๋žœ์น˜๋Š” main์—์„œ ์‹œ์ž‘
231
+ omw add existing-branch # ๊ธฐ์กด ๋ธŒ๋žœ์น˜๋กœ worktree ์ƒ์„ฑ
232
+
233
+ # ๋ชจ๋…ธ๋ ˆํฌ: ํฌ์ปค์Šค ํŒจํ‚ค์ง€์™€ ํ•จ๊ป˜ ์ƒ์„ฑ
234
+ omw add feature/login --focus apps/web,apps/api
235
+ omw add feature/login --focus apps/web --focus apps/api
236
+
237
+ # ํ…œํ”Œ๋ฆฟ ์‚ฌ์šฉ
238
+ omw add feature/login --template review
239
+
240
+ # GitHub PR์—์„œ ์ƒ์„ฑ (gh CLI ํ•„์š”)
241
+ omw add --pr 123
242
+ omw add --pr 456 --template review
243
+ ```
244
+
245
+ ### `omw doctor`
246
+
247
+ ```bash
248
+ omw doctor # ์‚ฌ๋žŒ์ด ์ฝ๊ธฐ ์‰ฌ์šด ์ถœ๋ ฅ
249
+ omw doctor --json # ์Šคํฌ๋ฆฝํŒ…์šฉ JSON ์ถœ๋ ฅ
250
+ ```
251
+
252
+ ์ข…๋ฃŒ ์ฝ”๋“œ: ์ •์ƒ์ด๋ฉด `0`, ๊ฒฝ๊ณ  ๋˜๋Š” ์—๋Ÿฌ๊ฐ€ ์žˆ์œผ๋ฉด `1`.
253
+
254
+ ```
255
+ oh-my-worktree doctor
256
+
257
+ โœ“ Git version: 2.39.0 (>= 2.17 required)
258
+ โœ“ Configuration: valid
259
+ โœ“ Stale worktrees: none
260
+ โœ“ Orphaned directories: none
261
+ โœ“ Worktree locks: all clear
262
+ โœ“ Dirty worktrees: none
263
+
264
+ All checks passed.
265
+ ```
266
+
267
+ ### `omw list`
268
+
269
+ ```bash
270
+ omw list # Focus ์ปฌ๋Ÿผ์ด ํฌํ•จ๋œ ํ…Œ์ด๋ธ”
271
+ omw list --json # ํฌ์ปค์Šค ๋ฐฐ์—ด์ด ํฌํ•จ๋œ JSON
272
+ omw list --porcelain # ๋จธ์‹  ํŒ๋… ๊ฐ€๋Šฅ ํ˜•์‹
273
+ ```
274
+
275
+ ๋ชจ๋…ธ๋ ˆํฌ worktree๋ณ„ ํฌ์ปค์Šค ๊ฒฝ๋กœ๋ฅผ `Focus` ์ปฌ๋Ÿผ์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
276
+
277
+ ### `omw remove`
278
+
279
+ ```bash
280
+ omw remove feature/login # ๋ธŒ๋žœ์น˜๋ช…์œผ๋กœ ์ œ๊ฑฐ
281
+ omw remove feature/login --force # ๊ฐ•์ œ ์ œ๊ฑฐ (๋”ํ‹ฐ worktree)
282
+ omw remove feature/login --yes # ํ™•์ธ ๊ฑด๋„ˆ๋›ฐ๊ธฐ
283
+ ```
284
+
285
+ ### `omw clean`
286
+
287
+ ```bash
288
+ omw clean --dry-run # ์ œ๊ฑฐ๋  ํ•ญ๋ชฉ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
289
+ omw clean # ๋จธ์ง€๋œ worktree ๋ชจ๋‘ ์ œ๊ฑฐ
290
+ omw clean --stale # ๋น„ํ™œ์„ฑ worktree๋„ ํ‘œ์‹œ (lifecycle ์„ค์ • ์‚ฌ์šฉ)
291
+ ```
292
+
293
+ ### `omw exec`
294
+
295
+ ๋ชจ๋“  ๋น„-๋ฉ”์ธ worktree์—์„œ ์…ธ ์ปค๋งจ๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
296
+
297
+ ```bash
298
+ omw exec "bun test" # ๋ชจ๋“  worktree์—์„œ ์‹คํ–‰ (์ˆœ์ฐจ)
299
+ omw exec "bun test" --parallel # ๋ณ‘๋ ฌ ์‹คํ–‰
300
+ omw exec "git pull" --all # ๋ชจ๋“  ์„ค์ •๋œ ๋ ˆํฌ์—์„œ ์‹คํ–‰
301
+ omw exec "bun install" --dirty # ๋”ํ‹ฐ worktree๋งŒ
302
+ omw exec "git rebase main" --behind # upstream๋ณด๋‹ค ๋’ค์ฒ˜์ง„ ๊ฒƒ๋งŒ
303
+ omw exec "bun test" --json # JSON ์ถœ๋ ฅ
304
+ ```
305
+
306
+ | ํ”Œ๋ž˜๊ทธ | ์„ค๋ช… |
307
+ |--------|------|
308
+ | `--parallel` / `-p` | ๋ณ‘๋ ฌ ์‹คํ–‰ |
309
+ | `--all` / `-a` | ๋ชจ๋“  ์„ค์ •๋œ ๋ ˆํฌ ํฌํ•จ |
310
+ | `--dirty` | ๋”ํ‹ฐ worktree์—์„œ๋งŒ ์‹คํ–‰ |
311
+ | `--clean` | ํด๋ฆฐ worktree์—์„œ๋งŒ ์‹คํ–‰ |
312
+ | `--behind` | upstream๋ณด๋‹ค ๋’ค์ฒ˜์ง„ worktree์—์„œ๋งŒ ์‹คํ–‰ |
313
+ | `--json` / `-j` | ๊ฒฐ๊ณผ๋ฅผ JSON์œผ๋กœ ์ถœ๋ ฅ |
314
+
315
+ ์ปค๋งจ๋“œ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ™˜๊ฒฝ๋ณ€์ˆ˜: `OMW_BRANCH`, `OMW_WORKTREE_PATH`, `OMW_REPO_PATH`.
316
+
317
+ ### `omw diff`
318
+
319
+ ๋‘ worktree ๋ธŒ๋žœ์น˜ ๊ฐ„ diff๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
320
+
321
+ ```bash
322
+ omw diff feature/a feature/b # ์ „์ฒด diff
323
+ omw diff feature/a feature/b --stat # diffstat ์š”์•ฝ
324
+ omw diff feature/a --name-only # ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ๋ช…๋งŒ
325
+ omw diff feature/a # ํ˜„์žฌ HEAD์™€ ๋น„๊ต
326
+ ```
327
+
328
+ ### `omw pin`
329
+
330
+ ```bash
331
+ omw pin feature/auth --reason "active sprint" # ์‚ฌ์œ ์™€ ํ•จ๊ป˜ ํ•€
332
+ omw pin --list # ํ•€๋œ worktree ๋ชฉ๋ก
333
+ omw pin --list --json # JSON ์ถœ๋ ฅ
334
+ omw unpin feature/auth # ์–ธํ•€
335
+ ```
336
+
337
+ ํ•€๋œ worktree๋Š” `omw clean` ๋ฐ ๋ผ์ดํ”„์‚ฌ์ดํด ์ž๋™ ์ •๋ฆฌ์—์„œ ์ œ์™ธ๋ฉ๋‹ˆ๋‹ค.
338
+
339
+ ### `omw log`
340
+
341
+ ```bash
342
+ omw log # ์ตœ๊ทผ 20๊ฐœ ์ด๋ฒคํŠธ ํ‘œ์‹œ
343
+ omw log --limit 50 # ์ตœ๊ทผ 50๊ฐœ ์ด๋ฒคํŠธ ํ‘œ์‹œ
344
+ omw log --json # JSON ์ถœ๋ ฅ
345
+ omw log --clear # ํ™œ๋™ ๋กœ๊ทธ ์ดˆ๊ธฐํ™”
346
+ ```
347
+
348
+ ์ด๋ฒคํŠธ๋Š” ์ƒ‰์ƒ์œผ๋กœ ๊ตฌ๋ถ„: ์ƒ์„ฑ(์ดˆ๋ก), ์‚ญ์ œ(๋นจ๊ฐ•), ์ „ํ™˜(ํŒŒ๋ž‘), ๋ฆฌ๋„ค์ž„(๋…ธ๋ž‘), ์•„์นด์ด๋ธŒ(์žํ™), ์ž„ํฌํŠธ(์‹œ์•ˆ).
349
+
350
+ ### `omw archive`
351
+
352
+ ```bash
353
+ omw archive feature/done --yes # ์•„์นด์ด๋ธŒ ํ›„ ์ œ๊ฑฐ
354
+ omw archive feature/wip --keep # ์ œ๊ฑฐ ์—†์ด ์•„์นด์ด๋ธŒ๋งŒ
355
+ omw archive --list # ๋ชจ๋“  ์•„์นด์ด๋ธŒ ๋ชฉ๋ก
356
+ omw archive --list --json # JSON ์ถœ๋ ฅ
357
+ ```
358
+
359
+ ์•„์นด์ด๋ธŒ๋Š” `~/.omw/archives/`์— ํŒจ์น˜ ํŒŒ์ผ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
360
+
361
+ ### `omw rename`
362
+
363
+ ```bash
364
+ omw rename old-branch new-branch # ๋ธŒ๋žœ์น˜ ๋ฆฌ๋„ค์ž„
365
+ omw rename old-branch new-branch --move-path # worktree ๋””๋ ‰ํ† ๋ฆฌ๋„ ์ด๋™
366
+ ```
367
+
368
+ ### `omw clone`
369
+
370
+ ```bash
371
+ omw clone https://github.com/user/repo.git # ํด๋ก  ๋ฐ ์ดˆ๊ธฐํ™”
372
+ omw clone https://github.com/user/repo.git ./my-dir # ์ปค์Šคํ…€ ๋Œ€์ƒ ๊ฒฝ๋กœ
373
+ omw clone https://github.com/user/repo.git --template review # ํ…œํ”Œ๋ฆฟ ์ ์šฉ
374
+ omw clone https://github.com/user/repo.git --no-init-config # ์„ค์ • ์ดˆ๊ธฐํ™” ๊ฑด๋„ˆ๋›ฐ๊ธฐ
375
+ ```
376
+
377
+ ### `omw import`
378
+
379
+ ```bash
380
+ omw import /path/to/worktree # worktree ์ฑ„ํƒ
381
+ omw import /path/to/worktree --focus apps/web,apps/api # ํฌ์ปค์Šค์™€ ํ•จ๊ป˜
382
+ omw import /path/to/worktree --pin # ์ฆ‰์‹œ ํ•€ ์„ค์ •
383
+ ```
384
+
385
+ ### `omw session`
386
+
387
+ worktree์˜ tmux ์„ธ์…˜์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. tmux๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
388
+
389
+ ```bash
390
+ omw session feature/auth # ์„ธ์…˜ ์—ด๊ธฐ/์—ฐ๊ฒฐ (์—†์œผ๋ฉด ์ƒ์„ฑ)
391
+ omw session feature/auth --layout api # ์„ค์ •์˜ ๋ ˆ์ด์•„์›ƒ ์‚ฌ์šฉ
392
+ omw session --list # ํ™œ์„ฑ omw ์„ธ์…˜ ๋ชฉ๋ก
393
+ omw session --list --json # JSON ์ถœ๋ ฅ
394
+ omw session feature/auth --kill # worktree ์„ธ์…˜ ์ข…๋ฃŒ
395
+ omw session --kill-all # ๋ชจ๋“  omw ์„ธ์…˜ ์ข…๋ฃŒ
396
+ ```
397
+
398
+ ์„ค์ •์—์„œ `sessions.autoCreate` / `sessions.autoKill`์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด ์„ธ์…˜์ด ์ž๋™ ์ƒ์„ฑ/์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
399
+
400
+ ```bash
401
+ # tmux ์„ธ์…˜๊ณผ ํ•จ๊ป˜ worktree ์ƒ์„ฑ
402
+ omw add feature/login --session
403
+ omw add feature/login --session --layout api
404
+ ```
405
+
406
+ `sessions.enabled`๊ฐ€ `true`์ด๊ณ  tmux ์•ˆ์— ์žˆ์œผ๋ฉด, `omw switch`๊ฐ€ ๋Œ€์ƒ worktree์˜ tmux ์„ธ์…˜์œผ๋กœ ์ž๋™ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
407
+
408
+ ### `omw init`
409
+
410
+ ๊ธฐ๋ณธ์ ์œผ๋กœ omw ์„ค์ • ํŒŒ์ผ์„ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , ํ•„์š”ํ•˜๋ฉด AI ์ฝ”๋”ฉ ์—์ด์ „ํŠธ์šฉ ์Šคํ‚ฌ๋„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
411
+
412
+ ```bash
413
+ omw init # โ†’ ~/.config/oh-my-worktree/config.json
414
+ omw init --skill claude-code # โ†’ ~/.claude/skills/omw/
415
+ omw init --skill codex # โ†’ ~/.agents/skills/omw/
416
+ omw init --skill opencode # โ†’ ~/.config/opencode/skill/omw/
417
+ ```
418
+
419
+ | ํ”Œ๋žซํผ | ์Šคํ‚ฌ ๊ฒฝ๋กœ |
420
+ |--------|----------|
421
+ | `claude-code` | `~/.claude/skills/omw/` |
422
+ | `codex` | `~/.agents/skills/omw/` |
423
+ | `opencode` | `~/.config/opencode/skill/omw/` |
424
+
425
+ ๊ฐ ์Šคํ‚ฌ ๋””๋ ‰ํ† ๋ฆฌ์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค:
426
+ - `SKILL.md` โ€” ๊ฐœ์š”์™€ ๊ณตํ†ต ์›Œํฌํ”Œ๋กœ์šฐ
427
+ - `references/` โ€” ๋ช…๋ น๋ณ„ ์ƒ์„ธ ๋ฌธ์„œ (21๊ฐœ ํŒŒ์ผ)
428
+
429
+ `--skill` ์—†์ด ์‹คํ–‰ํ•˜๋ฉด ๊ธฐ์กด ์„ค์ • ์ดˆ๊ธฐํ™” ๋กœ์ง์„ ์žฌ์‚ฌ์šฉํ•˜์—ฌ `config.json`๋งŒ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
430
+ ๋ฉฑ๋“ฑ์„ฑ โ€” ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋ฉด ์Šคํ‚ฌ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
431
+
432
+ ## ์„ค์ •
433
+
434
+ ์„ค์ • ํŒŒ์ผ: `~/.config/oh-my-worktree/config.json`
435
+
436
+ ์ดˆ๊ธฐํ™”: `omw config --init`
437
+
438
+ ### ์ „์ฒด ์˜ˆ์‹œ
439
+
440
+ ```json
441
+ {
442
+ "$schema": "https://raw.githubusercontent.com/getsolaris/oh-my-worktree/main/schema.json",
443
+ "version": 1,
444
+ "theme": "dracula",
445
+ "defaults": {
446
+ "worktreeDir": "~/.omw/worktrees/{repo}-{branch}",
447
+ "copyFiles": [".env"],
448
+ "linkFiles": ["node_modules"],
449
+ "postCreate": ["bun install"],
450
+ "postRemove": [],
451
+ "sharedDeps": {
452
+ "strategy": "hardlink",
453
+ "paths": ["node_modules"],
454
+ "invalidateOn": ["package.json", "bun.lockb"]
455
+ }
456
+ },
457
+ "templates": {
458
+ "review": {
459
+ "copyFiles": [".env.local"],
460
+ "postCreate": ["bun install", "bun run build"],
461
+ "autoUpstream": true
462
+ },
463
+ "hotfix": {
464
+ "base": "main",
465
+ "copyFiles": [".env.production"],
466
+ "postCreate": ["bun install"]
467
+ },
468
+ "experiment": {
469
+ "worktreeDir": "~/tmp/experiments/{branch}",
470
+ "postRemove": []
471
+ }
472
+ },
473
+ "lifecycle": {
474
+ "autoCleanMerged": true,
475
+ "staleAfterDays": 14,
476
+ "maxWorktrees": 10
477
+ },
478
+ "sessions": {
479
+ "enabled": true,
480
+ "autoCreate": false,
481
+ "autoKill": true,
482
+ "prefix": "omw",
483
+ "defaultLayout": "dev",
484
+ "layouts": {
485
+ "dev": {
486
+ "windows": [
487
+ { "name": "editor", "command": "$EDITOR ." },
488
+ { "name": "dev", "command": "bun dev" },
489
+ { "name": "test", "command": "bun test --watch" }
490
+ ]
491
+ },
492
+ "minimal": {
493
+ "windows": [
494
+ { "name": "shell" }
495
+ ]
496
+ }
497
+ }
498
+ },
499
+ "repos": [
500
+ {
501
+ "path": "/Users/me/dev/frontend",
502
+ "copyFiles": [".env", ".env.local"],
503
+ "linkFiles": ["node_modules", ".next"],
504
+ "postCreate": ["bun install", "bun run build"]
505
+ },
506
+ {
507
+ "path": "/Users/me/dev/backend",
508
+ "copyFiles": [".env"],
509
+ "postCreate": ["pip install -r requirements.txt"]
510
+ },
511
+ {
512
+ "path": "/Users/me/dev/monorepo",
513
+ "copyFiles": [".env"],
514
+ "postCreate": ["pnpm install"],
515
+ "monorepo": {
516
+ "autoDetect": true,
517
+ "extraPatterns": ["apps/*/*"],
518
+ "hooks": [
519
+ {
520
+ "glob": "apps/web",
521
+ "copyFiles": [".env"],
522
+ "postCreate": ["cd {packagePath} && pnpm install"]
523
+ },
524
+ {
525
+ "glob": "apps/api",
526
+ "copyFiles": [".env"],
527
+ "linkFiles": ["node_modules"],
528
+ "postCreate": ["cd {packagePath} && pnpm install && pnpm build"]
529
+ }
530
+ ]
531
+ }
532
+ }
533
+ ]
534
+ }
535
+ ```
536
+
537
+ ### ์„ค์ • ํ•„๋“œ
538
+
539
+ #### `defaults`
540
+
541
+ ๋ชจ๋“  ๋ ˆํฌ๊ฐ€ ์ด ์„ค์ •์„ ์ƒ์†ํ•ฉ๋‹ˆ๋‹ค (๋ ˆํฌ๋ณ„ ์˜ค๋ฒ„๋ผ์ด๋“œ ๊ฐ€๋Šฅ).
542
+
543
+ | ํ•„๋“œ | ํƒ€์ž… | ๊ธฐ๋ณธ๊ฐ’ | ์„ค๋ช… |
544
+ |------|------|--------|------|
545
+ | `worktreeDir` | `string` | `~/.omw/worktrees/{repo}-{branch}` | worktree ๋””๋ ‰ํ† ๋ฆฌ ํŒจํ„ด |
546
+ | `copyFiles` | `string[]` | `[]` | ๋ฉ”์ธ ๋ ˆํฌ์—์„œ ๋ณต์‚ฌํ•  ํŒŒ์ผ |
547
+ | `linkFiles` | `string[]` | `[]` | ์‹ฌ๋ณผ๋ฆญ ๋งํฌํ•  ํŒŒ์ผ/๋””๋ ‰ํ† ๋ฆฌ (๋””์Šคํฌ ์ ˆ์•ฝ) |
548
+ | `postCreate` | `string[]` | `[]` | worktree ์ƒ์„ฑ ํ›„ ์‹คํ–‰ํ•  ์ปค๋งจ๋“œ |
549
+ | `postRemove` | `string[]` | `[]` | worktree ์ œ๊ฑฐ ์ „ ์‹คํ–‰ํ•  ์ปค๋งจ๋“œ |
550
+
551
+ #### `repos[]`
552
+
553
+ ๋ ˆํฌ๋ณ„ ์˜ค๋ฒ„๋ผ์ด๋“œ. ๊ฐ ํ•ญ๋ชฉ์€ `path`๊ฐ€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.
554
+
555
+ | ํ•„๋“œ | ํƒ€์ž… | ํ•„์ˆ˜ | ์„ค๋ช… |
556
+ |------|------|------|------|
557
+ | `path` | `string` | ์˜ˆ | ๋ ˆํฌ์˜ ์ ˆ๋Œ€ ๊ฒฝ๋กœ |
558
+ | `worktreeDir` | `string` | ์•„๋‹ˆ์˜ค | ๊ธฐ๋ณธ worktree ๋””๋ ‰ํ† ๋ฆฌ ์˜ค๋ฒ„๋ผ์ด๋“œ |
559
+ | `copyFiles` | `string[]` | ์•„๋‹ˆ์˜ค | ๊ธฐ๋ณธ ๋ณต์‚ฌ ํŒŒ์ผ ์˜ค๋ฒ„๋ผ์ด๋“œ |
560
+ | `linkFiles` | `string[]` | ์•„๋‹ˆ์˜ค | ๊ธฐ๋ณธ ๋งํฌ ํŒŒ์ผ ์˜ค๋ฒ„๋ผ์ด๋“œ |
561
+ | `postCreate` | `string[]` | ์•„๋‹ˆ์˜ค | ๊ธฐ๋ณธ postCreate ํ›… ์˜ค๋ฒ„๋ผ์ด๋“œ |
562
+ | `postRemove` | `string[]` | ์•„๋‹ˆ์˜ค | ๊ธฐ๋ณธ postRemove ํ›… ์˜ค๋ฒ„๋ผ์ด๋“œ |
563
+ | `monorepo` | `object` | ์•„๋‹ˆ์˜ค | ๋ชจ๋…ธ๋ ˆํฌ ์ง€์› ์„ค์ • |
564
+
565
+ #### `monorepo`
566
+
567
+ ๋ฒ”์šฉ ๋ชจ๋…ธ๋ ˆํฌ ์ง€์›. ์›Œํฌ์ŠคํŽ˜์ด์Šค ์„ค์ • ํŒŒ์ผ์—์„œ ํŒจํ‚ค์ง€๋ฅผ ์ž๋™ ๊ฐ์ง€ํ•˜๊ณ  ํŒจํ‚ค์ง€๋ณ„ ํ›…์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
568
+
569
+ ```json
570
+ {
571
+ "monorepo": {
572
+ "autoDetect": true,
573
+ "extraPatterns": ["apps/*/*"],
574
+ "hooks": [
575
+ {
576
+ "glob": "apps/mobile/*",
577
+ "copyFiles": [".env"],
578
+ "linkFiles": ["node_modules"],
579
+ "postCreate": ["cd {packagePath} && pnpm install"]
580
+ }
581
+ ]
582
+ }
583
+ }
584
+ ```
585
+
586
+ | ํ•„๋“œ | ํƒ€์ž… | ๊ธฐ๋ณธ๊ฐ’ | ์„ค๋ช… |
587
+ |------|------|--------|------|
588
+ | `autoDetect` | `boolean` | `true` | ๋ชจ๋…ธ๋ ˆํฌ ๋„๊ตฌ ์ž๋™ ๊ฐ์ง€ |
589
+ | `extraPatterns` | `string[]` | `[]` | ํŒจํ‚ค์ง€ ํƒ์ƒ‰์šฉ ์ถ”๊ฐ€ glob ํŒจํ„ด |
590
+ | `hooks` | `array` | `[]` | ํŒจํ‚ค์ง€๋ณ„ ํ›… ์ •์˜ |
591
+
592
+ **์ž๋™ ๊ฐ์ง€** ์ง€์›: pnpm workspaces, Turborepo, Nx, Lerna, npm/yarn workspaces.
593
+
594
+ **`extraPatterns`**๋Š” ์ž๋™ ๊ฐ์ง€์—์„œ ๋ˆ„๋ฝ๋œ ํŒจํ‚ค์ง€๋ฅผ ์žก์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, `pnpm-workspace.yaml`์ด `packages/*`๋งŒ ์ปค๋ฒ„ํ•˜๋Š”๋ฐ `apps/frontend/dashboard`์—๋„ ์•ฑ์ด ์žˆ๋‹ค๋ฉด `extraPatterns: ["apps/*/*"]`๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
595
+
596
+ #### `monorepo.hooks[]`
597
+
598
+ ํฌ์ปค์Šค ๊ฒฝ๋กœ์— ๋Œ€ํ•ด glob ํŒจํ„ด์œผ๋กœ ๋งค์นญ๋˜๋Š” ํŒจํ‚ค์ง€๋ณ„ ํ›….
599
+
600
+ | ํ•„๋“œ | ํƒ€์ž… | ํ•„์ˆ˜ | ์„ค๋ช… |
601
+ |------|------|------|------|
602
+ | `glob` | `string` | ์˜ˆ | ํฌ์ปค์Šค ๊ฒฝ๋กœ ๋งค์นญ์šฉ glob (์˜ˆ: `apps/*`, `apps/mobile/*`) |
603
+ | `copyFiles` | `string[]` | ์•„๋‹ˆ์˜ค | ๋งค์นญ๋œ ํŒจํ‚ค์ง€ ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์—์„œ ๋ณต์‚ฌํ•  ํŒŒ์ผ |
604
+ | `linkFiles` | `string[]` | ์•„๋‹ˆ์˜ค | ๋งค์นญ๋œ ํŒจํ‚ค์ง€ ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์—์„œ ์‹ฌ๋ณผ๋ฆญ ๋งํฌํ•  ํŒŒ์ผ/๋””๋ ‰ํ† ๋ฆฌ |
605
+ | `postCreate` | `string[]` | ์•„๋‹ˆ์˜ค | ์ƒ์„ฑ ํ›„ ์‹คํ–‰ํ•  ์ปค๋งจ๋“œ. `{packagePath}`, `{repo}`, `{branch}` ์ง€์› |
606
+ | `postRemove` | `string[]` | ์•„๋‹ˆ์˜ค | ์ œ๊ฑฐ ์ „ ์‹คํ–‰ํ•  ์ปค๋งจ๋“œ |
607
+
608
+ ํ›…์€ ์„ ์–ธ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰๋˜๋ฉฐ, ๋ ˆํฌ ๋ ˆ๋ฒจ `postCreate`/`postRemove` ์ดํ›„์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
609
+
610
+ **ํ›… ๋‚ด `copyFiles`/`linkFiles`**๋Š” ๋ ˆํฌ ๋ฃจํŠธ๊ฐ€ ์•„๋‹Œ **ํŒจํ‚ค์ง€ ์„œ๋ธŒ๋””๋ ‰ํ† ๋ฆฌ**์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, `glob: "apps/mobile/*"`์ด๊ณ  `copyFiles: [".env"]`์ด๋ฉด, `.env` ํŒŒ์ผ์€ `<๋ฉ”์ธ-๋ ˆํฌ>/apps/mobile/ios/.env`์—์„œ `<worktree>/apps/mobile/ios/.env`๋กœ ๋ณต์‚ฌ๋ฉ๋‹ˆ๋‹ค.
611
+
612
+ #### `templates`
613
+
614
+ worktree ์ƒ์„ฑ์„ ์œ„ํ•œ ์ด๋ฆ„์ด ๋ถ™์€ ํ”„๋ฆฌ์…‹. ๊ฐ ํ…œํ”Œ๋ฆฟ์€ ๊ธฐ๋ณธ๊ฐ’ ํ•„๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
615
+
616
+ ```json
617
+ {
618
+ "templates": {
619
+ "review": {
620
+ "copyFiles": [".env.local"],
621
+ "postCreate": ["bun install", "bun run build"],
622
+ "autoUpstream": true
623
+ },
624
+ "hotfix": {
625
+ "base": "main",
626
+ "copyFiles": [".env.production"],
627
+ "postCreate": ["bun install"]
628
+ }
629
+ }
630
+ }
631
+ ```
632
+
633
+ | ํ•„๋“œ | ํƒ€์ž… | ์„ค๋ช… |
634
+ |------|------|------|
635
+ | `worktreeDir` | `string` | worktree ๋””๋ ‰ํ† ๋ฆฌ ์˜ค๋ฒ„๋ผ์ด๋“œ |
636
+ | `copyFiles` | `string[]` | ๋ณต์‚ฌํ•  ํŒŒ์ผ ์˜ค๋ฒ„๋ผ์ด๋“œ |
637
+ | `linkFiles` | `string[]` | ์‹ฌ๋ณผ๋ฆญ ๋งํฌํ•  ํŒŒ์ผ ์˜ค๋ฒ„๋ผ์ด๋“œ |
638
+ | `postCreate` | `string[]` | postCreate ํ›… ์˜ค๋ฒ„๋ผ์ด๋“œ |
639
+ | `postRemove` | `string[]` | postRemove ํ›… ์˜ค๋ฒ„๋ผ์ด๋“œ |
640
+ | `autoUpstream` | `boolean` | upstream ์ถ”์  ์˜ค๋ฒ„๋ผ์ด๋“œ |
641
+ | `base` | `string` | ์ƒˆ๋กœ ์ƒ์„ฑ๋˜๋Š” ๋ธŒ๋žœ์น˜์˜ ๊ธฐ๋ณธ ๋ฒ ์ด์Šค ๋ธŒ๋žœ์น˜ |
642
+
643
+ ์‚ฌ์šฉ๋ฒ•: `omw add feature/login --template review`
644
+
645
+ ํ…œํ”Œ๋ฆฟ ๊ฐ’์€ ๋ฆฌ์กธ๋ธŒ๋œ ๋ ˆํฌ ์„ค์ •์„ ์˜ค๋ฒ„๋ผ์ด๋“œํ•ฉ๋‹ˆ๋‹ค. `base` ํ•„๋“œ๋Š” `--base`๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์ œ๊ณต๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
646
+
647
+ #### `lifecycle`
648
+
649
+ ์ž๋™ worktree ๋ผ์ดํ”„์‚ฌ์ดํด ๊ด€๋ฆฌ. `omw clean --stale`์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
650
+
651
+ ```json
652
+ {
653
+ "lifecycle": {
654
+ "autoCleanMerged": true,
655
+ "staleAfterDays": 14,
656
+ "maxWorktrees": 10
657
+ }
658
+ }
659
+ ```
660
+
661
+ | ํ•„๋“œ | ํƒ€์ž… | ๊ธฐ๋ณธ๊ฐ’ | ์„ค๋ช… |
662
+ |------|------|--------|------|
663
+ | `autoCleanMerged` | `boolean` | `false` | ๋จธ์ง€๋œ worktree๋ฅผ ์ •๋ฆฌ ๋Œ€์ƒ์œผ๋กœ ํ‘œ์‹œ |
664
+ | `staleAfterDays` | `number` | โ€” | ๋น„ํ™œ์„ฑ์œผ๋กœ ํ‘œ์‹œํ•˜๊ธฐ๊นŒ์ง€ ์ผ์ˆ˜ |
665
+ | `maxWorktrees` | `number` | โ€” | ์ด ์ˆ˜๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ๊ฒฝ๊ณ  |
666
+
667
+ #### `sessions`
668
+
669
+ worktree๋ณ„ tmux ์„ธ์…˜ ๊ด€๋ฆฌ.
670
+
671
+ ```json
672
+ {
673
+ "sessions": {
674
+ "enabled": true,
675
+ "autoCreate": true,
676
+ "autoKill": true,
677
+ "prefix": "omw",
678
+ "defaultLayout": "dev",
679
+ "layouts": {
680
+ "dev": {
681
+ "windows": [
682
+ { "name": "editor", "command": "$EDITOR ." },
683
+ { "name": "dev", "command": "bun dev" },
684
+ { "name": "test", "command": "bun test --watch" }
685
+ ]
686
+ }
687
+ }
688
+ }
689
+ }
690
+ ```
691
+
692
+ | ํ•„๋“œ | ํƒ€์ž… | ๊ธฐ๋ณธ๊ฐ’ | ์„ค๋ช… |
693
+ |------|------|--------|------|
694
+ | `enabled` | `boolean` | `false` | ์„ธ์…˜ ์—ฐ๋™ ํ™œ์„ฑํ™” (tmux ๋‚ด ์ž๋™ ์ „ํ™˜) |
695
+ | `autoCreate` | `boolean` | `false` | `omw add` ์‹œ tmux ์„ธ์…˜ ์ž๋™ ์ƒ์„ฑ |
696
+ | `autoKill` | `boolean` | `false` | `omw remove` ์‹œ tmux ์„ธ์…˜ ์ž๋™ ์ข…๋ฃŒ |
697
+ | `prefix` | `string` | `"omw"` | tmux ์„ธ์…˜ ์ด๋ฆ„ ์ ‘๋‘์‚ฌ |
698
+ | `defaultLayout` | `string` | โ€” | ์ƒˆ ์„ธ์…˜์˜ ๊ธฐ๋ณธ ๋ ˆ์ด์•„์›ƒ ์ด๋ฆ„ |
699
+ | `layouts` | `object` | `{}` | ์œˆ๋„์šฐ ์ •์˜๊ฐ€ ํฌํ•จ๋œ ์ด๋ฆ„ ์žˆ๋Š” ๋ ˆ์ด์•„์›ƒ |
700
+
701
+ **๋ ˆ์ด์•„์›ƒ ์œˆ๋„์šฐ:**
702
+
703
+ | ํ•„๋“œ | ํƒ€์ž… | ํ•„์ˆ˜ | ์„ค๋ช… |
704
+ |------|------|------|------|
705
+ | `name` | `string` | ์˜ˆ | ์œˆ๋„์šฐ ์ด๋ฆ„ |
706
+ | `command` | `string` | ์•„๋‹ˆ์˜ค | ์œˆ๋„์šฐ์—์„œ ์‹คํ–‰ํ•  ์ปค๋งจ๋“œ |
707
+
708
+ ์„ธ์…˜ ์ด๋ฆ„ ๊ทœ์น™: ๋ธŒ๋žœ์น˜ `feat/auth-token` โ†’ tmux ์„ธ์…˜ `omw_feat-auth-token`.
709
+
710
+ #### `sharedDeps`
711
+
712
+ ๋ฉ”์ธ ๋ ˆํฌ์™€ worktree ๊ฐ„ ์˜์กด์„ฑ์„ ๊ณต์œ ํ•˜์—ฌ ๋””์Šคํฌ ๊ณต๊ฐ„์„ ์ ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค. `defaults` ๋˜๋Š” ๋ ˆํฌ๋ณ„๋กœ ์„ค์ • ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
713
+
714
+ ```json
715
+ {
716
+ "defaults": {
717
+ "sharedDeps": {
718
+ "strategy": "hardlink",
719
+ "paths": ["node_modules"],
720
+ "invalidateOn": ["package.json", "bun.lockb"]
721
+ }
722
+ }
723
+ }
724
+ ```
725
+
726
+ | ํ•„๋“œ | ํƒ€์ž… | ๊ธฐ๋ณธ๊ฐ’ | ์„ค๋ช… |
727
+ |------|------|--------|------|
728
+ | `strategy` | `string` | `"symlink"` | `"hardlink"`, `"symlink"`, ๋˜๋Š” `"copy"` |
729
+ | `paths` | `string[]` | `[]` | ๊ณต์œ ํ•  ๋””๋ ‰ํ† ๋ฆฌ/ํŒŒ์ผ |
730
+ | `invalidateOn` | `string[]` | `[]` | ๋ณ€๊ฒฝ ์‹œ ์žฌ๊ณต์œ ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ํŒŒ์ผ |
731
+
732
+ **์ „๋žต:**
733
+ - `hardlink` โ€” ๊ฐ ํŒŒ์ผ์— ํ•˜๋“œ ๋งํฌ ์ƒ์„ฑ (๋””์Šคํฌ ์ ˆ์•ฝ, ๋‹ค์‹œ ์“ฐ์—ฌ์ง€๋Š” ํŒŒ์ผ์€ worktree๋งˆ๋‹ค ๋…๋ฆฝ์ ์œผ๋กœ ์ˆ˜์ • ๊ฐ€๋Šฅ)
734
+ - `symlink` โ€” ์†Œ์Šค ๋””๋ ‰ํ† ๋ฆฌ์— ์‹ฌ๋ณผ๋ฆญ ๋งํฌ ์ƒ์„ฑ (์ตœ๋Œ€ ๋””์Šคํฌ ์ ˆ์•ฝ, ์ƒํƒœ ๊ณต์œ )
735
+ - `copy` โ€” ์ผ๋ฐ˜ ๋ณต์‚ฌ๋กœ ํด๋ฐฑ
736
+
737
+ ### `--focus` ํ”Œ๋ž˜๊ทธ
738
+
739
+ worktree๊ฐ€ ์ž‘์—… ์ค‘์ธ ๋ชจ๋…ธ๋ ˆํฌ ํŒจํ‚ค์ง€๋ฅผ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค.
740
+
741
+ ```bash
742
+ omw add feature/login --focus apps/web,apps/api
743
+ ```
744
+
745
+ - ์‰ผํ‘œ, ๊ณต๋ฐฑ, ๋˜๋Š” ์—ฌ๋Ÿฌ `--focus` ํ”Œ๋ž˜๊ทธ ์ง€์›
746
+ - ํฌ์ปค์Šค ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” git ๋‚ด๋ถ€์— ์ €์žฅ (worktree ๋ฃจํŠธ๊ฐ€ ์•„๋‹˜)
747
+ - `omw list`์—์„œ worktree๋ณ„ ํฌ์ปค์Šค ๊ฒฝ๋กœ ํ‘œ์‹œ
748
+ - ๋ชจ๋…ธ๋ ˆํฌ ํ›…์€ ๋งค์นญ๋˜๋Š” ํฌ์ปค์Šค ๊ฒฝ๋กœ์— ๋Œ€ํ•ด์„œ๋งŒ ์‹คํ–‰
749
+ - ํฌ์ปค์Šค๋Š” ์„ ํƒ์‚ฌํ•ญ โ€” ์ƒ๋žตํ•˜๋ฉด ์ผ๋ฐ˜ worktree ์ƒ์„ฑ
750
+
751
+ ### ํ…œํ”Œ๋ฆฟ ๋ณ€์ˆ˜
752
+
753
+ `worktreeDir` ๋ฐ ๋ชจ๋…ธ๋ ˆํฌ ํ›… ์ปค๋งจ๋“œ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ:
754
+
755
+ | ๋ณ€์ˆ˜ | ์„ค๋ช… | ์˜ˆ์‹œ |
756
+ |------|------|------|
757
+ | `{repo}` | ๋ ˆํฌ ๋””๋ ‰ํ† ๋ฆฌ ์ด๋ฆ„ | `my-app` |
758
+ | `{branch}` | ๋ธŒ๋žœ์น˜ ์ด๋ฆ„ (`/`๋Š” `-`๋กœ ๋Œ€์ฒด) | `feature-auth` |
759
+ | `{packagePath}` | ๋งค์นญ๋œ ํŒจํ‚ค์ง€ ๊ฒฝ๋กœ (๋ชจ๋…ธ๋ ˆํฌ ํ›… ์ „์šฉ) | `apps/web` |
760
+ | `~` | ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ (๊ฒฝ๋กœ ์‹œ์ž‘ ์œ„์น˜์—์„œ๋งŒ) | `/Users/me` |
761
+
762
+ ### ์šฐ์„ ์ˆœ์œ„
763
+
764
+ ๋ ˆํฌ๋ณ„ ์„ค์ •์€ ๊ธฐ๋ณธ๊ฐ’์„ ์™„์ „ํžˆ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค (๋จธ์ง€ ์—†์Œ):
765
+
766
+ ```
767
+ repos[].copyFiles ์กด์žฌ? โ†’ repos[].copyFiles ์‚ฌ์šฉ
768
+ repos[].copyFiles ์—†์Œ? โ†’ defaults.copyFiles ์‚ฌ์šฉ
769
+ defaults.copyFiles ์—†์Œ? โ†’ [] (๋นˆ ๋ฐฐ์—ด) ์‚ฌ์šฉ
770
+ ```
771
+
772
+ ### ํ…Œ๋งˆ
773
+
774
+ ์„ค์ • ํŒŒ์ผ ๋˜๋Š” ์ปค๋งจ๋“œ ํŒ”๋ ˆํŠธ (`Ctrl+P`)์—์„œ ์„ค์ •:
775
+
776
+ ```json
777
+ { "theme": "tokyo-night" }
778
+ ```
779
+
780
+ ์‚ฌ์šฉ ๊ฐ€๋Šฅ: `opencode`, `tokyo-night`, `dracula`, `nord`, `catppuccin`, `github-dark`
781
+
782
+ ## ์…ธ ํ†ตํ•ฉ
783
+
784
+ `omw shell-init`์œผ๋กœ `omw switch`์šฉ ์…ธ ํ†ตํ•ฉ์„ ์„ค์น˜ํ•˜์„ธ์š”.
785
+
786
+ ### ์…ธ ์ž๋™์™„์„ฑ
787
+
788
+ ```bash
789
+ # ์ž๋™์™„์„ฑ ์ถ”๊ฐ€ (bash)
790
+ eval "$(omw shell-init --completions bash)"
791
+
792
+ # ์ž๋™์™„์„ฑ ์ถ”๊ฐ€ (zsh)
793
+ eval "$(omw shell-init --completions zsh)"
794
+
795
+ # ์ž๋™์™„์„ฑ ์ถ”๊ฐ€ (fish)
796
+ omw shell-init --completions fish | source
797
+ ```
798
+
799
+ ### ์˜ˆ์‹œ
800
+
801
+ ```bash
802
+ # zsh
803
+ echo 'eval "$(omw shell-init zsh)"' >> ~/.zshrc
804
+ source ~/.zshrc
805
+
806
+ # bash
807
+ echo 'eval "$(omw shell-init bash)"' >> ~/.bashrc
808
+ source ~/.bashrc
809
+
810
+ # fish
811
+ omw shell-init fish >> ~/.config/fish/config.fish
812
+ source ~/.config/fish/config.fish
813
+ ```
814
+
815
+ ์„ค์ • ์ €์žฅ ์ „ ์ƒ์„ฑ๋  ๋ž˜ํผ๋ฅผ ๋ฏธ๋ฆฌ ๋ณผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค:
816
+
817
+ ```bash
818
+ omw shell-init zsh
819
+ ```
820
+
821
+ ## ์„ค์ • ํ”„๋กœํ•„
822
+
823
+ ์„œ๋กœ ๋‹ค๋ฅธ ์„ค์ • ์„ธํŠธ ๊ฐ„ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
824
+
825
+ ```bash
826
+ omw config --profiles # ํ”„๋กœํ•„ ๋ชฉ๋ก
827
+ omw config --profile work --activate # ํ”„๋กœํ•„ ํ™œ์„ฑํ™”
828
+ omw config --profile personal --delete # ํ”„๋กœํ•„ ์‚ญ์ œ
829
+ ```
830
+
831
+ ## ๋ผ์ด์„ ์Šค
832
+
833
+ MIT ยฉ getsolaris