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 +395 -0
- package/README.md +376 -28
- package/bin/vde-worktree +38 -0
- package/bin/vw +38 -0
- package/completions/fish/vw.fish +170 -0
- package/completions/zsh/_vw +287 -0
- package/dist/index.d.mts +1 -0
- package/dist/index.mjs +3355 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +78 -6
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` は未実装
|