功能建议:支持将 Local 会话安全移入托管 Worktree(反向 Handoff)
- Dominant language
- TypeScript
- Stars
- 2.7k
- Forks
- 395
- Avg merge
- 21h 48m
- Merged PRs (30d)
- 776
Description
**客户端版本**: 0.1.45
**反馈类型**: feature
---
## 使用场景
用户直接在 `master` / `main` 主 checkout 上开始开发,会话运行中需要隔离环境(并行开发、实验性改动、避免污染主工作树)时,希望把**当前会话连同在途代码改动**安全移交到新建的 Cindy 托管 Worktree 中继续开发,主工作树恢复干净。
## 当前痛点
Cindy 的 Worktree 创建(新会话勾选 worktree / Goal 流程 / `send_to_session` 的 `use_worktree`)都只能发生在**创建期**;会话一旦建立,workingDir 与 worktree 绑定不可变。直接修改 workingDir 会造成「任务已进 Worktree、代码仍留在主仓」的分裂状态。当前唯一受支持的方向是反过来的:#2190 讨论的「Worktree 会话 Handoff 回 Local」。
## 诉求
1. 同时移动会话上下文与在途代码改动,不只是切换任务的工作目录;
2. 会话移入**新建的托管 Worktree**(`/.cindy-worktrees/` + `cindy/` 分支,store 绑定、侧栏徽标、关闭时回收),主仓不残留会话在途改动;
3. 支持源主仓常见状态:dirty tracked / untracked 改动、已提交 commits、detached HEAD、cwd 位于仓库子目录;
4. 迁移成功后会话在 Worktree 中继续运行(后续发送 lazy resume 到新目录);
5. 不自动 commit / merge / push / 删除任何分支或 worktree,这些操作始终由用户显式授权。
## 建议方案(方向对称复用 #2190 讨论的机制清单)
- **冻结资格**:本机会话、cwd 位于主仓 git 树内、未登记在其它 worktree 下、无运行中 turn、非远程 / device-link / review 会话。
- **预检快照**:源 HEAD / 分支 / dirty 清单;目标端为从零创建的全新 worktree,天然干净——#2190 最棘手的「目标已有无关改动 / 目标分支已存在」在反向上不存在。
- **建 worktree**:复用 `WorktreeManager.createWorktree`(命名避让、deferred checkout、`.claude/.sivi` 复制、store 绑定、safe.directory);源分支语义复用 `handoffWorktree.ts` 的「派生子任务」裁决(以会话当前 HEAD / 检出分支为基底)。目标分支恒为新名,天然避开「同一分支不能同时被两个 worktree checkout」的 Git 约束。
- **转移未提交内容**:复用 `dirty.ts` 的 stash-form snapshot / ref 设施,apply 后核对目标 `git status` 与文件清单,不另建一套漂移的 Git 安全判据。
- **切换任务**:Git 侧全部验证后关 runtime → 走宿主业务入口更新 `workingDir`(不从 renderer 拼通用 patch)→ cc 会话复用 `claude-transcript-relocation.ts`;Codex / Pi 分别验证 cwd 变化后的 resume 行为。
- **完成摘要与补偿**:源/目标路径、已转移 commits 与文件数、未转移清单、源清理结果;持久化 journal 分阶段补偿(`preflighted → worktree_created → changes_applied → target_verified → runtime_closed → session_moved → completed`),重启可续或保守回退。
## 设计裁决(用户已确认)
1. **源清理语义**:触发迁移时由 agent 询问用户如何处理源主仓的在途改动(stash 移走 / 保留原地告警等),得到答复后再推进,不预设默认行为。
2. **cwd 子目录**:预检记录源 cwd 相对仓库根的路径,worktree 内新 cwd 保持同相对路径。
3. **memory**:采用 #2379 / #2399 的 scope key git 归一化方案(`resolveMemoryScopeKey` 将 worktree cwd 映射回主仓根 + 相对子路径),迁移后记忆 scope 不变、不中断。
## 建议范围(首版)
仅本机 Desktop、Cindy 托管 worktree、源为主仓 checkout;暂不覆盖 SSH / device-link / Mobile 发起、非托管外部 worktree、自动 stash / merge / push / 删除。
## 相关 issue
- #2190:反向 Handoff 的机制清单与「不做成按钮 + 一次 workingDir 更新」的结论
- #1762:workingDir 多消费方约束(执行 cwd / 安全根 / Git / 项目配置 / 持久化 scope)
- #2379 / #2399:worktree 会话 memory scope 归一化
- #811 / #842:`send_to_session` 创建期 worktree 能力
- #886 / #1376:worktree 生命周期与源分支基底治理
---
**版本区域**: CN
**OS**: win32 x64 (10.0.19045)
**界面语言**: zh-CN
Contributor guide
Research direction
Start by reading WorktreeManager.createWorktree, handoffWorktree.ts, dirty.ts, and claude-transcript-relocation.ts, then review the constraints in #1762, #2379, and #2399. Done means a local Desktop session can move into a new managed worktree with commits and uncommitted changes preserved, cwd and memory scope maintained, journaled recovery, and no implicit commit, merge, push, or deletion.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- git, typescript
- Domain
- desktop, developer-experience, tooling
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100