Project Sentinel:Claude Code 上下文交接与运行控制
为长时间运行的 Claude Code 任务提供状态带、上下文交接、提示缓存追踪和权限规则。
权限
- 读取文件可以读取你电脑上的文件并列出目录($.fs.read / list / stat / exists)。
- 执行命令可以在你的电脑上运行 shell 程序($.process.run / spawn)。具体运行哪些程序请查看源码。
- 调用模型(消耗你的额度)可以自行向 Claude 发送请求,这些请求计入你套餐的用量($.model.* / $.agent.spawn)。
- 拦截工具调用能看到 Claude 发起的每一次工具调用(tool.call / tool.check),并可以阻止或修改它。
- 读取你的提示词可以看到你输入的内容和对话记录(prompt.* / session.append / session.messages)。
- 修改界面在 Claude Code 界面中绘制内容:横条、面板、状态文字、弹出通知(ui.render / $.ui.*)。
- 添加命令/工具注册新的斜杠命令或工具,供你或 Claude 调用($.command.register / $.tool.register)。
- 存储数据在插件的私有存储中跨会话保存数据($.store.*)。
- 实测版本
- v2.1.296
- 最近实测
- 需要
- Claude Code ≥ 2.1.287
- 显示位置
- 输入框上方、面板、加载动画、状态栏、弹出通知
这个插件能做什么?
Project Sentinel 是一款为长时间 Claude Code 运行打造的社区插件,作者是 Project Sentinel 贡献者(Arjun0014)。它最知名的功能是 Claude Code 上下文交接:当上下文窗口快要占满时,Context Autopilot 会让 Claude 完成当前这一单元的工作并写下一个笔记文件,然后清空上下文,开启一个读取这些笔记的全新上下文。这个插件在 1.4.0 版本之前叫作 Control Room,所以面板和状态带上仍然带着这个名字。
围绕这一点,它还加入了大量功能。输入框上方的状态带显示上下文用量、提示缓存和本次运行的花费。Cache Guardian 追踪提示缓存还能保持多久的预热状态,并在一次会重新发送 100k 或更多 token 的模型切换之前先询问你。权限类别让你把安装软件包、推送、部署等类似操作设置为询问或拒绝。其他部分包括 Mission Queue 和 Decision Inbox、子代理数量限制、模型路由、机器负载调节器,以及一个可选的像素陪伴角色。作者的 README 完整列出了这些功能;本页介绍的是我们在代码中核实过的内容。
演示
录屏中,我们在小型演示项目里启动加载了该插件的 Claude Code,并让 Claude 读取 README.md,用一句话描述这个项目。提交提示之前,输入框上方的状态带显示 "Ready",带有 Control Room 徽标和 RUN $0.00。这一轮运行时,它变为 "Thinking",随后显示上下文仪表填充到 4%。这一轮结束时,它显示 "Read 1 file"、上下文横条、CACHE 1h left,以及不到一美分的运行花费。
安装
使用安装区块中的任意一种方式;它们都直接从作者自己名为 control-room 的插件市场安装。状态带会在下一次会话开始时出现。运行 /control-room 或 /cr 打开面板。
$ install project-sentinel
需要 Claude Code ≥ 2.1.287
从作者自己的 marketplace 安装: Arjun0014/project-sentinel
1.在 Claude Code 中一行安装
/plugin install project-sentinel --marketplace Arjun0014/project-sentinel粘贴到正在运行的会话中(v2.1.275+)。Claude Code 会先询问是否添加该插件市场。
2.从终端安装
claude plugin marketplace add Arjun0014/project-sentinel claude plugin install project-sentinel@control-room然后在所有已打开的会话中运行 /reload-plugins。
3.免安装试用
git clone https://github.com/Arjun0014/project-sentinel claude --plugin-dir ./project-sentinel/plugins/project-sentinel仅在当前会话中加载该插件,不会写入你的设置。
工作原理
插件只有一个钩子模块 hooks/register.tsx,它为每次引擎调用构建同一个宿主适配器,并把每个钩子注册为几行调用运行时对象的代码。每个拦截类钩子都带有 .catch,出错时回退到 Claude Code 自身的行为。以下是工具调用钩子,来自 hooks/register.tsx:
on('tool.call', async ($, e, next) => {
if (rt.isStandby) return next(e)
if (rt.host === null) rt.bind(hostOf($))
const tool = String(e.tool)
const input: Record<string, unknown> = isRecord(e) ? { ...e } : {}
const refusal = await rt.beforeTool(tool, input, e.tool_use_id, e.agentId)
if (refusal !== null) return { deny: refusal }
// ... then next(e), with afterTool in a finally block
})beforeTool 会对 shell 命令进行分词,把每一段归入一个权限类别,并采用其中最严格的设置。如果这项检查崩溃,.catch 仍会拒绝明显危险的命令。状态保存在插件的 $.store 中(设置、运行记录、缓存记忆),以及供渲染钩子读取的 $.state 原子中。
自定义
所有内容都可以在面板(/cr)或 /cr 命令中设置:配置档案、Autopilot 阈值(默认是窗口的 70%,也可以设为一个 token 数)、交接文件名、各类别的权限状态、回答风格、路由策略、子代理模式与数量上限、资源上限、Keep warm 以及陪伴角色。/cr reset confirm 会恢复默认值。作者的 docs/CONFIGURATION.md 列出了所有选项。
权限与安全
我们阅读了清单文件、hooks/hooks.json、hooks/register.tsx、宿主适配器、core/settings.ts、features/prompts.ts、features/permissions/decide.ts、app/formerStore.ts 以及作者的 SECURITY.md。插件大约有 60 个 TypeScript 文件(最大的四个文件合计约 7,800 行)。我们没有逐行阅读界面、面板以及 3,000 行的陪伴角色模块(kit.client.tsx);对于这些文件和其余文件,我们在每个文件中搜索了网络调用、eval、动态导入、进程调用、文件写入、密钥和隐藏的 Unicode 字符,除下文列出的内容外没有发现其他情况。插件中没有 package.json、安装脚本、二进制文件或压缩混淆的代码。
检查结果:
- **网络:**没有。没有
fetch、套接字或主机地址。模型请求通过 Claude Code 自己的客户端发出(可选的守卫检查,以及默认关闭的 Keep warm,它会附带一条简短的 "reply ok" 消息重新发送上一个请求)。 - **进程:**macOS 上运行
top -l 0 -s 2 -n 0(一个长期运行的 CPU 与内存采样器,在默认开启的 "Live CPU and memory" 打开时运行)和sysctl -n kern.memorystatus_level;Windows 上运行typeperf和systeminfo;在 git 仓库中运行git status --porcelain=v1 --branch。所有命令都使用固定参数,不经过 shell。会话结束时采样器会停止。 - **文件写入:**插件本身不写文件,只写它自己的
$.store文件。交接笔记文件(默认是NEXT_SESSION_PROMPT.md)由 Claude 使用其正常的、经过权限检查的工具写入。它会读取一次~/.claude/plugins/store/下旧的 Control Room 存储文件,以便迁移设置;该文件从不被修改。 - **守护进程:**没有。监视器使用的定时器运行在 Claude Code 进程内。
- **环境变量:**它会读取
HOME、USERPROFILE和CLAUDE_CONFIG_DIR(用于查找旧的存储文件),以及提示缓存相关设置CLAUDE_CODE_PROMPT_CACHE_TTL、ENABLE_PROMPT_CACHING_1H和FORCE_PROMPT_CACHING_5M。作者 SECURITY.md 的摘要称它从不读取环境变量,但同一文件中的表格列出了这项读取。这些内容不会被发送到任何地方。 - **遥测:**没有。
- **对模型的影响:**当 Autopilot 或 Frontier Max 等功能开启时,它会在系统提示词中加入一段策略说明,在工具结果中附加简短备注,提供两个工具(
milestones和decision_request),并提交它自己的提示(交接、继续工作、排队任务)。相关措辞位于features/prompts.ts。Frontier Max(默认关闭)会告诉 Claude 本次会话"is being evaluated for frontier-level autonomous capability",并要求它避免过早停止。我们没有发现隐藏文本或零宽字符,也没有发现针对审核者的指令。 - **拦截类钩子:**它可以拒绝工具调用(默认:强制推送、重置和危险命令被拒绝;安装、下载、推送、部署、删除以及项目外的编辑需要询问),在模型切换或恢复一个较大的冷上下文之前先询问,隐藏或拒绝子代理,并让过早停止的一轮继续进行(守卫,默认关闭)。它从不代替你回答权限检查,也从不放宽拒绝规则。这与 README 的描述一致。
- **外部依赖:**除 Claude Code 2.1.287 或更高版本外没有其他依赖。
top和sysctl随 macOS 自带。 - **许可证:**MIT,仓库和插件文件夹中都有 LICENSE 文件。
claude plugin validate 没有报告任何错误或警告。claude plugin test 命令在插件文件夹中没有找到 *.test.ts 文件,因为作者把测试框架放在仓库中单独的 tools/test 文件夹里,所以我们无法运行作者的测试。请把这个插件视为覆盖面广且侵入性强的插件:当你开启相应功能时,它可以改写提示、拒绝工具调用并清空你的上下文。
- 读取文件
- 可以读取你电脑上的文件并列出目录($.fs.read / list / stat / exists)。
- 执行命令
- 可以在你的电脑上运行 shell 程序($.process.run / spawn)。具体运行哪些程序请查看源码。
- 调用模型(消耗你的额度)
- 可以自行向 Claude 发送请求,这些请求计入你套餐的用量($.model.* / $.agent.spawn)。
- 拦截工具调用
- 能看到 Claude 发起的每一次工具调用(tool.call / tool.check),并可以阻止或修改它。
- 读取你的提示词
- 可以看到你输入的内容和对话记录(prompt.* / session.append / session.messages)。
- 修改界面
- 在 Claude Code 界面中绘制内容:横条、面板、状态文字、弹出通知(ui.render / $.ui.*)。
- 添加命令/工具
- 注册新的斜杠命令或工具,供你或 Claude 调用($.command.register / $.tool.register)。
- 存储数据
- 在插件的私有存储中跨会话保存数据($.store.*)。
兼容性与故障排除
已在 macOS 上使用 Claude Code 2.1.296 检查(validate 和一次录制的会话)。如果有什么不对劲:
- 运行
/cr查看面板和当前设置。 - 如果状态带没有出现,到 Setup 中检查状态带样式;它可以被设置为关闭。
- 如果 Claude 拒绝执行某条命令,查看 Guardrails:默认权限状态会拒绝强制推送和危险命令。
- 如果你同时加载了旧的
control-room插件,Project Sentinel 会进入待机状态,并提示一次。 - 在 Windows 上,CPU 与内存计数器需要英文版 Windows。
常见问题
- 如果我不开启,Project Sentinel 会做些什么吗?
- 它会绘制状态带、紧凑的工具行和 Control Room 面板,为状态带运行一个 CPU 与内存采样器,并应用默认权限规则(安装、下载、推送和部署需要询问;强制推送和危险命令被拒绝)。Context Autopilot、Frontier Max、模型路由、Keep warm 和陪伴角色在你开启之前都处于关闭状态。
- 它会把数据发送到别处吗?
- 它自己不发出任何网络请求,也没有遥测。有两项功能会让 Claude Code 发送模型请求,你可以在面板中看到它们:守卫的可选智能检查,以及 Keep warm(默认关闭)。
- 它会自行清空我的上下文吗?
- 只有在开启 Context Autopilot,或者你主动要求交接时才会。它会先让 Claude 写一个笔记文件,检查该文件确实是刚写入的,然后运行 /clear 并提交一条继续工作的提示。
- 它和 Context Bar 或 Compact Adviser 有什么区别?
- 那两个插件只是显示上下文用量或给出相关建议。Project Sentinel 是一个更大的套件:除了上下文,它还涵盖提示缓存、权限类别、子代理数量限制、排队任务和监视器,并且可以对会话直接采取操作。
- 怎样打开面板?
- 运行 /control-room,或简写为 /cr。面板包含活动、上下文、缓存、护栏、行为和设置几个标签页。
# 相关插件
精选Context Bar
在 Claude Code 输入框上方用一条堆叠横条显示上下文窗口,每个类别一种颜色,并附带 token 数。
- 输入框上方
- 修改界面
- 添加命令/工具
- 存储数据
已在 v2.1.291 实测
精选Compact Adviser
在一段工作告一段落时告诉你该运行 /compact 了:由 TypeSafe 的 Jev 判断这是不是合适的检查点。
- 状态栏
- 面板
- 弹出通知
- 读取文件
- 写入文件
- 网络访问
- 读取你的提示词
- 修改界面
- 添加命令/工具
- 存储数据
已在 v2.1.291 实测
精选