cc-safety-net gui 会打开本地仪表板。你可以查看本机判定,了解阻止原因,并直接修改策略,无需手动编辑 JSON。
本页说明你可以在仪表板中做什么,以及哪些操作具有破坏性。它不重述底层格式:policy.json schema 见策略,rulebook 编写见自定义规则,审计记录 schema 见审计日志。
启动仪表板
--no-open。这适用于 SSH、容器,或需要在指定浏览器配置文件中打开 URL 的情况:
--no-open 是除 -h, --help 之外的唯一标志。其他任何参数都会被拒绝,输出 Usage: cc-safety-net gui [--no-open] 并返回非零退出码。
浏览器启动失败时,命令会打印底层错误和 Open this URL manually: <url>,然后继续提供服务。服务器在前台运行,直到你用 Ctrl-C 停止。
本地环回范围
仪表板不是托管服务。它的服务器只监听本地环回接口:- 服务器只绑定
127.0.0.1,端口为临时端口。局域网上的任何设备都无法访问它。 - 每次启动都会生成一个新的随机令牌并嵌入 URL。每个请求都必须携带该令牌,改变状态的请求还必须把它作为请求标头发送。缺少令牌的请求会被拒绝,返回
403。 - 超过 1 MiB 的 JSON 请求体在解析前就会被拒绝,返回
413和错误Request body is too large;否则整个请求体都会驻留在内存中。 - 响应一律带
cache-control: no-store返回。
cc-safety-net gui 的智能体同样能访问那些由令牌把守的端点,其中包括下文的项目策略应用。令牌挡得住另一个页面,也挡得住没有看到这一行的进程,却挡不住启动者本人。直接路径仍然是封死的:智能体用命令编辑 policy.json,或者运行 cc-safety-net policy apply,依旧会被拒绝。
页面读取的数据全部来自本地策略文件和审计日志,不会为此发出出站请求。只有概览中的更新检查和 GitHub 加星操作例外,而且必须由你主动启用。
由于令牌按每次启动生成,从上一次会话收藏的 URL 不再有效。重新运行
cc-safety-net gui 获取新的 URL。六个视图
侧边栏有六个视图,采用 hash 路由,因此可以在同一会话内链接或收藏其中某个视图:
无法识别的 hash 会回退到概览。集成和规则视图在首次访问时才加载数据。
概览
概览汇总的是一个保留窗口内的数据,而不是历史总量。该窗口为最近 7 天;保留期短于 7 天时,则为整个保留窗口。标题会以Last N day(s) 说明它实际使用的窗口。
指标卡。 已阻止和已分析两个计数器各有一张按天绘制的迷你图,时间从旧到新。每张图按自身最大值缩放,因此两张图的柱高不能直接比较。请比较数字。
保护状态。 卡片显示你的安全级别;override 偏离预设时会追加 · Customized;同时报告有多少条规则生效、机密保护是否开启。此卡只反映已保存的状态:策略视图中暂存的未保存开关在保存前不会影响它。破坏性命令保护或机密保护关闭时,或因配置中某项无法加载而正在执行 fallback 配置时,会显示横幅。
健康状态条。 报告 hook 是否在检测到的智能体中处于活动状态,或者检测到了智能体但 hook 未激活,又或者根本没有检测到智能体 hook。它还会提示可用的更新。有需要处理的问题时,它会链接到集成视图。
阻止次数最多的命令和规则。 两个面板各显示前五项,统计窗口与指标卡相同。选择某条命令会跳到活动视图,并应用一个可移除的精确命令签名过滤条件,只显示阻止记录。选择某条规则则按规则命名空间跳转:custom.* rule ID 进入规则视图,内置 rule ID 进入活动视图,并把该 rule ID 预填进搜索框。
防护错误。 窗口内如果有拒绝来自评估失败而非策略,就会出现一个按钮,文案为 。点击后会打开活动视图,并过滤为错误判定。这些拒绝属于 fail-closed:CC Safety Net 无法完成分析,因此拒绝了命令。如果反复出现,请参阅故障排除。
活动
活动视图按时间倒序列出本地审计日志中的命令。命令在写入时就已脱敏,在任何内容进入日志之前完成;脱敏只覆盖已识别的凭证形式,因此条目中仍可能包含路径、主机名和名称。分享此视图中的内容前,请先参阅审计日志,了解记录 schema 和准确的脱敏范围。时间窗口由保留期决定
时间窗口选择器不是固定选项集合。它根据配置的审计日志保留期计算:候选窗口为 7、30、90、180 和 365 天,只保留严格短于保留期的值;保留期本身始终作为最宽的选项追加。这样,任何选项都不会承诺显示已被保留期清理删除的历史记录,同时完整日志始终可访问。
窗口按完整的本地日历日计算,即今天加之前的若干天,因此概览中按天分桶的迷你图之和与总数完全一致。请求超过保留期的窗口会被拒绝;缩短保留期后,当前选择会自动收窄。保留期本身如何配置和执行,见审计日志。
过滤器
- 窗口:上文所述的、由保留期派生的选择器。
- 判定 chip:
All、Blocked和Allowed始终存在;Errors仅在窗口内含防护错误时出现;Likely false positive仅在启发式找到候选项时出现。该启发式会标记带失败阶段的拒绝,以及在同一会话中被拒绝两次及以上的命令签名。 - 智能体 chip:只有窗口内出现至少两个不同的已知智能体时才显示,并提供
All agentschip 用于清除过滤。 - 命令 pill:精确匹配命令签名、且只显示阻止记录的过滤条件;从概览点击跳转时添加,可在此处移除。
- 搜索:顶栏输入框(
Filter by rule or command)以不区分大小写的子串匹配 rule ID 和命令文本。
刷新
刷新按钮会同时重新加载概览和活动,避免指标卡与活动列表不一致。即使本地刷新很快,按钮也会短暂旋转,以确认操作已经执行。渲染条目与计数
活动列表最多呈现 500 个条目。上限按判定类别分配:每类保证获得一半容量,并把未使用的容量借给另一类。因此,大量拒绝不会让允许记录完全消失。 计数不受 500 条显示上限影响。Chip、指标卡和排名面板使用服务器端完整窗口聚合,与列表实际呈现的内容无关。页脚用Showing X of Y entries from the last N day(s) 同时说明显示数和总数;发生截断时再添加 (capped at 500, newest of each decision)。
只有一种情况会使计数本身不完整:某些审计日志来源无法读取时,页脚会追加 N audit log source(s) could not be read, so this list is incomplete.。聚合也会缺少这些条目,因此在来源恢复可读前,列表和计数都只能视为下限,不能视为总数。
浏览列表并据此下结论之前,请先读页脚。
Showing 500 of 4,120 表示列表只是最近的一个切片,而每个 chip 和指标卡仍反映全部 4,120 个条目。每个条目的操作
每个条目都显示判定 badge(Blocked、Allowed 或 Error)、智能体 badge、rule ID chip、相对时间戳,以及把原始日志条目复制为 JSON 的按钮。过长的命令会被折叠,并提供 Show more 开关。复制出来的是原始审计记录,字段说明见审计日志。
被拒绝的条目提供报告误报,点击会打开一个对话框,准备一份预填好的公开 GitHub issue。继续之前,命令和日志条目都可以编辑;项目路径会被替换为 <project>,主目录被替换为 ~;在你自己到 GitHub 上提交之前,不会提交任何内容。
被允许的条目提供今后阻止此命令操作。它会把命令预填到规则视图的 prompt composer 中,但不会创建规则。参见下文规则。
策略
策略视图用于选择 CC Safety Net 应阻止的内容。此视图中的所有内容都是内置保护:安全预设、破坏性命令规则,以及 CC Safety Net 自带的机密保护模式。自定义 rulebook 属于独立机制,不在此处编辑。 此视图写入文件的完整字段约定见策略。已保存与未保存
编辑会累积到草稿中,只有保存时才生效。- 草稿与磁盘内容不一致时,策略视图会出现保存栏,带有丢弃和保存两个按钮。
- 其他每个视图的顶栏都会出现
Unsaved policy changes · Reviewchip,点击即跳转到这里。 - 在同一浏览器会话内重新加载页面,草稿依然保留;保存、丢弃、修复或重置都会清除它。
- 带着未保存的更改离开页面时,会先弹出提示。
Repair policy before saving changes.,以免默认值覆盖文件。请先修复,再保存。修复后,表单会重新加载保留下来的设置。
起草项目策略
视图顶部的Draft project policy 会把整个策略视图切换为项目文件的草稿。草稿栏列出写入路径,并说明这个文件遵循的规则:Only the fields you mark are written here; everything else keeps inheriting from each member's own policy. Exit draft 返回编辑你自己的策略。在提供原生目录选择器的环境中会出现 Change…,确认后丢弃当前草稿并改用另一个目录。在你改动之前,目标就是仪表板的启动目录。
标记与继承。 每个控件都会带上一个 chip,说明它显示的值来自哪里。Inherited 表示该字段不写入项目文件,每位成员继续使用自己的值。Set by project 表示草稿会写入该字段,点击这个 chip 即可退回继承。编辑控件就会标记它对应的字段。被标记的路径列表只显示项目自己的条目,因此刚标记时是空的,不会把你的个人路径发布到仓库里。
复核并应用。 Save 变成 Review & apply。点击后向服务器请求差异,并打开 Apply this project policy? 对话框,其中给出写入路径,以及一张按 Setting / Now / After 排列的生效策略前后对照表;某一侧没有该字段时显示 (unset)。没有差异时,表格位置显示 No change to the effective policy.。表格下方逐条列出草稿相对用户策略削弱的字段,措辞与策略中记载的一致;磁盘上已有的文件无法读取时,还会加上 The existing project policy file is invalid and will be replaced.。默认获得焦点的是 Cancel。
差异加载期间修改表单,应用会被拒绝并提示 Error: the draft changed while the review was loading. Review it again.,需要重新复核一次。如果另一个标签页改动了项目目录,草稿会按新目标重新加载,并要求你在应用前再复核一遍。
草稿无法启动的情况。 用户策略有错误时,运行时会退回到保护性默认值;以这些值为基础起草,会让默认值看起来像团队继承的基线。因此仪表板拒绝起草,并连同诊断信息提示 Error: repair your user policy before drafting a project policy.。项目文件存在但读不出来则是另一回事:草稿从空白开始,并把该文件的诊断信息显示在表单上方。
与 CLI 相同的保证。 这份草稿就是表单形式的 cc-safety-net policy check 和 cc-safety-net policy apply。它写入同样稀疏的文件,针对同一份运行时用户基线计算差异,在你确认之前不写入任何内容。文件约定和两个范围的合并规则见策略。
有一处差别值得留意。智能体执行的 cc-safety-net policy apply 会被防护以 intent hard_stop 拒绝,因为改写 CC Safety Net 所执行的配置必须由你本人来做。仪表板的应用同样是人的操作:你在页面上亲手点击,而这个页面只有持有会话令牌的人才能打开。但正如本地环回范围所述,启动仪表板的智能体也持有这个令牌。
测试命令
把 shell 命令粘贴到测试命令中,就能看到它是否会被阻止。测试基于你当前未保存的编辑进行评估,因此可以先验证改动,再决定是否采用。 在项目草稿中,测试评估的是运行时真正会加载的内容,也就是继承的基线叠加草稿标记的字段。路径列表按你自己的条目与草稿条目的并集处理,因为加载器也是这样合并的。此视图的保护状态和每条规则的状态行使用同一份评估结果,所以被标记的路径列表在界面上显示为空,并不会把你自己的路径说成没有保护。 测试同样会执行从磁盘加载的自定义 rulebook 规则,尽管 rulebook 无法在仪表板中编辑。把它当作真实判定的预览,而不只是内置层的预览。要在终端里做同样的分析,参见explain。
安全预设
此视图提供三个安全预设,界面标签为 Standard、Strict 和 Paranoid。它们是工作区后续自定义所继承的默认值,严格程度逐级提高。各预设和能力的准确变化以模式为准。 此处会列出提高保护强度的环境变量,用于解释界面级别与实际行为的差异。默认折叠的 Advanced overrides 区域显示预设解析出的各项能力,包括 fail closed、paranoidrm -rf 检查和 paranoid 解释器。你可以单独调整某项能力,不必更改预设。工作流例外与安全级别分开配置。
破坏性命令保护
这里有一个 master switch,其下的规则分为四个可折叠 tier:
所有 tier 默认折叠。在策略视图中搜索时,含匹配项的 tier 会自动展开。始终执行 tier 没有开关,也没有单条规则的复选框。它的标题把规则数显示为
N protections,每条规则都标记为 Always enforced,并带一个 ? 示例弹窗。
三个可配置 tier 会在标题中显示 N on · N off 计数,旁边是标记为 All <tier> protections 的 tier 开关。只要该 tier 中至少有一条规则处于开启状态,开关就是选中的。master switch 关闭时,tier 开关会被禁用。拨动它会批量写入与单条复选框相同的 per-rule override。最终与继承值一致的规则不会保留 override,因此没有单独保存的分组设置。
master switch 开启时,面板摘要显示 N active, N disabled。关闭后,摘要改为 Configurable protection disabled. Catastrophic protections remain active; saved rule settings and allow paths are preserved.。始终执行 tier 仍会继续阻止。
每张可配置规则卡片都有 ? 弹窗,其中给出该规则阻止的具体命令示例。状态行说明当前值的来源。例如, 表示 master switch 优先于你的 override。
切换规则会存储显式 on 或 off override。把规则恢复为继承值时会删除 override,而不是存储冗余值。每条规则还提供 Use inherited setting 直接完成此操作。面板标题中的 Restore defaults 会一次清除所有 override。
允许路径也在此面板中。指向列表内路径的递归删除不会被阻止,这正是 /tmp 可用的原因。条目必须是绝对路径或以 ~/ 开头的目录,主目录会被拒绝。完整的校验表见允许路径。允许路径放宽和保留的规则见允许的命令。
机密保护
此区域包含 master switch 和按类别分组的 per-pattern 复选框,范围从默认敏感路径(主目录路径、凭证 basename、扩展名和变体)到 Coding CLI credential 和 Coding CLI config 位置。每个组标题是可折叠按钮,显示N on · N off;旁边的组开关标记为 All <category> protections。它与破坏性规则 tier 开关行为相同:组内任一规则开启时即为选中,master switch 关闭时禁用,并批量写入 per-rule override。组默认折叠,在策略搜索期间会自动展开。
保护具体文件路径的规则带有 ? 按钮,点击可打开受保护的路径弹窗,其中准确列出该规则覆盖了哪些路径。
并非所有规则都默认开启。Coding CLI config 规则出厂时为关闭。settings 和 MCP 配置文件内嵌了凭证,但智能体也会在日常工作中编辑它们,因此需要逐条主动开启。只有当复选框状态偏离规则默认值时,系统才会存储 override。勾选一条默认关闭的规则会写入 on override,取消勾选则删除该 override。对默认开启的规则,取消勾选会写入 off,重新勾选则删除 override。
master switch 开启时,面板摘要显示 N active, N disabled。关闭时显示 Protection disabled. Saved rule settings and deny paths are preserved. 已保存的机密允许路径同样保留在草稿中。
拒绝路径也在此面板中。机密保护开启时,配置的路径及其下的所有内容都会被阻止。拒绝路径依赖 master switch。关闭机密保护后,系统不再执行这些拒绝路径。可接受的条目形式见拒绝路径。
允许路径同样在此面板中。可以让某个具体文件或目录树免于内置的模式规则,但拒绝路径和 Coding CLI 保护仍然适用。每个新增条目在进入草稿前都会经过仪表板校验:glob 模式、覆盖主目录的路径以及防护自身的配置都会被拒绝。完整的优先级和校验规则见机密允许路径。
策略 JSON
Policy JSON 面板位于此视图底部,是带复制按钮的只读镜像,不是第二个编辑器。面板副标题说明你看到的是什么。要求确认的操作
单条规则的开关、预设变更以及添加或删除路径都会暂存在草稿中,由保存统一提交,因此不会单独确认。仪表板只对降低保护强度或丢弃配置的操作弹出模态确认:
在上述每个对话框中,取消都是默认焦点。
修复
磁盘上的策略文件存在错误时,此视图会显示策略修复可用横幅和一个Repair 按钮。修复会写入规范化的 JSON,保留所有有效设置并丢弃无效字段。如果 JSON 完全无法解析,则改为恢复默认值。加载的策略没有错误时,该按钮不起作用。
重置
重置有意不放在此视图,而是位于设置视图的危险区域中。规则
规则视图显示你编写的自定义 rulebook,与策略视图中的内置保护不同。rulebook 的格式、范围、override 和校验方式见自定义规则,本页不再重述。Rulebook 面板(只读)
每张 rulebook 卡片显示名称、版本 badge、与名称不同时显示的 source spec、范围(All projects 或 This project)以及规则数量。
列表显示 override 生效后实际执行的规则。被 override 禁用的规则仍属于原 rulebook,也仍在文件清单中,但不会显示在列表里。因此,这里展示的是生效后的 rulebook,不是原始文件内容。刷新按钮会重新读取磁盘。
没有配置任何 rulebook 时,面板会指引你运行 cc-safety-net rule init。若已有 rulebook 但全部被丢弃,面板会说明这一点,并把你引向诊断面板。
诊断
没有问题时,诊断面板会隐藏。面板出现时,其中的错误表示某个 rulebook 已被丢弃,其规则未执行。你编写的规则未触发时,应先检查这里。Prompt composer(仅复制)
Composer 为编码智能体构建 prompt。唯一操作是复制 prompt。此视图中没有创建、保存或写入控件,服务器也没有写入 rulebook 的路由。 输入:- 范围:
Project或All projects。 - 项目路径:仅在项目范围下显示,默认预填仪表板的启动目录。在提供原生目录选择器的环境中,该字段为只读,并配有
Choose…按钮;运行时没有可用选择器时,该字段改为可编辑。 - 请求:描述你想要的规则。规则匹配的是命令、它的子命令路径和精确参数,而不是文件路径或模式。
- 示例:一键填入的起始文案,分别用于建议规则、阻止命令和校验现有规则。
cc-safety-net skill;该 skill 不可用时,先运行 npx -y cc-safety-net rule doc,并以其输出作为 schema、路径和校验的准绳。prompt 包含范围、项目路径和现有 rulebook 名称,帮助智能体选择未占用的名称。它只包含 rulebook 名称。规则名称、被阻止的参数、原因和版本不会随 prompt 离开你的机器。
规则尚未加载、请求为空,或选择了项目范围却没有项目路径时,复制会被拒绝,并给出具体的提示信息。
集成
集成视图为本机上的每个编码智能体安装或删除 CC Safety Net hook。智能体面板列出检测到的 CLI 及其 hook 状态。每个智能体的连接方式见集成架构,GUI 外的等效步骤见安装。Not inspected 附带一条 tooltip 说明这一点:This runtime's state file could not be read, so its status is unknown. CLI 本身已找到,因此仍会提供安装操作。
检测结果决定可用操作。未检测到 CLI 时不会显示按钮,因为没有可安装 hook 的目标。安装和卸载按顺序执行,不会交错。请求执行期间,按钮会被禁用。失败时会报告 Install failed 或 Uninstall failed,不会静默回退。
刷新按钮会重新检测每个智能体,适合在安装 CLI 或手动编辑智能体配置后使用。下方的系统面板报告 CC Safety Net 版本、Node.js 版本和本机检测到的平台。
设置
设置视图涵盖外观、文件位置和维护操作。 外观。 主题控件按Auto → Light → Dark 循环切换。该偏好存储在当前浏览器中,不写入策略。
文件。 只读信息行,显示 CC Safety Net 在本机上的读写位置:策略文件和审计日志目录。有项目策略生效时,两行之间会出现 Project policy 行;信息行下方还有一条以 Merged on top of this file: 开头的提示,列出这个文件改了哪些设置。
审计日志保留期。 可接受的天数、记录内容和清理方式见审计日志。与策略视图不同,保留期一改动就立即保存,没有保存栏。策略视图存在未保存的更改时,无法保存保留期。你需要先保存或丢弃这些更改。保留期只属于用户范围,因此项目草稿打开期间同样无法保存。磁盘上的策略有错误时,策略保存按钮不可用,但保留期控件仍能保存。此时表单中只有默认值,修改保留期会写入一份除新保留期外全部使用默认值的文档。因此,修改保留期前请先修复策略。
版本。 一行只读信息,显示当前运行的 CC Safety Net 版本。
危险区域。 只有重置策略这一项操作。它会在配置的路径上恢复默认策略 JSON。