dsh-write-protect
DSH 沙箱扩展:保护指定的工作区子路径免受写入,并支持声明额外可写根。
AI 分析
核心用途是为 DSH 沙箱环境提供更细粒度的文件读写保护(如保护 .git 目录)。适合在本地工作区运行 AI、对代码库安全有严格要求的用户。
安装
$
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:azazo1/dsh-write-protect说明文档
阅读完整 README ↗配置
保护路径的默认值统一定义在 src/constants.ts 的 DEFAULT_READ_ONLY_PATHS, 额外可写根默认空列表 (DEFAULT_WRITABLE_PATHS); patch 的 policy 行与设置页部署 base 都由它们兜底. 需要部署级覆盖时在 patch 行显式给出数组:
- id: dsh-write-protect-policy
name: dsh-write-protect
config:
mode: !!js process.env.DSH_PERMISSION_MODE ?? 'workspace-write'
workspaceRoot: !!js process.cwd()
# 部署级覆盖示例.
# readOnlyPaths: ['.git', '//etc/pki']
# writablePaths: ['../shared-scratch', '//tmp/dsh-extra']
readOnlyPaths 的每一项是一行 gitignore 语义的模式, 数组逐行合并为生效文本:
- 不含
/的条目 (如.git,vendor) 在工作区内任意层级匹配, 覆盖嵌套仓库等场景. - 以
/开头或含中间/的条目锚定到工作区根 (如/.git,dist/a.txt); 字面条目即使尚不存在也保留保护, 例如git init之前的/.git. //开头的条目是文件系统绝对路径 (如//etc/pki), 这是本插件额外支持的写法, gitignore 没有这种形态.- 尾部
/表示只匹配目录 (如build/). - 通配:
*匹配单段内任意字符,?匹配单字符,[...]字符类 (含[:alpha:]等 POSIX 类),**独立成段时递归 (如a/**/b);\转义下一字符 (\#,\!, 尾部空格用\保留). !开头剔除匹配项, 按 gitignore 的 last-match-wins 顺序解释; 受保护目录内部无法通过取反重新放行后代.- 通配条目只匹配展开时刻已存在的路径; 解析时会解开符号链接并去重.
- 置为空列表
[]即停用保护 (插件仍在, 只是不再多挡任何路径).
writablePaths 的每一项是一行字面路径, 不是 gitignore glob:
- 行首
~或~/...展开为当前用户家目录;~other不支持. $NAME与${NAME}展开为环境变量; 未设置或空值的变量整行丢弃并告警.\$保留字面$.- 宿主绝对路径 (
/tmp/extra) 或//前缀 (//tmp/extra) 按文件系统解析. - 其余相对当前会话工作区, 含
..(如../sibling-project). - 工作区内的路径本来就可写, 展开时忽略并告警; 文件系统根 (
/或盘符根) 拒绝, 避免把只读宿主根整棵翻成可写. - 不支持通配与
!取反. 不存在的路径仍保留词法形态: write / edit 与 Seatbelt 可按前缀放行, bwrap / Landlock 在叠加时跳过并告警. - 只在
workspace-write下并进 allow-list, 不打穿read-only. 保护路径优先: 额外根内部仍可被保护. - 置为空列表即不额外放行.