Skills lovstudio:cc-migrate-session
Recover Claude Code session history lost after a project folder moved or was renamed. 项目迁移后 claude --resume / cc --resume 找不到历史会话时用此 skill 迁移 session 存储。
install
source · Clone the upstream repo
git clone https://github.com/lovstudio/skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/lovstudio/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/cc-migrate-session" ~/.claude/skills/lovstudio-skills-lovstudio-cc-migrate-session && rm -rf "$T"
manifest:
skills/cc-migrate-session/SKILL.mdsource content
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
no longer shows history after moving a folderclaude --resume - 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 | (current) |
| "本项目已迁移到 /new" (in old 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
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
is true (destination slug dir already exists — merge risk)toDirExists - 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
npx -y @lovstudio/cc-migrate-session <FROM> <TO> --yes --json
Parse
phase: "done" output. Extract:
(total cwd lines changed)rewrites
andrestartHint.cdrestartHint.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 |
|---|---|
, | Skip confirmation prompt |
| Show plan, don't write |
| Machine-readable output (use this from the skill) |
| Override CC projects dir (default ) |
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
(double-Users-mark--claude
because-
is non-alnum).
→/Users/mark/@手工川
(one per-Users-mark-----
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
works in the new location before rm'ing the old slug dir.claude --resume - If destination slug dir already exists, the CLI merges (overwriting conflicting jsonls). Warn the user.