feat(project-mode): pid-keyed anchor — auto-deactivate on GA exit, multi-instance isolation (#592)

- Anchor file becomes temp/.active_project.<host pid>: dies with the GA process,
  so closing GA auto-deactivates; re-activation requires user confirmation per SOP
- Multiple GA instances each keep their own active project, no cross-talk
- Startup sweep removes only legacy unsuffixed anchors and own-pid leftovers
  (pid reuse); anchors of other pids are never touched — deliberately no
  liveness probe, because os.kill(pid, 0) on Windows terminates the process
This commit is contained in:
weijia authored and GitHub committed 2026-06-10 14:57:48 +08:00
1 parent 862fd8c375
commit 90d5002d1f
2 files changed
+32 -8

No files matched your search

+9 -3
View File
@@ -7,9 +7,14 @@ Project Mode = 跨会话保持项目认知的工作模式
## 进入
用户表示「进入/切换到 <项目名> 项目」时(下文路径一律以 cwd 为基准,cwd 即 GA 的 temp 目录;禁写 `temp/xxx` 前缀,会嵌套出 temp/temp):
锚 = `./.active_project.<宿主pid>`,只对当前 GA 进程有效:GA 关闭即自动失活;多开 GA 各自激活不同项目,互不干扰。(下文路径一律以 cwd 为基准,cwd 即 GA 的 temp 目录;禁写 `temp/xxx` 前缀,会嵌套出 temp/temp)
- 用户只说「进入项目模式」未指明项目:列出 `./projects/` 下各项目(名字 + memory 行数 + 最后修改时间),ask_user 让用户选定后再继续
- 用户明确说「进入/切换到 <项目名> 项目」:视为已确认,直接执行:
1. 建目录 `./projects/<项目名>/`,无则创建 `project_memory.md`(空文件即可)
2. 写文件锚:把 `<项目名>` 写入 `./.active_project`
2. 写文件锚,必须用 code_run(锚文件名含宿主 pid,ppid 即 GA 宿主进程):
`import os; open(f'./.active_project.{os.getppid()}', 'w').write('<项目名>')`
3. 回读 `project_memory.md` 全文,向用户复述项目现状
## 期间纪律
@@ -20,5 +25,6 @@ Project Mode = 跨会话保持项目认知的工作模式
## 离开
用户表示「离开项目模式」时:清空 `./.active_project`(仅关闭激活态,项目目录与 `project_memory.md` 原样保留)
用户表示「离开项目模式」时:删除 `./.active_project.<宿主pid>`(仅关闭激活态,项目目录与 `project_memory.md` 原样保留)
切换到另一项目时无需先离开,直接按「进入」覆盖文件锚即可
GA 关闭不需任何操作:锚随进程消亡自动失效,残留文件由插件下次启动时清扫