local-link/skills/mac/move-project/SKILL.md
把项目迁移到新目录,并同步所有按项目绝对路径索引的数据(Claude Code 会话历史、缓存、配置,以及编辑器与工具的路径记录),避免迁移后会话丢失或工具跳错路径。
npx skillsauth add lionad-morotar/local-tools move-projectInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
把项目迁到新目录,并同步所有"按项目绝对路径索引"的 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 等编辑器项目列表。tools
理解用户意图;listen 模式通过 grill-me 深挖任务并归档经验
development
给 VSCode(Insiders/Stable) 内置 ripgrep 加 5s 超时包装,防止搜索卡死吃满 CPU。--on 包装(幂等) / --off 还原 / 不带参数查状态。Use when VSCode 搜索卡死、rg 进程占满 CPU,或 VSCode 更新后超时保护失效需要重包。
development
为指定项目创建完全隔离的 hapi(Claude Code On the Go)实例,包括独立数据目录、LaunchAgent 持久化、zsh wrapper 和 app.hapi.run 直连 URL。与全局 ~/.hapi 互不干扰。
development
关闭承载当前 Claude Code 会话的宿主(VSCode 窗口或其终端面板),连同 claude 一起退出。通过 close-host-window 扩展触发:先 SIGTERM claude(走完 SessionEnd hooks)再关 host,不抢焦点、不丢 hooks。--host vscode 关窗口、--host terminal(默认)只关终端面板。Use when 任务结束要随宿主退出,或需精确关闭某 claude 终端所在窗口/面板。