用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/Lionad-Morotar/local-tools --skill move-project命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | move-project |
| description | 把项目迁移到新目录,并同步所有按项目绝对路径索引的数据(Claude Code 会话历史、缓存、配置,以及编辑器与工具的路径记录),避免迁移后会话丢失或工具跳错路径。 |
| argument-hint | <source path> <target path> |
| disable-model-invocation | true |
把项目迁到新目录,并同步所有"按项目绝对路径索引"的 per-project 数据。路径一变这些数据全部失配,本 skill 保证会话历史不丢、配置不错位、工具不跳错路径。
许多工具按项目绝对路径索引数据,路径变了索引就断。迁移 = 搬项目 + 让所有索引跟上。
Claude Code 的索引规则是关键:绝对路径中的 / 全替换为 -。如 /Users/x/foo → -Users-x-foo。编码按字符串路径算、不解析软链——同一物理项目经两条路径访问会各产生一份编码目录与会话,互不相通。
claude-mem 的索引规则不同:它按 git toplevel 的 basename 索引 project。搬家不改名无需迁移;仅改目录名时才需归并 observations.project 与 sdk_sessions.project。
用 readlink -f 或比对 stat 的 inode 排除软链——"看似两个副本、实则同一物理目录"很常见,把软链当副本会迁错对象。以用户实际打开项目的路径作为编码基准,而非软链别名。
不要假设目标只是一个空目录。必须先摸清目标目录的约定,否则搬过去会破坏现有结构。
必查项:
git rev-parse --show-toplevel。ls -la <target-parent>/*/.git:若出现 .git 文件且内容为 gitdir: ...,说明是 submodule。cat <target-root>/.gitmodules:读取 submodule URL 与路径命名模式。git ls-files <target-parent>/<existing-child>:若只返回目录本身,说明是 submodule gitlink。demo-<name>)不要假设清单完备——逐项排查:
~/.claude/projects/<编码>~/Library/Caches/claude-cli-nodejs/<编码>~/.claude.json:projects 对象,key 是绝对路径~/.config/projects.json(若已注册)~/.claude-mem/claude-mem.db):按 git toplevel basename 索引不是所有占用都必须停止。分级处理:
| 类型 | 示例 | 处理方式 |
|---|---|---|
| 必须自动停止 | node dev server、git fsmonitor daemon、build watcher、测试进程 | lsof +D <old-path> 定位后停止 |
| 需用户知情 | VS Code、Cursor、JetBrains、Typora 等前台编辑器 | 提醒用户迁移后重新打开新路径,不强制关闭 |
| 可容忍 | 只读打开的文件、shell cwd | mv 后句柄自然失效,无需预处理 |
迁移前用 lsof +D <old-path> 输出占用清单,明确告诉用户哪些需要其手动配合。
同卷 mv 为原子操作,跨卷为复制。
mv <old> <new>。zRefs、.output、dist)应一并迁移,除非用户明确不要。node_modules、.pnpm-store 通常不迁移,目标位置重新安装。按顺序执行:
备份 ~/.claude.json、~/.config/projects.json、~/.claude-mem/claude-mem.db。
修改 ~/.claude.json 中 projects 的 key:旧路径 → 新路径。
修改 ~/.config/projects.json 中的 rootPath。
重命名 Claude Code 会话目录:~/.claude/projects/<旧编码> → ~/.claude/projects/<新编码>。
重命名 Claude Code 缓存目录:~/Library/Caches/claude-cli-nodejs/<旧编码> → ~/Library/Caches/claude-cli-nodejs/<新编码>。
替换会话历史与缓存中的旧绝对路径文本:
find ~/.claude/projects/<新编码> -type f \( -name '*.jsonl' -o -name '*.txt' \) -print0 \
| xargs -0 perl -pi -e 's|<old-path>|<new-path>|g'
find ~/Library/Caches/claude-cli-nodejs/<新编码> -type f \( -name '*.jsonl' -o -name '*.txt' -o -name '*.json' \) -print0 \
| xargs -0 perl -pi -e 's|<old-path>|<new-path>|g'
若目录名改变,归并 claude-mem:
sqlite3 ~/.claude-mem/claude-mem.db "
DROP TRIGGER observations_au;
UPDATE observations SET project = '<new-basename>' WHERE project = '<old-basename>';
UPDATE sdk_sessions SET project = '<new-basename>' WHERE project = '<old-basename>';
CREATE TRIGGER observations_au AFTER UPDATE ON observations BEGIN
INSERT INTO observations_fts(observations_fts, rowid, title, subtitle, narrative, text, facts, concepts)
VALUES('delete', old.id, old.title, old.subtitle, old.narrative, old.text, old.facts, old.concepts);
INSERT INTO observations_fts(rowid, title, subtitle, narrative, text, facts, concepts)
VALUES (new.id, new.title, new.subtitle, new.narrative, new.text, new.facts, new.concepts);
END;
"
清理 zoxide 等工具路径残留:zoxide remove <old-path>(如有记录)。
~/.claude.json、~/.config/projects.json、Claude 编码目录、缓存目录中无残留。git status、git log 在新位置正常工作。git submodule status 显示正确的 gitlink 与 commit。.gitmodules 包含正确条目,父仓库 .git/config 同步。git check-ignore 验证 zRefs、.output、dist、node_modules 被正确忽略。若目标目录中现有子项目都是 submodule(.git 为文件、父仓库存在 .gitmodules),按此流程:
git push?git remote add origin <url>。.gitignore)并 push。git submodule add <url> <path>。<path> 已存在,先完整备份到独立位置,删除已存在目录,让 git submodule add 创建标准结构,再把本地工作目录内容合并回去。mv <project>/.git <parent>/.git/modules/<path>,极易因目录已存在或嵌套而损坏。git update-index --add --cacheinfo 160000,<commit-sha>,<path> 手动写入 gitlink。.gitmodules 与 gitlink。直接 mv,然后按需创建或更新目标父仓库的 .gitignore,确保 node_modules、构建产物等不被意外提交。
mv 会变成复制 + 删除。对大仓库建议用 rsync -aP --exclude=node_modules <old>/ <new>/,然后验证文件完整性再删除旧目录。
cp -a <project>/.git /tmp/<project>-git-backup-$(date +%s)。rm -rf 可能包含唯一数据的目录。先移动到临时区,验证新结构可用后再删除。以下选择会显著影响迁移结果,skill 不应替用户默认:
zRefs 可能很大)。~/.config/projects.json 等编辑器项目列表。