前言¶
DeepSeek Harness(DSH)的插件生态强调模块化与安全性。在处理跨目录项目时,开发者常面临两难:要么授予模型 danger-full-access 权限,风险较高;要么通过繁琐的手动授权操作,效率低下。dsh-codex-project 插件源自 Codex 的项目处理思想,它允许一个工作区挂载任意数量的共享子目录(支持跨盘符),并且全程保持 workspace-write 权限,无需升级到 danger-full-access。
核心功能¶
该插件主要包含以下能力:
- 共享子目录配置:支持跨盘符挂载,支持裸目录(非注册工作区)。
- GUI 交互:提供「编辑工作区」弹窗、「项目文件夹」侧边栏 Tab、「打开本地目录」入口。
- 运行时安全:多根沙箱 runner 与多根 fs fence,确保子目录读写在
workspace-write边界内。 - 上下文管理:会话上下文提醒,在模型推理时折叠列出共享目录清单。
- 管理与持久化:支持配置的 CRUD 操作,数据持久化存储。
- 交互工具:提供
add_dir模型工具与/adddir指令,支持用户与模型主动添加目录。
工作原理¶
插件通过 Cordis(DSH 的 IoC 框架)提供的钩子切入 DSH 运行循环,不侵入源码。
- HTTP 路由桥梁:启动时挂载
/codex-project/api路由,client 通过fetch调用,host 处理配置 CRUD 与文件读写。 - 上下文注入:监听
agent/pre-step事件,根据当前会话命中的配置生成<system-reminder>消息,告知模型可写的目录集合。 - 工具注册:注册
add_dir模型工具,模型可调用此工具请求添加目录,经用户确认后生效。 - 沙箱包装:wrap
sandbox.confine方法。无共享目录时透传;有多根目录时,使用runner.js创建受限令牌(Windows ACL + 空间级 SID),在令牌下执行子进程。 - FS 隔离:通过
ctx.fs提供者(bundle patch)替换核心 fs-sandbox,在进程内通过fs fence按可写根集合放行或拒绝操作。
使用方法¶
1. 通过 GUI 添加/移除目录¶
在侧边栏的「项目文件夹」Tab 或工作区菜单的「编辑工作区」弹窗中,可以查看当前主根与共享子目录列表。点击「添加」或「移除」按钮,选择目标目录即可完成配置。使用「设为主要」可以改变目录在上下文提醒中的排序和标注。
2. 通过命令行添加¶
在 composer 中输入 /adddir 并回车。系统会弹出原生目录选择框,选中目录后直接加入当前会话工作区的附加可写集合。
3. 通过模型工具添加¶
模型在推理过程中可以通过调用 add_dir 工具请求添加目录。此时会弹出确认框,用户批准后,目录被写入 SQLite 数据库并立即生效。
安全与注意事项¶
- 权限不升级:插件全程保持
workspace-write权限。它使用 Windows ACL 受限令牌和空间级 SID 来隔离不同根目录的权限,拒绝列表与空间级 SID 写授权确保不会越权访问其他目录。 - 失效根处理:配置中的共享子目录如果被物理删除(失效),可写集合会自动收窄(仅保留现存根)。插件不会自动清理失效记录,但会在上下文提醒中标注
(⚠ directory missing)。 - 根目录冲突:同一目录不能同时作为两条记录的
path。如果会话的 cwd 落在冲突目录,会命中配置文件中靠前的那条记录。 - 无只读共享:当前版本所有根都授予读写权限,不支持只读共享功能。
配置与数据¶
配置文件默认存储于 SQLite 数据库:~/.dsh-codex-project/dirs.db。环境变量 DSH_CODEX_PROJECT_CONFIG 可覆盖该路径。
数据表 workspaces 的逻辑模型如下:
{
"workspaces": {
"<workspaceId>": {
"path": "主根(该工作区自身的路径)",
"dirs": ["共享子目录1", "共享子目录2"],
"primary": "展示层主要根(可选)"
}
}
}
源码与文档¶
- GitHub 仓库:https://github.com/luoxunhao/dsh-codex-project
- 社区目录:https://www.skillhub.cn/plugins/luoxunhao/dsh-codex-project
- 许可证:MIT