0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude Codeのプロジェクト切り替えが面倒だったので、WSLでprojコマンドを作った

0
Posted at

74b5dd5d-db75-4185-8dc8-99081fa5162e.png

背景

Claude Code をメインの開発ツールとして使い始めてから、ひとつ地味に面倒なことがあった。

cd ~/projects/company-site
claude

プロジェクトを切り替えるたびに cd して、claude を打つ。

それだけといえばそれだけなのだけど、複数プロジェクトを並走させていると、どこで何を開いたかがだんだん分かりにくくなる。

自分の場合は、こんな感じで複数のプロジェクトを行き来している。

~/projects/company-site
~/projects/school-news-tool
~/projects/side-project

そこで作ったのが proj コマンド。

番号を選ぶだけで、対象のプロジェクトを開き、Claude Code も起動する簡単なシェルスクリプトです。

=== プロジェクト ===
   1. company-site  — 会社サイト
   2. school-news-tool  — 学級通信ツール
   3. side-project  — 新企画メモ
   a. 新規プロジェクトを追加
   q. 終了

番号を入力: 1
▶ company-site を開いています...
✓ 新しいタブで Claude Code を開きました: company-site

環境

今回の環境は以下です。

  • Windows 11
  • WSL2 / Ubuntu
  • Windows Terminal
  • Claude Code(WSL 側にインストール)

やりたかったこと

やりたかったことはシンプルです。

proj

と打つ。

すると、登録済みのプロジェクト一覧が表示される。

=== プロジェクト ===
   1. company-site  — 会社サイト
   2. school-news-tool  — 学級通信ツール
   3. side-project  — 新企画メモ
   a. 新規プロジェクトを追加
   q. 終了

番号を選ぶと、そのプロジェクトを開く。

code コマンドが使える環境なら VS Code も開く。

さらに Windows Terminal の新しいタブで Claude Code も起動する。

これだけです。

地味ですが、毎日使うものなので、この「地味」がかなり効きます。


核心:Claude Code の環境変数問題

最初は単純に、こう書けばいいと思っていました。

cd "$project_dir"
claude

ただ、Claude Code の中から別プロジェクトを開こうとすると、これがうまく動かないことがありました。

理由は、Claude Code がプロセス起動時にいくつかの環境変数をセットしているためです。

Claude Code の中から子プロセスとして claude を呼ぶと、その環境変数が引き継がれてしまい、正常に起動しないことがあります。

実際に Claude Code 内で以下を実行すると、関連する環境変数が確認できます。

env | grep -E "CLAUDECODE|CLAUDE_CODE|AI_AGENT"

例として、こんな変数が並びます。

CLAUDE_CODE_CHILD_SESSION=1
AI_AGENT=claude-code_2-1-193_agent
CLAUDE_CODE_SESSION_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
CLAUDECODE=1
CLAUDE_CODE_ENTRYPOINT=cli
CLAUDE_CODE_EXECPATH=/path/to/claude.exe

この状態でそのまま claude を起動すると、親の Claude Code セッション情報を引き継いでしまうことがあります。

そこで、env -u を使って、問題になりそうな環境変数を明示的に外してから起動します。

env -u CLAUDECODE \
    -u CLAUDE_CODE_ENTRYPOINT \
    -u CLAUDE_CODE_SESSION_ID \
    -u CLAUDE_CODE_CHILD_SESSION \
    -u CLAUDE_CODE_EXECPATH \
    -u AI_AGENT \
    claude

これで、Claude Code の中から別の Claude Code を起動する場合でも、余計な環境変数を引き継がずに起動できます。


Windows Terminal の新タブで開く

せっかくなら、同じターミナル内で実行するのではなく、Windows Terminal の新しいタブで開きたい。

WSL 側から wt.exe を呼べば、それができます。

wt.exe -w 0 new-tab wsl.exe --cd "$project_dir" -- claude

それぞれの意味はこうです。

-w 0

今開いている Windows Terminal のウィンドウを対象にします。

new-tab

新しいタブを開きます。

wsl.exe --cd "$project_dir"

WSL を指定したディレクトリで起動します。

-- claude

そのまま claude を実行します。

これで、プロジェクトごとに Claude Code を別タブで開けるようになります。


wt.exe がない場合はフォールバックする

ただし、常に wt.exe が使えるとは限りません。

たとえば SSH 経由で作業している場合や、Windows Terminal 前提ではない環境では wt.exe が存在しないことがあります。

なので、wt.exe が使える場合は Windows Terminal の新タブで開く。

