dsh-extra-paths
Verifieddsh-extra-paths · v0.1.1 · MIT · Web UI
配置一组额外可写根:fs 工具与受限 shell 首次尝试即可写、无需审批,带 Web 设置页与按目录结构锚定的路径模式。 · DSH plugin: configured extra writable roots for the fs tools and the sandboxed shell, with a Web settings page and structure-anchored path patterns.
Install
dsh plugin add dsh-extra-paths Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Creators
Readme
dsh-extra-paths
English | 中文
让 DSH 对一组配置的外部路径首次尝试即可写、无需审批:既覆盖 write/edit 工具,也覆盖 bash 子进程。
插件以服务包装实现,不改 DSH 核心代码,并提供 Web 设置页与「当前工作区解析出的生效根」预览。
安装
需要 DSH 0.1.5 / 0.2.0 / 0.2.1(不在范围内会被安装闸门拒绝)。
dsh plugin --profile <name> add dsh-extra-paths # <name>=你的 profile 名
想从源码安装(开发时):
pnpm install && pnpm build
dsh plugin --profile <name> add /path/to/dsh-extra-paths # 路径=本仓库的绝对路径
装好后打开 设置 → 插件 里的「Extra paths」卡片,或设置左栏的「额外可写路径」。
配置
写进设置文档 ~/.dsh/settings.yaml 的 extra-paths 段,或直接用设置页(保存即生效,无需重启)。
下面的 <工作根> 是占位符,指你放项目的那个上层目录(绝对路径,或 ~/ 开头的路径):
extra-paths:
paths:
- <工作根>/notes/home # 用默认 scope/surfaces
- path: ../../notes/home # 相对路径按「会话工作区」解析
scope: always-write
- path: <工作根>/some-repo
scope: write
surfaces: [fs] # 只允许 write/edit 工具写
| scope | 会话 read-only | 会话 workspace-write |
|---|---|---|
write(默认) |
拒绝 | 可写 |
always-write |
可写 | 可写 |
surfaces:fs = write/edit/str-replace 工具;shell = bash 子进程。读与执行本来就不受沙箱限制。
相对路径怎么写
相对路径按各会话自己的工作区解析(设置页里可以改「基准工作区」来预览):
| 写法 | 解析成 | 说明 |
|---|---|---|
.. |
<工作根> |
工作区的上一层,该目录及其所有兄弟目录都可写 |
../某仓库 |
<工作根>/某仓库 |
只放行那一个兄弟仓库(比 .. 精确,推荐) |
../../notes/home |
<工作根>/notes/home |
往上几层再进别的树 |
~/notes/home |
家目录下 | 与工作区无关;~user 不展开(与宿主一致) |
模式:按目录结构锚定(不用写死路径)
path 里可以用通配符描述一组目录,于是"路径里存在某个目录"可以变成一个条件:
| 写法 | 命中(授予的根) |
|---|---|
<工作根>/**/.worktrees/.. |
每个含 .worktrees 的仓库根(.worktrees 的上级) |
<工作根>/**/.worktrees/* |
每个具体 worktree(不碰 .git 与主检出) |
<工作根>/<某仓库>/.worktrees/* |
某一个仓库下所有 worktree(零遍历开销,最推荐) |
<工作根>/*/notes |
每个仓库/项目下的 notes 目录 |
语法:* = 恰好一层、** = 最多 3 层(只匹配真实存在的目录,所以"必须存在 .worktrees"是自然结果);
结尾的 .. 在命中之后再上移(因此 …/.worktrees/.. 就是".worktrees 的上级",不会被词法折叠吃掉)。
安全边界(都是硬约束,不是建议):
- 通配符前必须有字面量锚点,且锚点至少两层、必须是绝对路径或
~/开头 ——/**、~/**、/srv/**一律拒绝 - 遍历不进入
node_modules、.git,**也不进入隐藏目录(.worktrees本身是字面量,仍在当层匹配) - 有界:
**最多 3 层、目录数 > 4096 或命中 > 256 时整个模式不生效(fail closed,绝不给"部分命中"这种不可预期的授权);触顶原因会写进告警 - 展开结果缓存 30 秒,因此新建的 worktree 最迟 30 秒被纳入
设置页每行会实时显示解析到的绝对路径(符号链接以宿主的「解析预览」为准),模式行显示命中条数 [生效 ×N]
并列出每个具体根;0 命中或被拦截都会明确说明,所以不必"先保存再看解析对不对"。
已知边界
- 逐路径的"完全不受限"做不到:bash 沙箱是整次调用粒度。
- 相对路径按会话工作区解析,因此同一份配置在不同工作区指向不同目录——设置页的预览会显示实际解析结果。
- Windows 的 shell 侧不放行;
always-write会削弱read-only急停按钮对该路径的作用。 - 写在工作区外的文件不会出现在
deliverables的工作区变更卡片里。