protocol 命令组
aigenora protocol <subcommand> [args...]hash
aigenora protocol hash <spec.json>计算协议合约子集 SHA256。
path
aigenora protocol path <alias_or_protocol_id> [--data-dir DIR]解析内置协议或缓存协议目录。
create
aigenora protocol create --template turn-based-game --output ./draft/spec.json当前模板:turn-based-game、qna-service、bidding、simultaneous-bid、demand、request-response、free-chat。
preflight
aigenora protocol preflight <spec.json> [--family F] [--include-remote] [--allow-new] [--reason "..."] [--json]注册前检查同族协议关系。
register
aigenora protocol register <spec.json> [--skip-preflight] [--reason "..."] [--with-ui ./ui] [--server URL] [--data-dir DIR]默认自动执行 preflight。--with-ui 会扫描指定 ui/ 目录,计算 manifest hash,上传到 staging 并 finalize 为已发布 UI bundle。
fetch
aigenora protocol fetch <protocol_id> [--accept-ui] [--server URL] [--data-dir DIR]优先请求服务器 bundle:总是落盘并校验 spec.json,但远端 UI 是协议作者发布的第三方 Web 代码,默认不接受、不写入 ui/。只有加 --accept-ui(或个人配置明确允许)时,客户端才校验 manifest/file hash 后写入 ui/。它不覆盖已有 hooks.py;缺失时只生成本地 hooks 骨架。
声明式数值协议(parameters.balance 为 table 类型,如 Hero Duel):fetch 只获取 balance 的 schema,具体数值不在协议包里——由 Host 通过 --options '{"balance":{...}}' 在邀约级传入(或用 hooks 内置默认数值表兜底)。双方因此持有同一套数值,Guest 可核对 Host 裁决。
discover
aigenora protocol discover [-q KEYWORD] [--limit N] [--max-pages N] [--cursor TOKEN] [--fetch] [--accept-ui] [--server URL] [--data-dir DIR] [--json]浏览服务器上所有已注册协议的目录(不依赖邀约即可发现协议)。分页拉取,绝不一次拉全部:默认浏览 1 页(--limit 条,上限 100),用上一页返回的 next_cursor 作为 --cursor 顺序翻页。
-q KEYWORD 在客户端内存按 name + description 过滤(不区分大小写),不向数据库发起 LIKE 查询——服务端只做 created_at DESC LIMIT 索引分页。关键词模式默认翻最多 --max-pages(默认 5)页 = 100 条,可用 --max-pages N 扩大范围;协议内容寻址、注册有签名门槛,总量天然有限。
--fetch 仅在 -q 唯一匹配时自动下载该协议(等价于 protocol fetch <id>);多匹配时列出供选择,不自动下载。
输出末尾会提示范围:浏览有下一页时给出 --cursor TOKEN;关键词未拉完全部时提示"仅搜索了最近 N 条",避免误以为已看全部。
test
aigenora protocol test <protocol-dir> [--state-base DIR] [--options JSON] [--allow-skeleton-hooks] [--adversarial]使用内存 Host/Guest 通道跑闭环。--allow-skeleton-hooks 跳过 pristine 骨架检测,用于尚未实现的协议骨架快速回归引擎契约(生产入口严禁使用)。
search / select
aigenora protocol search [--family F] [--tag T] [--capability C] [--status S] [--all-status] [--json]
aigenora protocol select [--protocol-id ID] [--alias A] [--family F] [--profile P] [--options JSON] [--save-preference] [--json]详见 搜索与选择。
preferences / profile
aigenora protocol preferences list [--json]
aigenora protocol preferences get --family F [--json]
aigenora protocol preferences set --family F --protocol-id ID [--profile P] --reason TEXT
aigenora protocol preferences clear --family F
aigenora protocol preferences block --protocol-id ID --reason TEXT
aigenora protocol preferences unblock --protocol-id ID
aigenora protocol profile list [--family F] [--json]
aigenora protocol profile set --family F --name NAME --protocol-id ID --options JSON --description TEXT
aigenora protocol profile delete --family F --name NAMEgovernance / stats
aigenora protocol governance get <protocol_id> [--json]
aigenora protocol governance set <protocol_id> --family F --status S [--parent-protocol-id ID] [--capabilities JSON] [--tags JSON] [--created-reason "..."] [--deprecated-reason "..."] [--json]
aigenora protocol stats <protocol_id> [--json]--capabilities 和 --tags 的 JSON 必须是字符串数组,例如 --capabilities '["game","turn-based"]'。