任务:上机和技能用的 Circle 主目录
依据:
hub-device-run.md第 11 条:上机第 5 步由 Circle 会话跑用例编译包的客户端脚本。评审用的专用目录(scripts/real/circle-home.ts)只放行 Hub 的六个工具和待办清单,execute和技能工具都被拒,这一步在那里跑不了。jev-skill.md的“先知道的”:jev 技能装在另一个主目录,--send的 ask 钩子也要装进那个主目录自己的hooks.json。- Circle 文档(Circle 仓库 hub-mcp-client 分支,只读):
docs/hooks.md:- 输入有
tool_name、tool_input、paths。变量已经代入,密钥写回成%名字%。 - 几条钩子里最严的决定生效。
- 非零退出、超时、输出不是 JSON 对象,都算 deny。
- 输入有
docs/skills.md:技能目录的层级;skill工具;技能自带的钩子要等会话载入技能以后才跑。docs/tools.md:execute的参数是command、background、timeout。docs/settings.md:variables。docs/security.md:按名字存的密钥。
- 分支和工作树:
circle-home-skills,目录circle-hub-circle-home-skills,从 hub-redesign 开出。 - 可以改的路径:
scripts/real/circle-home.ts、scripts/real/circle-home.test.ts。别的路径不动。 - 规则:同前(不推送、不建 PR、不发布、不部署;不碰 7420、钥匙串、环境配置文件和任何真实系统;
git commit -s)。测试只用临时目录和合成的环境文件。 - 验证:
npx tsc --noEmit;node --test scripts/real/circle-home.test.ts。
要做的
- 加
--profile review|skills,默认 review。review 写出的文件逐字节不变:现有测试照旧通过,另加一条字节对照。 - skills 写出的主目录:
- settings.json 和 review 一样:模型端点、Hub 的 MCP 条目、受保护文件、auto 模式。
- settings.json 另加
variables:HUB_URL取--hub-url;给了--jev-model就写JEV_MODEL,没给就不写。 - secrets.json 只有
HUB_TOKEN。JEV_API_KEY由所有者自己用/secrets JEV_API_KEY存,脚本不经手。 - 建一个空的
skills/目录,权限 0700。
- skills 的钩子:数据目录
hooks.json里一条,一个脚本。- 放行:Hub 的六个工具、
write_todos、skill。 - 只读的文件工具(
read_file、ls、glob、grep):paths非空,并且每一条都在工作目录里面,才放行。 execute只放行一种写法:node <脚本> <参数…>,后面可以带一段<<'EOF'的 here-doc,定界符要加引号,正文每行只能是%名字%。另外:- 脚本是绝对路径,规范化以后在
<主目录>/skills/下面(层数不限),以.ts结尾; node后面不许带任何选项(-e、--input-type这类都拒);- 参数一个一个看:要么是只含字母、数字和
_ . / : % = @ , + -的词,要么是不含单引号的单引号串; background、timeout照常可以带;- 别的写法一律 deny,理由写“这个目录只放行技能目录里的脚本”。
- 脚本是绝对路径,规范化以后在
- 放行的
execute还要过那个技能目录里hooks.json的 before_tool 钩子:输入相同,超时照 Circle 的规矩,取最严的决定。这样即使没载入 jev 技能,--send照样出确认卡片。- 那份 hooks.json 读不了,或者钩子失败、超时、输出不是 JSON 对象:deny。
- 技能目录里没有 hooks.json:allow。
- 其余工具,以及读不懂的输入:deny。
- 放行:Hub 的六个工具、
- 屏幕:照旧只显示名字、有没有、长度。最后列出所有者还要做的事:
/secrets JEV_API_KEY;- 没给
--jev-model时,/variables JEV_MODEL; - 技能装进
skills/以后,跑各自的核对:local-tools verify --digest、pack-files.ts --verify-install。
- 测试:
- review 的文件逐字节不变。
- 放行:六个工具和
skill;node <主目录>/skills/x/tools/t.ts --a b;here-doc 正文是%JEV_API_KEY%和%HUB_TOKEN%的那种写法。 - 拒绝:
write_file;- 工作目录外面的
read_file; - 命令里带
;、&&、|、反引号、$(、>; - 定界符不加引号的 here-doc,或者正文里有别的文字;
- 路径里有
..,或者脚本在skills/外面; node -e。
- 技能自带的钩子:它回 ask,结果就是 ask;它失败、超时、输出不是 JSON,结果是 deny;没有 hooks.json,结果是 allow。
- 合成一份 jev 那样的
hooks.json(带--send就回 ask):没载入技能,也得到 ask。
集成者答复(2026-10-24 凌晨)
- 03:57,给 codex-e 的待通知排期:trunk-fixes 和 jev-skill 都合入 hub-redesign 后,授权把 hub-redesign 合进本分支;合入条件与开始时机由集成者通知,不把这条待通知记录当成已经完成合并。
- 核对扫描覆盖全部目标脚本。Jev 的
lib/local.ts中rename(temp, file)已由集成者按调用点复核,按该调用点摘要登记;不是把 rename 整类操作或任意改写放行,也不授权修改 Jev 业务代码。
完成后在终端里回报:提交号、测试数量、没做完或拿不准的地方。真实主目录由集成者建。