lov-cc-mv · git:20260418.d0dd91d · 2026-04-18 · sha256 b2773778d5cf795e

lov-cc-mv git:20260418.d0dd91dA

Immutable. This exact content is served forever at /api/v1/blob/b2773778d5cf795e.

---
name: lovstudio:cc-migrate-session
description: Recover Claude Code session history lost after a project folder moved or was renamed. 项目迁移后 claude --resume / cc --resume 找不到历史会话时用此 skill 迁移 session 存储。
when_to_use: |
  User mentions project moved/renamed AND old or new absolute path. Examples:
  - "本项目之前是在 X" / "这个项目原来在 X" / "我把项目搬到了 X" / "项目迁移到了 X"
  - "this project used to be at X" / "moved the repo to X" / "renamed the folder"
  - "claude --resume 找不到" / "cc --resume 找不到历史" / "恢复旧会话"
  NOT for file/function/branch renames — only project root dir moves.
license: MIT
compatibility: claude-code
---

# lovstudio:cc-migrate-session

Moves the session store `~/.claude/projects/<slug>/` from the old path-slug to the new one and rewrites every `"cwd"` field inside the jsonl files. After this, `claude --resume` from the new directory will see all prior sessions.

## When to Trigger

**YES** — invoke this skill when:
- User says the project folder moved / was renamed at the filesystem level
- User mentions both FROM and TO paths, OR mentions one and the current cwd implies the other
- User complains that `claude --resume` no longer shows history after moving a folder
- User wants to "recover" sessions from a path they used to work in

**NO** — don't invoke when:
- User is renaming a file, function, variable, or branch (not the project root)
- User is asking a general question about CC's storage model (just explain, don't migrate)
- Paths are ambiguous — ask first

## Workflow

### Step 1 — Gather FROM and TO

Infer from the conversation first. Typical patterns:

| User said | FROM | TO |
|-----------|------|----|
| "我把项目从 /a 搬到了 /b" | /a | /b |
| "this project used to be at /old" (in new cwd) | /old | `process.cwd()` (current) |
| "本项目已迁移到 /new" (in old cwd) | `process.cwd()` (current) | /new |
| "I renamed ~/foo to ~/bar" | ~/foo | ~/bar |

If either side is ambiguous, **ask once** with `AskUserQuestion`. Don't guess.

**Always** expand `~` and resolve to absolute paths before running the CLI.

### Step 2 — Run dry-run + json to preview

```bash
npx -y @lovstudio/cc-migrate-session <FROM> <TO> --dry-run --json
```

Parse the JSON. Tell the user:
- How many sessions were found
- Total size
- Warn if `toDirExists` is true (destination slug dir already exists — merge risk)
- Show the FROM and TO slugs so the user can sanity-check the path mapping

If `sessionCount === 0`, stop. Tell the user either (a) the FROM path is wrong, or (b) CC never ran there. Do NOT proceed.

### Step 3 — Confirm with user

Use `AskUserQuestion` (or inline yes/no) asking: "Migrate N sessions from <FROM> to <TO>?"

Only proceed on explicit yes.

### Step 4 — Execute

```bash
npx -y @lovstudio/cc-migrate-session <FROM> <TO> --yes --json
```

Parse `phase: "done"` output. Extract:
- `rewrites` (total cwd lines changed)
- `restartHint.cd` and `restartHint.command`

### Step 5 — Tell user to restart CC

Output something like:

```
✓ Migrated N session(s), rewrote M cwd lines.

To load them, restart Claude Code in the new location:

  cd <TO>
  claude --resume

(The original session dir at ~/.claude/projects/<old-slug>/ is untouched —
you can delete it after verifying the new location works.)
```

**IMPORTANT**: The CURRENT Claude Code session (the one running this skill) cannot "switch" its own cwd mid-session. The user must exit and re-invoke `claude` from the new directory. State this clearly.

## CLI Reference

`npx -y @lovstudio/cc-migrate-session <FROM> <TO> [options]`

| Option | Purpose |
|--------|---------|
| `-y`, `--yes` | Skip confirmation prompt |
| `--dry-run` | Show plan, don't write |
| `--json` | Machine-readable output (use this from the skill) |
| `--projects-dir <dir>` | Override CC projects dir (default `~/.claude/projects`) |

## Slug Rule (FYI)

CC computes the slug by replacing every non-alphanumeric character with `-`. So:
- `/Users/mark/my-project` → `-Users-mark-my-project`
- `/Users/mark/.claude` → `-Users-mark--claude` (double `-` because `.` is non-alnum)
- `/Users/mark/@手工川` → `-Users-mark-----` (one per `@` and each CJK char)

The CLI handles this automatically — don't try to hand-compute it.

## Safety

- The old dir is NEVER deleted by this skill. It's a copy-then-rewrite, not a move.
- Tell the user to verify `claude --resume` works in the new location before rm'ing the old slug dir.
- If destination slug dir already exists, the CLI merges (overwriting conflicting jsonls). Warn the user.