dsh-role-gate
Per-session identity layer for DeepSeek Harness: tool/skill allowlists, multi-parent inheritance, dynamic switching, and a new-session picker. 适合需要为不同会话定制特定角色、限制工具权限和注入特定指令的用户。
インストール
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:lgqtime/dsh-role-gateドキュメント
README 全文を読む ↗使用
创建身份
在对话里说:
用 RoleGate 创建一个代码审查身份,只读代码、能跑测试,不要联网。
模型会先调用 role_gate_author action=catalog,再 action=propose 给出草稿,展示给你确认,最后 action=create confirmed=true 落盘。
也可以点输入框下方 身份 ▾ → 新建身份,在表单里直接勾选工具/技能、填写指令并保存。每行身份右侧的铅笔按钮可以编辑已有身份;勾选“草稿”只会加一个“待完善”标记,不影响切换和使用,取消草稿只是去掉标记。
需要 AI 帮你补全时,在编辑对话框点 让 AI 补全,当前设计会写入输入框,由模型查目录、指出缺口并给出补充建议。
身份定义示例:
{
"version": 1,
"identities": {
"code-review": {
"name": "code-review",
"title": "代码审查",
"description": "只读审查与最小修复",
"inherits": ["reader"],
"tools": ["read", "grep", "glob", "edit"],
"skills": ["tdd"],
"instructions": "以审查者口吻工作,先读再改,改完跑测试。",
"allowWebFallback": false,
"draft": false
}
}
}
切换
- UI:输入框下方的
身份:… ▾胶囊,展开后选择。 - 命令:
/identity code-review、/identity list、/identity none。 - 模型工具:
role_gate action=switch name=code-review,或action=clear。
切换后当前步不变,下一步生效。UI 会显示 下一步生效 标记。
新会话
点“新建会话”后,New Session 行右侧会出现 身份 · 新会话 ▾。选中身份会写入 state.json 的 pending;发送第一条消息创建会话时自动应用并清除。选择“未启用”会清除 pending。pending 只被下一个新会话消费一次;子代理和 fork 仍优先继承父会话身份。
能力语义
tools: ["*"]:该 agent 当前已知的全部工具(全局 + preset scoped);tools: []:除 3 个 RoleGate 元工具外无工具。skills: ["*"]:所有技能可加载;skills: []:任何技能加载都被拒绝。skills非空时自动保留skill工具,否则技能无法加载。allowWebFallback为 true 时自动加入配置的联网工具(默认web_search、web_fetch)。draft: true只是“待完善”标记,身份仍可应用和切换;它不改变工具/技能授权,也不影响默认身份继承。- 常驻元工具
role_gate、role_gate_find_local、role_gate_author永远可见,保证任何身份都能切回none。 - preset scoped 工具也在
allow名单里显式列出,因此会被同时从模型工具面过滤并在执行层拒绝。
指令优先级
身份系统提示会写明:
- 优先使用当前身份的工具/技能;
- 不足时调用
role_gate_find_local搜索本地目录; - 只有本地没有合适能力且联网工具可见时,才联网;
- 身份指令不覆盖用户当前轮的直接请求。
数据与配置
数据目录:$DSH_HOME/role-gate/(未设置 DSH_HOME 时为 ~/.dsh)。
identities.json:身份库。state.json:每个会话当前选中的身份,以及新会话的pending选择。identities.corrupt-.json/state.corrupt-.json:损坏文件的隔离副本。
cordis.patch.yml(首次安装)或 profile 的 cordis.yml 中 role-gate 行可配置:
| 字段 | 默认 | 说明 |
|---|---|---|
defaultIdentity | null | 新会话默认身份 |
webTools | ["web_search","web_fetch"] | 联网兜底工具名 |
allowWebFallbackByDefault | true | 身份未显式设置时的默认 |
enforceSkills | true | 是否启用技能门禁 |
sectionOrder | 450 | 身份系统提示段顺序 |
maxInstructionsChars | 16000 | 单身份指令上限 |
maxResolvedInstructionsChars | 32000 | 继承拼接后上限 |
maxStateEntries | 500 | 会话状态记录上限 |