ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Workspace 执行边界怎么定?文件系统与项目上下文的一次性配置清单

Workspace 执行边界怎么定?文件系统与项目上下文的一次性配置清单 1. 为什么多项目并行时Workspace 边界总在“打架”如果你同时维护三四个项目大概率遇到过这种场景早上在 A 项目里让 Agent 读src/config.ts下午切到 B 项目它却把 A 的AGENTS.md规则带了过来或者你明明只想让它改当前仓库它却顺着绝对路径摸到了~/Desktop上的旧备份。问题不在模型而在 Workspace 的边界没定清楚。先把概念说透。Workspace 在 OpenClaw 这类 Agent 运行时里同时扮演三个角色默认工作目录cwd、项目上下文来源、长期记忆与本地约定的承载地。工具执行时相对路径会解析到 Workspace 下所以rg TODO .里的.大概率就是当前 Workspace而不是系统随机目录。这一点让多项目切换变得稳定。但很多人会踩两个坑。第一个坑是把 Workspace 当成“项目源码目录”只往里放代码结果 Agent 每次启动都缺规则、缺用户信息、缺工具约定行为飘忽。第二个坑更危险以为 Workspace 天然是安全沙箱。实际上官方文档写得很清楚Workspace 是默认 cwd不是硬沙箱如果没有启用 sandbox绝对路径仍可能访问宿主机其他位置比如/etc、/tmp或你的桌面。所以正确的定位是Workspace 负责让 Agent 知道“我在哪、该按什么规则做事”而 sandbox、exec approvals、tool policy 才负责限制“我能碰什么”。这篇就围绕文件系统访问范围与项目上下文边界给出一份可复制的配置清单并附上逐项验证动作触发读写、触发越界请求确认边界生效且上下文命中正确。适合谁看适合同时跑多个仓库、用 Agent 做编码或运维辅助、又不想每次手动提醒“只看当前项目”的开发者。下面从 TaoToken 的前置准备开始一步步把边界钉死。2. TaoToken 前置把模型接入和 Workspace 配置分开管在动 Workspace 之前先把模型接入这条链路理顺否则后面排查报错时你会分不清是边界问题还是鉴权问题。TaoToken 的接入信息很集中官网是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基址是 https://taotoken.net/api 注意 API 地址不带 UTM 参数配置时别把查询串抄进去。你需要准备三件套Base URL、API Key、Model ID。Base URL 填https://taotoken.net/apiKey 在控制台的 API Keys 页面生成Model ID 按你实际要用的模型填。这三样在后面的 JSON、TOML、settings 片段里会反复出现建议先复制到一个临时文本里。生成 Key 的入口在这里https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。如果你还没决定用哪个模型可以先到模型对话页面试一下https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 。长期做编码或 Agent 任务的话Coding Plan 更划算https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。这里要强调一个原则模型接入配置和 Workspace 边界配置要分开存放。模型 Key 属于凭证不应该进项目仓库Workspace 里的AGENTS.md、TOOLS.md属于可解释行为的规则可以进私有 repo。把这两类东西混在一起是后面状态漂移和密钥泄露的常见根源。配置前先确认当前 profile。OpenClaw 默认 Workspace 通常是~/.openclaw/workspace如果你设置了非 default 的OPENCLAW_PROFILE默认位置会变成~/.openclaw/workspace-profile。同一台机器上出现多个 Workspace 目录很正常但官方提醒保留多个 Workspace 可能导致 auth 或状态漂移因为同一时间只有一个 Workspace 是活跃的。所以第一步不是急着写配置而是先搞清楚“现在活跃的是哪个”。你可以用下面这条命令确认当前指向echo PROFILE${OPENCLAW_PROFILE:-default} ls -la ~/.openclaw/ | grep workspace如果输出里同时出现workspace和workspace-dev两个目录而你的配置又指向了其中一个那 Agent “好像忘了规则”就不奇怪了。先统一到一个活跃 Workspace再谈边界。3. 可复制配置目录白名单、上下文注入与执行边界这一节是核心直接给可复制的片段。目标有三个限定文件系统访问范围、控制项目上下文注入、设定执行边界。配置分三层Workspace 层、sandbox 层、工具策略层。先看 Workspace 层的 JSON 配置。这段放在~/.openclaw/openclaw.json里注意这个文件本身不应该提交进任何项目仓库{ agents: { defaults: { workspace: ~/.openclaw/workspace, contextFiles: [ AGENTS.md, TOOLS.md, USER.md ], memoryDir: memory, skillsDir: skills } } }contextFiles是常驻上下文白名单只放长期操作原则和工具约定。不要把大段日志、历史聊天塞进AGENTS.md否则每次启动都背负巨大上下文既浪费 token 又稀释重点。memoryDir指向每日记忆日志目录skillsDir指向 Workspace 级技能。接着是 sandbox 层。当 sandboxing 启用且workspaceAccess不是rw时工具会在~/.openclaw/sandboxes下的 sandbox workspace 中运行而不是宿主 Workspace。这意味着你宿主目录里看不到 Agent 的改动别慌先查 sandbox 模式{ sandbox: { enabled: true, workspaceAccess: ro, mounts: [ { source: ~/.openclaw/workspace, target: /workspace, mode: ro } ] } }workspaceAccess设为ro表示只读挂载Agent 能读上下文但不能改宿主文件。需要写回时再单独开一个可写目录而不是整个 Workspace 放开。这就是“路径组织”和“权限隔离”分开看的意义Workspace 负责组织sandbox 负责限制。第三层是工具策略控制 shell 和文件读写的执行边界。下面这段限定 shell 只能在 Workspace 内执行且危险命令需要审批{ tools: { shell: { cwd: /workspace, allowAbsolutePaths: false, requireApproval: [rm, mv, chmod, curl] }, filesystem: { readWhitelist: [/workspace/**], writeWhitelist: [/workspace/tmp/**] } } }allowAbsolutePaths: false是关键它让绝对路径请求被拦下避免 Agent 顺着/Users/me/Desktop摸出去。readWhitelist和writeWhitelist用 glob 限定范围写权限只开tmp子目录改代码走审批。如果你用 Claude Code 或 Codex 这类工具配置形态不同但三件套一致。以 Codex 的auth.json为例Base URL、Key、Model ID 要写全{ base_url: https://taotoken.net/api, api_key: sk-你的Key, model: 你的ModelID }Cline MCP 或 CC Switch 的场景同理Base URL 填https://taotoken.net/apiKey 用控制台生成的Model ID 按实际填。三件套缺一个都会报鉴权或模型找不到的错。接入文档在这里https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。最后提醒一句~/.openclaw/openclaw.json、模型 auth profiles、credentials、session transcripts、managed skills、per-agent Codex runtime 状态这些都不应该提交进 Workspace 私有 repo。它们是运行状态和凭证不是项目资料。4. 验证请求逐项触发读写与越界确认边界生效配置写完不算完必须逐项验证。我习惯按“读命中、写命中、越界拦截、上下文命中”四步走每步都有明确的预期结果。第一步验证读白名单命中。在 Workspace 里放一个测试文件然后让 Agent 读它echo boundary-test ~/.openclaw/workspace/tmp/read-test.txt触发读取后预期是成功返回boundary-test。如果报ENOENT先检查readWhitelist的 glob 是否写成了/workspace/**而实际挂载点是别的路径。路径不匹配是读失败最常见的原因。第二步验证写白名单命中。让 Agent 往tmp写一个新文件ls -la ~/.openclaw/workspace/tmp/write-test.txt预期是文件出现且内容正确。如果 sandbox 开了只读挂载这一步会失败这是符合预期的——说明只读边界生效了。要写就得单独开可写目录而不是把整个 Workspace 改成rw。第三步验证越界拦截。让 Agent 尝试读 Workspace 外的路径比如/etc/hosts或~/Desktopcat /etc/hosts预期是被拒绝报错类似path outside workspace或absolute path not allowed。如果它成功读到了说明allowAbsolutePaths没生效或者 sandbox 没启用。这一步是整份清单里最重要的验证因为它直接对应“Workspace 不是硬沙箱”这个事实。第四步验证上下文命中。在AGENTS.md里写一条可识别的规则比如“所有部署命令前必须先输出 runbook 路径”然后触发一个部署相关请求看 Agent 是否遵守。如果没遵守按这个顺序查当前 profile 是什么、active workspace 是哪个、AGENTS.md是否在这个 Workspace 里、配置指向了哪个路径。多数“Agent 忘了规则”都是 Workspace 指错了而不是模型变笨。验证通过后你会得到一份清晰的边界地图哪些路径可读、哪些可写、哪些被拦、哪些上下文常驻。这份地图就是多项目并行的底气。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth边界配好后报错往往来自接入层或配置层。下面按真实报错逐条对照。401 Unauthorized最常见。先查 Key 是否复制完整有没有多余空格再查 Base URL 是不是写成了带 UTM 的完整链接。正确写法是https://taotoken.net/api不带查询串。如果 Key 刚生成确认控制台里该 Key 是启用状态。三件套里 Base URL、Key、Model ID 任何一个错都可能表现成 401 或模型找不到。local proxy failed通常出现在本地代理或网关配置环节。检查你的工具是否配置了额外的本地转发地址以及该地址是否可达。如果 Workspace 的 sandbox 把网络也隔离了代理请求可能被拦。先确认 sandbox 的网络策略再确认代理地址。reading choices这类报错多出现在响应解析阶段常见原因是返回体不是预期的 JSON 结构或者 Model ID 填错导致返回了错误页。先确认 Model ID 与你要用的模型一致再检查 Base URL 是否指向了正确的 API 路径。如果返回的是 HTML 而不是 JSON基本可以确定地址或鉴权有问题。OAuth相关报错出现在用 OAuth 方式接入的场景。检查 token 是否过期、回调地址是否匹配、profile 是否切换过。多个 Workspace 混用时OAuth 状态可能漂移因为同一时间只有一个 Workspace 活跃。统一到一个活跃 Workspace 后重新授权通常能解决。还有一个隐蔽的坑Workspace skill 命名冲突。Workspace 下的skills/是该 Workspace 最高优先级的 skill location名称冲突时会覆盖 project、personal、managed、bundled 等其他来源。如果你发现某个 skill 行为和预期不符先查 Workspace 里有没有同名 skill。命名冲突会悄悄改变 Agent 在这个 Workspace 里的行为。排查顺序建议固定下来先看 profile 和 active workspace再看三件套再看 sandbox 和工具策略最后看 skill 冲突。按这个顺序走大部分报错都能定位到具体一层。6. 把边界固化下来从一次性配置到长期习惯配置和验证做完最后一步是把它变成习惯而不是每次重来。我的做法是给每个项目建一个独立的 Workspace 目录但同一时间只激活一个避免状态漂移。项目级的AGENTS.md只放这个项目的操作原则TOOLS.md只放本机工具约定日志和长文档放memory/按日期分文件需要时再检索。目录白名单、上下文注入、执行边界这三样建议写成一个可复制的模板新项目直接套。模板里固定readWhitelist、writeWhitelist、allowAbsolutePaths: false和requireApproval列表只改路径和项目名。这样每次新项目上线边界都是默认收紧的而不是默认放开。长期编码或 Agent 任务用 Coding Plan 更省心https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 。需要临时验证模型行为去模型对话页面https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 。接入细节查文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。Key 管理在控制台https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。最后留一个实用技巧每次切换项目后先跑一遍第四节的四步验证尤其是越界拦截那一步。花两分钟确认边界生效比事后排查“为什么它改了我的桌面文件”划算得多。Workspace 负责让 Agent 知道自己在哪、按什么规则做事sandbox 和 approvals 负责限制它能碰什么。这两件事分清楚多项目并行就不会再打架。
返回列表