Repository navigation
[建议] 会话级文件隔离:共享工作区根 + 每个对话一个私有子目录 #9713
Pub-Polaris
started this conversation in
Ideas
Replies: 2 comments 5 replies
|
说人话就是: 故此希望以会话级的形式,每个新对话单开一个自己的子工作文件夹,但让他们共享一份根目录里的 AGENTS.md 和文件。根目录是所有对话共用的地方:公共文件放这里,由开在根目录的对话维护;在各自格子里干活的对话只读不写 —— 这样根目录就不会被各个对话的私用文件堆满。 一定程度上可以减缓工作区内部的文件查看和调度混乱,对于其他的 agent 客户端(例如 Opencode/Codex/Claude Code),这也能一定程度上规范并在不同上下文之间统一多个客户端之间文件的更改。 如果需要一个对话更改其他对话文件夹的文件,只需要对每个对话分别选择性放行即可 算是一种更取巧和安全的会话级文件隔离策略? |
3 replies
|
|
2 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
我要什么
我想在一个工作区里同时开很多对话折腾小玩意儿,最后各自进自己的目录(命名可以是基于 hash/uuid 的)。
但新会话老把东西丢根目录,几轮就乱。我希望每个对话有自己的子目录,根目录保持干净,但根目录下的
AGENTS.md、以及其他文件大家共用。它不需要 git,且 DSH 内就能管理。
而且我在 opencode-lcm 上被 git 坑过一次,炸了 oc-lcm 的数据库。
这里,是我的一些别的个人看法
现在卡在哪
上面那条"每个工作区都是一个项目",在今天的 DSH 上做不到 —— 而且是静默做不到。
@deepseek-ai/dsh-agent-instructions决定"这次该读哪些 AGENTS.md"的方式,是从会话所在目录往上找第一个带.git的目录当起点,再从那儿往下把每层的 AGENTS.md 捡进来。lib/index.js:找不到标记时,它就把会话自己的目录当成起点,于是该读的清单里只剩它自己。
在真实部署上把这段逻辑原样重放:
AGENTS.md?…\Private_Workspace…\Private_Workspace\_sessions\<会话>…\Private_Workspace\<嵌套仓库>(自带.git)也就是说:只要会话落进子目录,工作区根那份
AGENTS.md就整份读不到,而且不报错。 这直接把"一个对话一个格子"的用法判了死刑。根本问题是:
.git是版本控制的标记,不是"这个文件夹该读到哪些规矩"的标记。 它出现在哪,往往只是因为我 clone 了个东西。而 DSH 手里有一个更可信的信号:我在 GUI 里注册过的那个工作区目录 —— 那是我明确表达过的意图。用它就可以完全不需要
.git。最后…
不是 所有人都会有时间去理解新的东西,然后开始在不断的疑惑和学习里把自己搞得又头大又忧虑的。
By DSH
旧版正文(已被上面的内容取代,保留备查)
摘要
一个工作区里想开好几个对话做不同的活。但每个新会话都直接把文件丢在工作区根目录,根目录很快就乱成一锅粥;更糟的是不同会话会互相覆盖。
想要的其实是一种会话级文件隔离,两层结构:
规则很简单:
DSH 今天已经有了什么
这件事的强制那半,其实已经到位了:
SessionHeader.cwd不可变,就是该会话的 workspace 根;sandboxMode是逐会话的(sandbox/mode事件写进会话日志,跨重启保留,两个会话绝不会看到彼此状态);workspace-write只允许改动位于会话工作区根之下的目标;fs-local完全一致"。所以只要把每个对话的 cwd 设成自己的子目录,"一个对话写不进另一个对话的目录"就是被强制的,而不是靠提示词自觉。私有那半不用发明。
缺的两块
缺 A:共享根拿不到指令链
@deepseek-ai/dsh-agent-instructions把指令链的根定在"发现到的项目根"。lib/index.js的findProjectRoot():ancestorChain(root, cwd)在root === cwd时返回[cwd]。也就是说:工作区根没有.git这类标记时,子目录会话的指令链只有它自己那一层,共享的AGENTS.md完全收不到。而.git是唯一能声明"这个目录是作用域根"的手段,同时projectRootMarkers又是 profile 级配置 —— 用户没法单独把某个文件夹标成根。在真实部署上把这两个函数原样重放:
AGENTS.md?…\Private_Workspace…\Private_Workspace\_sessions\<会话>…\Private_Workspace\<嵌套仓库>(自带.git)git init一下工作区根就能解决 —— 但那是拿版本控制标记当作用域标记用,嵌套仓库那种情况仍然修不了。缺 B:每个会话只能有一个可写根
这条是"共享根大家都能改"的硬拦路虎,而且写在包自己的局限里:
一个可写根,意味着这两件事只能选一件:
但底层其实已经支持"一组"可写根。
dsh-fs-sandbox的围栏条件是:目标位于"由唯一的writableRoots函数派生的某个可写根之下 —— 与 Seatbelt profile 授权的集合相同"。它本来就返回一个集合(工作区根 + 平台临时区)。也就是说管道是通的,只是策略层永远只塞一个进去。缺的只是让策略能声明"这个会话有两个根"。建议
ctx.workspaceRegistry;工作区就是已注册的绝对目录,会话 cwd 决定成员资格),所以这个锚点是现成的。找到标记时行为保持不变,现有的按仓库行为(包括嵌套仓库)一点不受影响。cwd、是因为没找到标记时,发一条类似现有Workspace instruction budget …的通知,别让被跳过的更宽泛AGENTS.md变成一个静默的谜。附带收益:跨客户端统一
这套约定写进共享的
AGENTS.md/CLAUDE.md之后,同一工作区里的其它 agent 客户端(OpenCode、Codex、Claude Code……)也会照着做 —— 它们本来就可能顺手改坏工作区里别人的文件。需要说清楚的是力度差别:DSH 这边是强制的(
workspace-write下真写不出去),其它客户端那边只是约定(它们各有各的沙箱模型,读到指令才照做)。所以跨客户端统一的是"同一套目录约定",不是"同一条边界"。约定本身仍然值钱 —— 它是唯一能让多个客户端在同一工作区里不互相踩的东西。退一步的版本
如果"共享根可写"一时做不了,那么"共享根只读、每个会话只写自己的子目录"今天就能落地:工作区根放个
.git当标记 → 每个对话注册成一个工作区 → 模式切成workspace-write。读不受限,所以公共脚本照样读得到、跑得起来,只是谁都改不了它。上面缺 A 那条修好之后,连.git这个权宜之计都不需要了。By DSH
All reactions