本文档说明工作目录策略、命令入口和安全约束。
- 让用户在聊天侧安全地选择工作目录,不破坏宿主机边界
- 保持各平台行为一致:目录可配置、会话可继承、权限可追踪
- 避免"目录切换后任务卡住"的实例错位问题
创建或切换会话时,目录来源按以下优先级决策:
1. 显式输入目录(命令参数 / 卡片输入)
↓
2. 项目别名(PROJECT_ALIASES)
↓
3. 群默认目录(会话绑定存储)
↓
4. 全局默认目录(DEFAULT_WORK_DIRECTORY)
↓
5. OpenCode 服务端默认目录
实现位置:src/utils/directory-policy.ts
目录决策
│
▼
1. 路径格式和长度检查
│
▼
2. 危险路径拦截
│
▼
3. 白名单检查(ALLOWED_DIRECTORIES)
│
▼
4. 存在性与可访问性检查
│
▼
5. realpath 解析与二次白名单检查
│
▼
6. Git 根目录归一化与复检
│
▼
返回结果
- 校验失败时,用户看到通用提示
- 完整路径仅记录在服务端日志
- 未配置
ALLOWED_DIRECTORIES时阻止自定义路径
飞书私聊 create_chat 面板中的"工作项目(可选)"下拉选项综合:
DEFAULT_WORK_DIRECTORYALLOWED_DIRECTORIES- 已存在会话目录(历史会话与绑定会话)
- 项目别名(
PROJECT_ALIASES)
即使没有历史项目,下拉也会保留"跟随默认项目"选项。
| 命令 | 说明 |
|---|---|
/project list |
列出可用项目 |
/project default |
查看当前群默认 |
/project default set <路径|别名> |
设置群默认 |
/project default clear |
清除群默认 |
/session new <路径|别名> |
指定目录创建会话 |
/create_chat |
卡片方式选择会话和目录 |
| 命令 | 说明 |
|---|---|
///workdir |
查看当前工作目录 |
///workdir <路径|别名> |
设置工作目录 |
///workdir clear |
清除工作目录 |
///new [名称] [--dir 路径|别名] |
指定目录创建会话 |
///new-channel [名称] [--dir 路径|别名] |
创建频道并绑定 |
///create_chat |
下拉会话控制 |
ALLOWED_DIRECTORIES=/path/to/projects,/path/to/repos
DEFAULT_WORK_DIRECTORY=/path/to/projects/default
PROJECT_ALIASES={"bridge":"/path/to/opencode-bridge"}
GIT_ROOT_NORMALIZATION=true- 未配置
ALLOWED_DIRECTORIES时,用户自定义目录能力受限 PROJECT_ALIASES建议只放常用工程,避免下拉选项过多- 路径在归一化后会再次校验白名单
权限回传包含目录候选:
- 优先:当前会话目录(
resolvedDirectory/defaultDirectory) - 回退:已知目录列表
- 最终:默认目录实例
这能减少目录切换后的权限确认假死。
- 检查是否在
ALLOWED_DIRECTORIES范围内 - 检查 realpath 后是否仍在白名单内(符号链接场景常见)
- 目录可能被白名单过滤
- 不存在或无读取权限的目录会被自动剔除
- 检查日志中权限回传是否命中目录候选
- 确认 OpenCode 实例和当前会话目录一致
- 目录相关改动必须补测试(目录策略 + 面板选项 + 权限回传)
- 发布前至少执行
npm run build和npm test - 目录策略变更要同步更新
.env.example与 README 环境变量章节