wt.exe が使えない場合は、現在のシェルから claude を起動する。

という形にしました。

if command -v wt.exe &>/dev/null; then
    wt.exe -w 0 new-tab wsl.exe --cd "$project_dir" -- claude
else
    cd "$project_dir" || return

    env -u CLAUDECODE \
        -u CLAUDE_CODE_ENTRYPOINT \
        -u CLAUDE_CODE_SESSION_ID \
        -u CLAUDE_CODE_CHILD_SESSION \
        -u CLAUDE_CODE_EXECPATH \
        -u AI_AGENT \
        claude

    cd "$HOME" || true
fi

wt.exe が使える場合は、新しい WSL セッションとして起動します。

一方、フォールバック時は現在のシェルから claude を起動するため、Claude Code 関連の環境変数を引き継ぐ可能性があります。

そのため、フォールバック側では env -u で明示的に環境変数を外しています。


CLAUDE.md を自動生成する

新規プロジェクトを追加するときは、ついでに CLAUDE.md も作るようにしました。

Claude Code はプロジェクトルートの CLAUDE.md を読んで、プロジェクトの前提や方針を把握してくれます。

今回のスクリプトでは、最低限としてプロジェクト名と説明だけを書いた CLAUDE.md を自動生成しています。

cat > "$project_dir/CLAUDE.md" << EOF
# $name
${desc:-(説明なし)}
EOF

最初から作り込みすぎなくても、ファイルがあるだけで十分です。

あとから必要に応じて、よく使うコマンド、ディレクトリ構成、注意点などを書き足していけばいい。

新規プロジェクトを作った直後に、Claude Code が何も知らない状態から始まるより、少しだけでも前提を渡せる状態にしておく。

それくらいの目的です。


プロジェクト情報は .project-info に持たせる

各プロジェクトには .project-info というファイルを置くようにしました。

中身はこんな感じです。

name=company-site
description=会社サイト
created=2026-06-27

proj コマンドは、~/projects/ 配下のフォルダを見て、この .project-info を読み込みます。

get_project_info() {
    local dir="$1"
    local field="$2"
    if [ -f "$dir/.project-info" ]; then
        grep "^${field}=" "$dir/.project-info" | cut -d'=' -f2-
    fi
}

.project-info があれば、その中の namedescription を表示する。

なければフォルダ名をそのまま表示する。

それだけの作りです。


新規プロジェクトも追加できる

メニューで a を選ぶと、新規プロジェクトを追加できます。

a. 新規プロジェクトを追加

プロジェクト名と説明を入力すると、以下のような構成を作ります。

~/projects/new-project/
├── .claude/
├── .vscode/
├── .project-info
└── CLAUDE.md

ついでに VS Code 用の最低限の設定も作っています。

{
    "editor.formatOnSave": true,
    "editor.tabSize": 2
}

ここは好みなので、不要なら削ってもいいと思います。


セットアップ

スクリプトを ~/project-manager.sh として保存します。

そのあと、.bashrc にエイリアスを追加します。

# ~/.bashrc に追記
alias proj='bash ~/project-manager.sh'

反映します。

source ~/.bashrc

これで、どこからでも proj コマンドが使えるようになります。

proj

スクリプト全文は Gist に置いてあります。

project-manager.sh

この記事内のプロジェクト名はダミーです。

実際には ~/projects/ 配下の各フォルダにある .project-info を読んで一覧化しています。


既存プロジェクトを取り込む場合

既存プロジェクトを取り込みたい場合は、そのプロジェクト直下に .project-info を作ればOKです。

~/projects/my-project/.project-info

中身はこんな感じです。

name=my-project
description=説明文
created=2026-06-27

これで proj の一覧に表示されます。

=== プロジェクト ===
   1. my-project  — 説明文

まとめ

ポイント 内容
env -u で環境変数をクリア Claude Code の中から Claude Code を起動するときに使う
wt.exe new-tab WSL 側から Windows Terminal の新タブを開ける
CLAUDE.md 自動生成 新規プロジェクトを Claude Code で扱いやすくする
.project-info 既存プロジェクトもメニューに取り込める
proj コマンド 複数プロジェクトの切り替えを少し楽にする

やっていること自体は、ただのシェルスクリプトです。

でも、ワンオペで複数プロジェクトを回していると、こういう「開くまでの摩擦を減らす」工夫がじわじわ効いてきます。

cd して、場所を確認して、claude を打つ。

その数秒を毎回やらなくてよくなる。

小さい改善ですが、毎日使うなら十分に元が取れます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?