vde-worktree 0.0.1 → 0.0.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.ja.md ADDED
@@ -0,0 +1,395 @@
1
+ # vde-worktree
2
+
3
+ `vde-worktree` は、人間とコーディングエージェントの両方を想定した、安全な Git worktree 管理 CLI です。
4
+
5
+ 利用できるコマンド名:
6
+ - `vde-worktree`
7
+ - `vw`(エイリアス)
8
+
9
+ 英語版ドキュメント: `README.md`
10
+
11
+ ## このツールで解決すること
12
+
13
+ - worktree をリポジトリ配下 `.worktree/` に統一配置
14
+ - `switch` を冪等にして、同じ指示を繰り返しても破綻しにくくする
15
+ - `del` / `gone` の破壊操作に安全ガードを入れる
16
+ - Agent 向けに安定した JSON 出力を提供
17
+ - hooks ベースで運用を拡張しやすくする
18
+
19
+ ## 動作要件
20
+
21
+ - Node.js 22+
22
+ - pnpm 10+
23
+ - `fzf`(`cd` に必須)
24
+ - `gh`(PR merged 判定に任意)
25
+
26
+ ## インストール / ビルド
27
+
28
+ グローバルインストール:
29
+
30
+ ```bash
31
+ npm install -g vde-worktree
32
+ ```
33
+
34
+ ローカルビルド:
35
+
36
+ ```bash
37
+ pnpm install
38
+ pnpm run build
39
+ ```
40
+
41
+ 開発時の検証:
42
+
43
+ ```bash
44
+ pnpm run ci
45
+ ```
46
+
47
+ ## クイックスタート
48
+
49
+ ```bash
50
+ vw init
51
+ vw switch feature/foo
52
+ cd "$(vw cd)"
53
+ ```
54
+
55
+ `vw cd` は選択した worktree の path を出力するコマンドです。親シェルのディレクトリは直接変更できません。
56
+
57
+ ## シェル補完
58
+
59
+ コマンドから補完スクリプトを出力:
60
+
61
+ ```bash
62
+ vw completion zsh
63
+ vw completion fish
64
+ ```
65
+
66
+ デフォルトの配置先にインストール:
67
+
68
+ ```bash
69
+ vw completion zsh --install
70
+ vw completion fish --install
71
+ ```
72
+
73
+ カスタム配置先にインストール:
74
+
75
+ ```bash
76
+ vw completion zsh --install --path ~/.zsh/completions/_vw
77
+ vw completion fish --install --path ~/.config/fish/completions/vw.fish
78
+ ```
79
+
80
+ zsh は `fpath` に補完ディレクトリを追加して `compinit` を実行してください:
81
+
82
+ ```bash
83
+ fpath=(~/.zsh/completions $fpath)
84
+ autoload -Uz compinit && compinit
85
+ ```
86
+
87
+ ## 管理ディレクトリ
88
+
89
+ `vw init` 実行後に次を管理します:
90
+
91
+ - `.worktree/`(worktree 実体)
92
+ - `.vde/worktree/hooks/`
93
+ - `.vde/worktree/logs/`
94
+ - `.vde/worktree/locks/`
95
+ - `.vde/worktree/state/`
96
+
97
+ また `.git/info/exclude` に管理対象エントリを冪等で追記します。
98
+
99
+ ## 全体ルール
100
+
101
+ - 多くの書き込み系コマンドは `init` 実行済みが前提
102
+ - 書き込み時は内部の repo lock で排他制御
103
+ - `--json` 指定時、stdout は単一 JSON オブジェクトのみ
104
+ - ログや警告は stderr に出力
105
+ - 非TTYで unsafe 操作を行う場合は `--allow-unsafe` が必要
106
+
107
+ ## グローバルオプション
108
+
109
+ - `--json`: 機械可読の単一 JSON 出力
110
+ - `--verbose`: 詳細ログ
111
+ - `--no-hooks`: 今回のみ hook 無効化(`--allow-unsafe` 必須)
112
+ - `--allow-unsafe`: unsafe 操作の明示同意
113
+ - `--hook-timeout-ms <ms>`: hook timeout 上書き
114
+ - `--lock-timeout-ms <ms>`: repo lock timeout 上書き
115
+
116
+ ## コマンド詳細
117
+
118
+ ### `init`
119
+
120
+ ```bash
121
+ vw init
122
+ ```
123
+
124
+ 機能:
125
+ - `.worktree/` と `.vde/worktree/*` を作成
126
+ - `.git/info/exclude` に管理エントリ追加
127
+ - デフォルト hook テンプレートを作成
128
+
129
+ ### `list`
130
+
131
+ ```bash
132
+ vw list
133
+ vw list --json
134
+ ```
135
+
136
+ 機能:
137
+ - Git の porcelain 情報から worktree 一覧を取得
138
+ - branch/path/dirty/lock/merged/upstream を表示
139
+
140
+ ### `status`
141
+
142
+ ```bash
143
+ vw status
144
+ vw status feature/foo
145
+ vw status --json
146
+ ```
147
+
148
+ 機能:
149
+ - 対象 worktree 1件の状態を表示
150
+ - branch 指定なしなら現在 `cwd` から該当 worktree を解決
151
+
152
+ ### `path`
153
+
154
+ ```bash
155
+ vw path feature/foo
156
+ vw path feature/foo --json
157
+ ```
158
+
159
+ 機能:
160
+ - 指定 branch の絶対 worktree path を返す
161
+
162
+ ### `new`
163
+
164
+ ```bash
165
+ vw new
166
+ vw new feature/foo
167
+ ```
168
+
169
+ 機能:
170
+ - 新しい branch + worktree を `.worktree/` に作成
171
+ - branch 省略時は `wip-xxxxxx` を自動生成
172
+
173
+ ### `switch`
174
+
175
+ ```bash
176
+ vw switch feature/foo
177
+ ```
178
+
179
+ 機能:
180
+ - 指定 branch の worktree があれば再利用、なければ作成
181
+ - 冪等な branch 入口コマンド
182
+
183
+ ### `mv`
184
+
185
+ ```bash
186
+ vw mv feature/new-name
187
+ ```
188
+
189
+ 機能:
190
+ - 現在の非primary worktree の branch 名と path をリネーム
191
+ - detached HEAD では実行不可
192
+
193
+ ### `del`
194
+
195
+ ```bash
196
+ vw del
197
+ vw del feature/foo
198
+ vw del feature/foo --force-unmerged --allow-unpushed --allow-unsafe
199
+ ```
200
+
201
+ 機能:
202
+ - worktree と branch を安全に削除
203
+ - デフォルトで dirty / locked / unmerged(unknown含む) / unpushed(unknown含む) を拒否
204
+
205
+ 主な解除フラグ:
206
+ - `--force-dirty`
207
+ - `--allow-unpushed`
208
+ - `--force-unmerged`
209
+ - `--force-locked`
210
+ - `--force`(上記を一括有効)
211
+
212
+ ### `gone`
213
+
214
+ ```bash
215
+ vw gone
216
+ vw gone --apply
217
+ vw gone --json
218
+ ```
219
+
220
+ 機能:
221
+ - 一括クリーンアップ候補の抽出/削除
222
+ - デフォルトは dry-run
223
+ - `--apply` で削除実行
224
+
225
+ ### `get`
226
+
227
+ ```bash
228
+ vw get origin/feature/foo
229
+ ```
230
+
231
+ 機能:
232
+ - remote branch を fetch
233
+ - ローカル追跡 branch がなければ作成
234
+ - worktree を作成/再利用
235
+
236
+ ### `extract`
237
+
238
+ ```bash
239
+ vw extract --current
240
+ vw extract --current --stash
241
+ ```
242
+
243
+ 機能:
244
+ - primary worktree の現在 branch を `.worktree/` 側へ切り出し
245
+ - primary を base branch に戻す
246
+ - dirty 状態で切り出す場合は `--stash` を使用
247
+
248
+ 現状の制約:
249
+ - 実装は primary worktree の抽出フローが中心
250
+
251
+ ### `use`
252
+
253
+ ```bash
254
+ vw use feature/foo
255
+ vw use feature/foo --allow-agent --allow-unsafe
256
+ ```
257
+
258
+ 機能:
259
+ - primary worktree を指定 branch に checkout
260
+ - primary context を固定したい用途向け
261
+
262
+ 安全条件:
263
+ - primary が dirty なら拒否
264
+ - 非TTYでは `--allow-agent` と `--allow-unsafe` の両方が必要
265
+
266
+ ### `exec`
267
+
268
+ ```bash
269
+ vw exec feature/foo -- pnpm test
270
+ vw exec feature/foo --json -- pnpm test
271
+ ```
272
+
273
+ 機能:
274
+ - 指定 branch の worktree を `cwd` にしてコマンド実行
275
+ - shell 展開は使わず引数配列で実行
276
+
277
+ 終了コード:
278
+ - 子プロセス成功: `0`
279
+ - 子プロセス失敗: `21`(JSON では `CHILD_PROCESS_FAILED`)
280
+
281
+ ### `invoke`
282
+
283
+ ```bash
284
+ vw invoke post-switch
285
+ vw invoke pre-new -- --arg1 --arg2
286
+ ```
287
+
288
+ 機能:
289
+ - `pre-*` / `post-*` hook を手動実行
290
+ - hook デバッグ用
291
+
292
+ ### `copy`
293
+
294
+ ```bash
295
+ vw copy .envrc .claude/settings.local.json
296
+ ```
297
+
298
+ 機能:
299
+ - repo 相対パスのファイル/ディレクトリを target worktree にコピー
300
+ - 主に hook 内で `WT_WORKTREE_PATH` と合わせて使う想定
301
+
302
+ ### `link`
303
+
304
+ ```bash
305
+ vw link .envrc
306
+ vw link .envrc --no-fallback
307
+ ```
308
+
309
+ 機能:
310
+ - target worktree 側に symlink を作成
311
+ - Windows では `--no-fallback` がない場合、copy にフォールバック可
312
+
313
+ ### `lock` / `unlock`
314
+
315
+ ```bash
316
+ vw lock feature/foo --owner codex --reason "agent in progress"
317
+ vw unlock feature/foo --owner codex
318
+ vw unlock feature/foo --force
319
+ ```
320
+
321
+ 機能:
322
+ - `lock`: `.vde/worktree/locks/` に lock 情報を保存
323
+ - `unlock`: lock を解除(owner 不一致時は `--force` 必須)
324
+
325
+ ### `cd`
326
+
327
+ ```bash
328
+ cd "$(vw cd)"
329
+ ```
330
+
331
+ 機能:
332
+ - `fzf` で worktree を対話選択
333
+ - 選択した絶対 path を stdout に出力
334
+
335
+ ### `completion`
336
+
337
+ ```bash
338
+ vw completion zsh
339
+ vw completion fish
340
+ vw completion zsh --install
341
+ ```
342
+
343
+ 機能:
344
+ - zsh / fish 向け補完スクリプトを出力
345
+ - `--install` 指定時はデフォルトまたは `--path` に補完ファイルを書き込む
346
+
347
+ ## merged 判定(ローカル + PR)
348
+
349
+ 各 worktree で次を評価します:
350
+
351
+ - `merged.byAncestry`: ローカル履歴判定(`git merge-base --is-ancestor`)
352
+ - `merged.byPR`: GitHub PR merged 判定(`gh`)
353
+ - `merged.overall`: 最終判定
354
+
355
+ `overall` ポリシー:
356
+
357
+ - `byPR === true` -> `overall = true`
358
+ - `byPR === false` -> `overall = false`
359
+ - `byPR === null` -> `byAncestry` にフォールバック
360
+
361
+ `byPR` が `null` になる例:
362
+ - `gh` 未導入
363
+ - `gh auth` 未設定
364
+ - API 失敗
365
+ - `git config vde-worktree.enableGh false`
366
+
367
+ ## JSON 契約
368
+
369
+ `--json` 指定時、stdout は常に単一 JSON オブジェクトです。
370
+
371
+ 共通成功フィールド:
372
+ - `schemaVersion`
373
+ - `command`
374
+ - `status`
375
+ - `repoRoot`
376
+
377
+ エラー時:
378
+ - `status: "error"`
379
+ - `code`
380
+ - `message`
381
+ - `details`
382
+
383
+ ## 設定キー(git config)
384
+
385
+ - `vde-worktree.baseBranch`
386
+ - `vde-worktree.baseRemote`
387
+ - `vde-worktree.enableGh`
388
+ - `vde-worktree.hooksEnabled`
389
+ - `vde-worktree.hookTimeoutMs`
390
+ - `vde-worktree.lockTimeoutMs`
391
+ - `vde-worktree.staleLockTTLSeconds`
392
+
393
+ ## 現在のスコープ
394
+
395
+ - Ink ベースの `tui` は未実装