| Crates.io | twin-cli |
| lib.rs | twin-cli |
| version | 0.2.0 |
| created_at | 2025-08-16 13:37:51.392296+00 |
| updated_at | 2025-08-17 06:32:36.350737+00 |
| description | Git worktree wrapper with side effects (symlinks and hooks) |
| homepage | https://github.com/cotrin/twin |
| repository | https://github.com/cotrin/twin |
| max_upload_size | |
| id | 1798452 |
| size | 426,200 |
Twin は Git worktree の薄いラッパーで、シンボリックリンクやフックなどの副作用を追加した CLI ツールです。
Git worktree コマンドをベースに、以下の副作用を追加しました:
# crates.ioから直接インストール
cargo install twin-cli
# または、最新の開発版をGitHubからインストール
cargo install --git https://github.com/yourusername/twin
# リポジトリをクローン
git clone https://github.com/yourusername/twin
cd twin
# ビルド&インストール
cargo install --path .
Releasesページから、お使いのプラットフォーム用のバイナリをダウンロードできます。
# 基本的な使用方法(ブランチ名のみ指定)
# デフォルトで ./worktrees/feature-new に作成される
twin add feature-new
# パスを明示的に指定
twin add feature-new ../custom-path
# 新しいブランチを作成
twin add feature-new -b feature-new
# 設定ファイルを指定(副作用を適用)
twin add feature-new --config .twin.toml
# Git worktree のみ実行(副作用をスキップ)
twin add feature-new --git-only
# その他の git worktree オプションもサポート
twin add feature-new --detach
twin add feature-new --lock
デフォルトでは、設定ファイルの worktree_base に指定されたディレクトリ(デフォルト: ./worktrees)に、ブランチ名と同じ名前のディレクトリが作成されます。
# デフォルト(テーブル形式)
twin list
# JSON形式で出力
twin list --format json
# シンプルな形式
twin list --format simple
# 通常の削除(ブランチ名またはパスを指定)
twin remove feature-new
twin remove ../feature-new
# 強制削除(エラーを無視)
twin remove feature-new --force
# Git worktree のみ実行(副作用をスキップ)
twin remove feature-new --git-only
# デフォルト設定をTOML形式で出力
twin config default
# 現在の設定を表示
twin config --show
# 設定値をセット(未実装)
twin config --set key=value
# 設定値を取得(未実装)
twin config --get key
以下の機能は現在未実装です:
twin config --set/--get - 設定値の取得・設定Twin は .twin.toml という設定ファイルを使用して副作用を定義します。
# .twin.toml - Twin設定ファイルの例
# Worktreeのベースディレクトリ(省略時: ./worktrees)
worktree_base = "./worktrees"
# ファイルマッピング設定
# Worktree作成時に自動的にシンボリックリンクやコピーを作成します
[[files]]
path = ".env.template" # ソースファイルのパス
mapping_type = "copy" # "symlink" または "copy"
description = "環境変数設定" # 説明(省略可)
skip_if_exists = true # 既存ファイルをスキップ(省略可)
[[files]]
path = ".claude/config.json"
mapping_type = "symlink"
description = "Claude設定ファイル"
# フック設定(worktree作成・削除時に実行するコマンド)
[hooks]
pre_create = [
{ command = "echo", args = ["Creating: {{branch}}"] }
]
post_create = [
{ command = "npm", args = ["install"], continue_on_error = true }
]
pre_remove = []
post_remove = []
[[files]])| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
path |
string | ✓ | ファイルパス(メインリポジトリとworktreeで同じパス) |
mapping_type |
string | - | "symlink" または "copy"(デフォルト: "symlink") |
skip_if_exists |
bool | - | 既存ファイルをスキップ(デフォルト: false) |
description |
string | - | マッピングの説明 |
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
command |
string | ✓ | 実行するコマンド |
args |
array | - | コマンド引数({{branch}}、{{worktree_path}}などの変数を使用可) |
continue_on_error |
bool | - | エラー時も続行(デフォルト: false) |
timeout |
u64 | - | タイムアウト秒数(デフォルト: 60) |
問題: 「シンボリックリンクの作成に失敗しました」というエラーが表示される
解決方法:
開発者モードを有効にする(推奨)
管理者権限で実行する
ファイルコピーモードを使用する
mapping_type = "copy" を指定問題: 「Worktreeの作成に失敗しました」というエラー
考えられる原因と解決方法:
Gitリポジトリではない
git init
同名のブランチが既に存在する
# ブランチを確認
git branch -a
# 別の名前を指定
twin add ../agent-001 -b feature/another-name
# または強制的にブランチを再作成
twin add ../agent-001 -B feature/new-name
Worktreeが既に存在する
# Worktreeを確認
twin list
# または
git worktree list
# 既存のWorktreeを削除
twin remove ../agent-001
# または
git worktree remove ../agent-001
問題: カスタム設定が適用されない
確認事項:
設定ファイルの場所
./.twin.toml設定ファイルの形式
# デフォルト設定を確認
twin config default
TOML構文エラー
環境変数を設定してデバッグ情報を表示:
# 詳細ログを表示
export RUST_LOG=debug
twin add ../agent-001 -b feature/test
# Gitのみ実行(副作用をスキップ)
twin add ../agent-001 --git-only
MIT License
プルリクエストを歓迎します。大きな変更の場合は、まずissueを開いて変更内容について議論してください。
問題が発生した場合は、GitHubのissuesページで報告してください。