---
name: cc-project-relocate
description: |
  Claude Code のプロジェクトフォルダを移動・リネームした後に、パスに紐づく状態を新パスへ追随させるスキル。
  ~/.claude/projects/<エンコード済みパス> のセッションログ dir（会話 JSONL・tool-results・memory）を
  リネーム/マージし、任意で ~/.claude.json の projects キー（trust・allowedTools・MCP 設定）も移行する。
  トリガー: 「プロジェクトを移動したらログが見えなくなった」「フォルダをリネームしたら過去の会話履歴が
  引き継がれない」「Claude Code のログ dir をリネームしたい」「プロジェクトの保存場所を変えた後の追随」
  「セッションログを新しいパスに移したい」など。破壊的操作を含むため必ず dry-run → 確認 → 実行で進める。
---

# cc-project-relocate — プロジェクト移動後にログ/設定を新パスへ追随させる

## このスキルが解決すること

Claude Code はセッションログを `~/.claude/projects/<エンコード済み絶対パス>/` に保存する。
フォルダを移動・リネームすると、新しいパスからは過去ログが参照されなくなる（ログ自体は旧 dir に残る）。
このスキルは旧 dir を新パスのエンコード名へ **リネーム/マージ** して履歴を引き継ぐ。

### エンコード規則（要点）

ディレクトリ名は「`/` を `-`」ではなく **英数字以外を全て `-` に置換**する（`_` `.` スペース・日本語も含む。1 文字 = 1 ダッシュ）。
このため手計算での dir 名特定は誤りやすい。AI は手で組み立てず、**スクリプトに本体と同一規則で計算させる**。
規則の詳細・検証例・根拠（node を使う理由を含む）は `references/encoding-and-state.md` を参照。

### パスに紐づく状態（移行対象）

| 対象 | 場所 | 既定 |
|---|---|---|
| セッションログ（JSONL・tool-results・**memory**） | `~/.claude/projects/<enc>/` | 常に移行 |
| プロジェクト設定（trust・allowedTools・MCP 有効化・メトリクス） | `~/.claude.json` の `projects["<絶対パス>"]` | `--update-config` 時のみ |

`todos` / `history.jsonl` / `shell-snapshots` は session-id またはグローバル keyed でパス非依存 → 対応不要。
プロジェクト内の `.claude/settings.local.json` はフォルダごと移動するので自動追随する。

## 実行手順（AI はこの順で進める）

### Step 0 — 移動が完了しているか確認
- **移動後パス**は基本的に現在の作業ディレクトリ（このスキルを動かしているプロジェクトルート）。ユーザーに確認する。
- 移動前パスのフォルダが**もう存在しない**こと、移動後パスのフォルダが**存在する**ことを確認する。
  - 旧フォルダが残っている → 「移動」でなく「コピー」の可能性。ユーザーに確認（Stop And Ask）。
  - まだ移動していない → 先にフォルダ移動を促す。
- このセッション自体が移動前に起動されていた場合（cwd が旧パス）は、**一度 Claude Code を終了し、新パスで開き直してから**このスキルを使うのが安全。
- **重要（混乱を避ける）**: 移動後フォルダで CC を起動してこのスキルを使う限り、移動先のログ dir は起動時の現行セッション分で**必ず既に存在する**。これは正常で、マージが標準動作。「移動先のログ dir が既に存在します」を問題・例外であるかのようにユーザーへ伝えないこと（詳細は `references/encoding-and-state.md` のケース B）。

### Step 1 — 移動前パスを特定
- ユーザーに移動前の絶対パスを尋ねる。
- 思い出せない場合は、名前の断片でログ dir 候補を提示する:
  ```bash
  ls ~/.claude/projects | grep -i <フォルダ名の断片>
  ```
  （エンコードは不可逆なので自動復元はできない。断片マッチで当たりをつける）

### Step 2 — dry-run で計画確認
```bash
bash scripts/relocate.sh --old <移動前の絶対パス> --new <移動後の絶対パス> --dry-run
```
- 移動後パスを省略すると `$PWD` が使われる。
- trust/権限/MCP 設定も引き継ぎたい場合は `--update-config` を付ける。
- 出力の「ログ元 dir / ログ先 dir」が想定どおりか、衝突（同名ファイル）が無いかを確認してユーザーに見せる。

### Step 3 — 実行
ユーザーの承認を得てから dry-run を外して実行:
```bash
bash scripts/relocate.sh --old <...> --new <...>
# 設定も移す場合: --update-config を追加
```

### Step 4 — 検証と報告
- スクリプトが表示する新ログ dir の中身を確認し、結果を報告する。
- `--update-config` を使った場合は「**Claude Code 起動中は次回フラッシュで上書きされ得る**ので、確実に反映するには一度 CC を完全終了してから再実行を推奨」と伝える（ログ移行自体は起動中でも安全）。

## 安全設計（スクリプトの挙動）

- **dry-run 既定なし**だが、AI は必ず dry-run → 確認 → 実行の順で使う。
- 移動先 dir が**既にある** → **マージ**（移動後フォルダで起動してこのスキルを使う通常ケースは必ずこれ。起動時に現行セッションの JSONL が作られるため移動先 dir は常に存在する＝マージが標準動作）。移動先を優先し、元 dir は
  `~/.claude/backups/relocate/<旧enc>.<timestamp>/` へ退避（ハード削除しない＝復元可）。
- 移動先 dir が**無い**（移動後フォルダで CC 未起動の稀なケース）→ 単純リネーム（`mv`）。
- `~/.claude.json` は編集前に必ずタイムスタンプ付きバックアップを取り、`jq` で生成 → 妥当性検証 → 原子的に差し替え。
- encode は node で計算し、本体と完全一致を保証。

## 参照
- 規則の詳細・背景・復旧手順: `references/encoding-and-state.md`
- スクリプト本体: `scripts/relocate.sh`
