实现状态
快照日期:2026-08-21。Architecture 与 Reference 是目标合同;本页是当前事实。
当前实现主线:R1(Claude)与 R2(Scale Gate)已完成;R3 并行迁移 (Codex、OpenClaw、Hermes)与 R4 的 JUE-401 可移植子集矩阵均已完成,详见 delivery-plan.md。RFC-0002:
jue apply --artifact/targets.*.artifact已接线; OpenClawcompatible-bundle与 Hermes thinskill-plugin已落地(见 Agent 画像)。 RFC-0003:jue apply --scope project|user与targets.*.scope已接线;Claude Code 支持 user,其他内置 Adapter 明确为 project-only。Core 为 read/write/ confirm 解析唯一的scope + artifactRoot + artifactKind目标上下文;dry-run/check 不初始化配置、不安装 Adapter、不更新 lock,也不写 Artifact。 下一步是 R4 剩余任务(JUE-402 两两交叉转换起)。
CLI
| 理想命令 | 状态 | 当前事实 | 下一步 |
|---|---|---|---|
jue init | 部分实现 | 已有交互初始化 | 对齐最小配置与非覆盖合同 |
jue apply | 部分实现 | Core --dry-run/--check/apply 均按退出码表工作;project/user scope、绝对 preflight 目标、逐 Adapter 根授权、批处理失败聚合与 apply 后原生确认已实现;dry-run/check 对配置根和 Artifact 根零写入;Claude user 原生路径已实现,其他内置 Adapter project-only | 补齐 jue inspect 筛选 |
jue inspect | 部分实现 | --diagnostics 已实现项目层 Skill 链接 finding(RFC-0004);--extension <path> --diagnostics 只读报告已加载 Adapter 的 id/capabilities,若 cwd 有项目配置则额外报告真实 apply 就绪状态(JUE-203) | 实现 --capability/--preset/--target/--artifact 筛选 |
jue capability update | 已实现 | 支持单项/全部来源更新 | 保持 lock 与安全合同 |
jue preset create/validate/pack | 部分实现 | 历史命令分散 | 收敛到作者命名空间 |
jue extension validate | 部分实现 | --load 校验并加载 Extension(JUE-103);--fixtures <dir> 对每个子目录跑 read() + CanonicalDocumentSchema 校验(JUE-203);Claude Adapter 现已导出真实 confirm() 并组装为 defineExtension(),是仓库首个可真实通过此校验的 Extension | 随 R3 各 Agent Extension 落地持续复用 |
现存 format、validate、check、list、create-preset 等命令是待收敛的历史 实现,不是目标架构。不得继续扩展其语义。
Agent Adapter
| Adapter | project scope | user scope |
|---|---|---|
| Claude Code | 已实现 | 已实现 |
| Codex / Cursor / OpenClaw / Hermes | 已实现 | 未声明,执行前失败 |
| Agent | 读取为 Canonical DSL | 写出 Artifact | 目标原生确认 |
|---|---|---|---|
| Claude Code | 已实现 | 已实现 | 已实现(confirm() 已导出并组装为 defineExtension(),JUE-203;Plugin 走真实 claude plugin validate --strict,project 无原生校验工具故如实返回 unconfirmed) |
| Codex | 已实现 | 已实现 | 已实现(packages/ai-jue-adapter-codex/,JUE-301)——能力声明如实标注三个"不支持"边界:commands: "degraded"(Codex 旧 custom-commands 机制已废弃,见 JUE-104/105/JUE-301 Phase 1)、mcp: "degraded"(plugin 形态写根级 .mcp.json;project 形态保持 TOML 降级,配在 .codex/config.toml 的 [mcp_servers.*] 表里)、rules: "degraded"(无独立 rules 目录,rules 归入 AGENTS.md 通过 context 映射实现)。原生确认:Codex 0.145.0 无 codex plugin validate。confirm() 对非 plugin 形态立即返回 unconfirmed;plugin 形态走真实 codex plugin marketplace add <local> + codex plugin add <name> --marketplace <name> + codex plugin list --json(隔离 CODEX_HOME),确认 Plugin 真被 codex 装上、出现在 inventory 且 installed: true, enabled: true,是 Codex 0.145.0 提供的最强原生确认路径。scripts/verify-codex-native.js(可重放)以 artifactKind: "project" 调用 confirm(),只验证了 read/write/confirm 函数在本机可加载运行、project 形态返回 unconfirmed 的代码路径,未调用真实 codex CLI |
| Cursor | 已实现 | 已实现 | 已实现(packages/ai-jue-adapter-cursor/)——project 与 Plugin 两种 Artifact;Skills/Subagents/Commands 保留 frontmatter;Project hooks 使用 { version: 1, hooks }、Plugin hooks 使用 { hooks };MCP 命令型 server 自动补 type: "stdio";variables 经 tools.cursor.pluginManifest 透传。confirm() 无官方 headless 校验,project/plugin 均返回 unconfirmed(plugin 附带结构证据) |
| OpenClaw | 已实现 | 已实现 | 已实现(packages/ai-jue-adapter-openclaw/,JUE-302)——capabilities 公开声明 rules/commands/agents/mcp: "degraded" 四个真实的"unsupported"边界(OpenClaw 无 per-workspace commands//agents//rules/ 目录,openclaw agents add/list/delete 管理 user home 下的隔离 workspace;MCP 全局唯一在 openclaw.json 上),仅 skills/hooks 是 supported(~/.openclaw/workspace-jue-probe/ 已实测确认的 skills/<name>/SKILL.md + hooks/<name>/HOOK.md+handler.js 形式)。原生确认走真实 openclaw --profile jue-302-verify-<pid>-<ts> config validate --json(隔离 --profile 防全局污染,实测通过),独立脚本 scripts/verify-openclaw-native.js 跑。已发现并记录 openclaw 0.145.0 的一个怪癖:spawnSync/execFileSync 在 vitest worker 里调 openclaw config validate --json 会产生空 stdout(手工 shell 调用正常),所以合同套件里不调用 confirmNatively(按 honest-degraded 原则),把真实原生确认放到了独立脚本里。npm test(285 通过,新增 5 项) |
| Hermes | 已实现 | 已实现 | 已实现(packages/ai-jue-adapter-hermes/,JUE-303)——capabilities 如实标注 rules: "unsupported"、hooks: "unsupported"(真实安装的 ~/.hermes/hooks/ 为空目录,证据不足)、commands: "degraded"、agents: "degraded"(均为 no-op 直通,config.yaml 同名块是全局运行时策略)、skills: "supported"、mcp: "supported"。原生确认:真实 tirith config validate <artifactRoot>(tirith 二进制,隔离临时 HOME),scripts/verify-hermes-native.js 可重放,但需要真实 tirith 二进制在 PATH 上。修正三处真实实现 bug:①confirm.ts 此前把可执行文件名与参数拼成一个字符串传给 execFileSync(cmd, options)——execFileSync 从不调用 shell 分词,会把整个含空格的字符串当作字面可执行文件名,无论 tirith 是否存在都必然 ENOENT;已改为 execFileSync("tirith", ["config", "validate", artifactRoot], options)。②capabilities/skills.ts 的 write() 此前对不含 <category>/<name> 斜杠的 Canonical skill key 直接抛错——但 Canonical 的 skills schema 就是无格式约束的 record(string, SkillSchema),任何来自 Claude/Codex/OpenClaw 风格 Preset 的扁平 key(这三者的原生 skills 目录都是一层)都会让 jue apply --adapter hermes 直接崩溃;已改为无斜杠时回退到 general 分类而不是拒绝,真实 ai-assets 仓库(27 个 agent、9 个 skill)以此验证通过。③同一文件里 references 附件文件名此前要求单一安全路径段,遇到嵌套路径(如 references/nested/guide.md,Claude/Codex 的 bundleKeys 机制支持这种嵌套)会拒绝写入;已复用 ai-jue-core 已导出的 resolveSupportFilePath(与其余 Adapter 的 directoryPerItem 工厂同一份防路径穿越逻辑)允许安全的嵌套子目录。另有一个未决架构问题:Adapter 在 CanonicalDocumentSchema 上新增了 cron 字段(cron/jobs.json 整文件直通),不属于六类原子 Capability 中的任何一类,是否需要正式收编(第七类原子 Capability,或改走 tools.hermes target-private 字段)尚未经 RFC 决定,见下方"尚未实现的关键合同" |
OpenClaw compatible-bundle 与 Hermes skill-plugin 的确认现在都先校验受管文件的 regular-file/realpath 边界,使用最小环境与隔离状态,并要求原生 inventory 包含安装 identity。Hermes 通过临时本地 Git 来源执行 plugins install + list --user --json; OpenClaw 使用非交互 install + list + inspect,并要求 inspect format 匹配生成 marker。 两条路径已分别在授权 Windows 与 macOS 主机的当前 CLI 上确认,证据仅保留脱敏状态。
“部分实现”只表示已有局部代码和测试,不表示该 Agent 已完整支持。逐项证据见 Agent 支持画像。
已完成基础
- Canonical Capability 基础结构与规范化。
- Preset 递归组合和嵌套资源保留。
- 本地和部分远程 Capability 输入、lock 与更新。
- Claude Code/Codex 的部分正向文件生成。
CanonicalDocument类型/schema 冻结(context+ 六类原子 Capability),toCanonicalDocument()剥离presets/preset/extends/capabilities/tools/language等 ProjectConfig 私有字段,不进入 Canonical 输出 (JUE-101,packages/ai-jue/src/config.ts)。capabilities的CapabilityRef从历史converter(agent-skill/mcp/jue-native)迁移为type(rule/command/skill/agent/hook/mcp),移除了可批量加载整个目录 的jue-native;每个引用现在只解析一个叶 Capability (JUE-101,packages/ai-jue/src/capability-source/index.ts)。 精确npm:<name>@<version>先复用声明 Preset 的已安装直接依赖(Node 包解析ArtifactChange/ArtifactResult/Confirmation类型冻结,含assertArtifactChange/assertConfirmation结构不变量:安全相对路径、 hash 是否存在与kind一致、confirmed必须带脱敏evidence(JUE-102,packages/ai-jue-core/src/artifact-change.ts)。ownership(full/managed-block/merged-keys)与atomicState已写入packages/docs/reference/extension-api.md。Adapter/ExtensionDefinition/CapabilitySupport/defineExtension冻结 于packages/ai-jue-core/src/extension-host.ts:Adapter 只暴露read/write/confirm,capabilities对六类原子 Capability 逐项声明supported/degraded/unsupported(JUE-103)。resolveExtensionPackage/loadExtensionGuarded(packages/ai-jue/src/extension-loader.ts)实现"npm 信任与隔离加载": 只校验 npmpackage.json的exports/main/peerDependencies["ai-jue-core"]且不执行入口;--load时在导入阶段监视并阻断fs写入方法、child_process系列方法、process.exit与fetch,测试证明恶意入口试图 写文件或起子进程时确实被阻止、且文件从未被创建(JUE-103)。jue extension validate <path-or-package> [--load](packages/ai-jue/src/commands/extension.ts)已接入 CLI,退出码对齐packages/docs/reference/cli/index.md(元数据问题退出2,--load期间 抛错退出1),已用真实构建产物node dist/cli.js extension validate验证。- 修正 JUE-101 遗留的错误分层:
CanonicalDocument及其六类原子 Capability zod schema 从 CLI 包ai-jue迁移到ai-jue-core(packages/ai-jue-core/src/canonical-document.ts),因为 Adapter 只依赖ai-jue-core,从不依赖 CLI 包。 - Claude Code 官方能力表面已核验并写入
packages/docs/{,en/}agents/claude-code.md:能力矩阵、作用域优先级表、 目标私有字段清单,均基于claudeCLI2.1.219的--help、plugin validate、headlesssystem/init实测与官方文档交叉验证 (JUE-104)。headless 清点路径(--plugin-dir+--output-format stream-json,不可加--bare)已确认可用,供 JUE-109/110 原生验证复用; 但该路径不保证零成本(见下方 JUE-105 记录),JUE-109 使用前必须先确认 prompt 结构上不会触发真实模型调用。 - Claude Code 最小全量 fixture 已构造并接入真实 CLI 验证 (
packages/ai-jue-adapter-claude/fixtures/,JUE-105):project-native 配置、含/不含 manifest 的两个 Plugin、marketplace 索引、命名冲突样本、 三个失败样本(空 skill body、非法 hook 事件名、路径穿越的 hook command)与一个敏感引用样本;每条claude plugin validate结果均已用真实 CLI 复核并写入fixtures/README.md。构造过程中发现并修正了 JUE-104 报告 的 5 处不准确断言:hooks.json需要外层"hooks"键包裹事件名(不是事件名直接在顶层);plugin.json的dependencies是"<name>@<range>"字符串数组,不是 对象;userConfig.<KEY>必须有title字段;agent、subagentStatusLine根本不是合法的plugin.json字段(claude plugin validate报"unknown field"警告,Claude Code 在加载时 忽略它们);- headless
--tools ""不保证零成本:同样的命令产生了真实计费total_cost_usd: 0.0394407,因为 prompt 若不需要工具,模型仍会正常生成 回复。真正免费需要 prompt 结构上依赖一个已被禁用的工具。 - 同时确认:manifest-optional 自动发现是
--plugin-dir运行时行为,claude plugin validate这条校验路径反而要求必须存在plugin.json或marketplace.json,二者不可混为一谈。
- Claude Code Adapter 的
read()(Native → Canonical)已实现并对全部 JUE-105 fixture 验证通过(JUE-106,packages/ai-jue-adapter-claude/src/read.ts):project 与 Plugin 双布局 按.claude/目录是否存在自动识别;rules(pathsfrontmatter 映射为globs)、commands、agents(扁平.md)、skills(目录 + SKILL.md)、 hooks(project 读settings.json,Plugin 读hooks/hooks.json,二者归一 为同一 Canonical hook 形状)、mcp.servers(扁平与包裹两种原生形状归一)、 context.global(解析CLAUDE.md的一级@AGENTS.mdimport)。packages/ai-jue-core/src/security.ts(assertNoLiteralCredentials)与packages/ai-jue-core/src/frontmatter.ts(splitFrontmatter)已提升为 共享能力,capability-source与 Adapter 复用同一份规则。 - Claude Code Adapter 的
write()(Canonical → Artifact)已实现(JUE-107,packages/ai-jue-adapter-claude/src/write.ts),与read()共享packages/ai-jue-adapter-claude/src/capabilities/*.ts声明表,经由packages/ai-jue-core/src/capability-mapping.ts的通用引擎驱动:flatMarkdownDirectory/directoryPerItem/managedMarkdownFile/mergedJsonFile四类原生形状 +readCapabilities/writeCapabilities组合器,使同一 Capability 的 read/write 由同一份声明构造,而非两份手写、 仅靠约定保持互逆的实现。ArtifactChange补上了content字段(此前只有 hash,Core 无从得知实际写入字节,是本任务发现并修正的 JUE-102 遗漏)。 两条等价性合同已用测试专用applyChanges脚手架验证:normalize(read(write(C)))=normalize(C)与normalize(read(write(read(N))))=normalize(read(N))(覆盖 project 与 Plugin 两种 Artifact),另有未托管字段保留与二次 apply 零差异专项测试。 过程中发现并修正一个真实 bug:context.global的read()此前未剥离AI-JUE:START/END包裹,导致往返失败;已在ai-jue-core新增extractManagedContent(stripManagedBlock的对偶)修复。 packages/ai-jue-core/src/index.ts与packages/ai-jue-adapter-claude的 read/write 实现均按领域拆分为多个小文件(capability-mapping.ts、merge-strategies.ts、capability-ref.ts、file-io.ts、markdown-rendering.ts、core-executor.ts;capabilities/{rules,commands,agents,skills,hooks,mcp,context,layout, manifest}.ts),不再有承担多个能力职责的单一大文件;ai-jue-core的测试 也从src/*.test.ts迁移到独立的test/目录,与仓库其余包的约定一致 (顺带修正了tsconfig.json遗漏排除新测试目录、导致测试文件被打进dist/发布产物的问题)。设计记录见docs/superpowers/specs/2026-07-26-capability-mapping-engine-design.md。- Claude Extension 包入口只导出
defineExtension()默认值,测试通过其中的Adapter.write()与 Core executor 物化 Artifact。以下映射行为均已验证并同步 更新index.test.ts、跨适配器的adapter-matrix.test.ts与adapter-capability.snapshot.test.ts:context.global不再额外写一份AGENTS.md数字摘要("## Rule: x") 再用CLAUDE.md的@AGENTS.md引用它;直接写入CLAUDE.md,因为 Claude Code 从不自行读取AGENTS.md(JUE-104 已验证)。跨适配器场景下AGENTS.md仍然存在——由 Cursor 适配器写入,不再是 Claude 适配器的 职责。commands不再重定向进.claude/skills/*/SKILL.md(旧代码假设 "commands 被合并进 skills",未经验证);改为写入.claude/commands/*.md独立目录,与 JUE-105 对真实 CLI 的验证一致。alwaysApply/disable-model-invocation等此前硬编码的字段改名或默认值 予以移除(均未在 JUE-104/105 中得到验证),rules/commands/skills/agents 现在是对 Canonical 属性的通用透传,只保留唯一已验证的改名 (globs→paths,仅用于 rules)。- 新增
WriteContext.toolsConfig(tools.claude透传设置合并进settings.json)与WriteContext.pluginManifest(packages/ai-jue-adapter-claude/src/capabilities/manifest.ts,生成.claude-plugin/plugin.json)。后者已用真实claude plugin validate --strict验证通过(packages/ai-jue-adapter-claude/test/ plugin-manifest.test.ts),补上了此前artifactKind: 'plugin'只写 六类能力、从不生成 manifest 因而无法通过claude plugin validate(只能 走--plugin-dir的 manifest-optional 运行时发现)的缺口——这是 JUE-109/110 原生确认要求的必需项,不是可选增强。 - 明确排除的范围:Marketplace/聚合索引 Artifact(
marketplace.json生成)本轮不实现;没有任何 JUE-101 至 JUE-110 的验收标准要求它, 在没有对应 Gate 前实现属于超出当前问题域的投机性扩展,取舍原则见packages/docs/architecture/adapter-standardization.md"Artifact 粒度 取舍"一节。
- Core 执行器(JUE-108,
packages/ai-jue-core/src/core-executor.ts)已实现planExecution/applyExecution/checkExecution:- 漂移检测:写入前重新读取磁盘真实哈希,与
beforeHash比对;create撞见已存在文件、update/delete撞见缺失或已被改动的文件均判定 为冲突,整批以零写入方式阻塞(blocked-conflict)。 - 授权:
requiresApproval为真且不在authorizedTargets内的变更单独 归类为blocked-unauthorized,同样零写入阻塞,不与冲突混淆。 - 原子执行与回滚:每次写入前先快照该文件当前字节(或"此前不存在"), 批次中任意一步失败即按相反顺序恢复所有已完成的写入,返回
rolled-back;测试用一个已存在的普通文件冒充目录路径制造真实写入失败, 验证已应用的其他改动被完整还原(core-executor.test.ts,17 项断言)。 - 幂等:
afterHash已存在于磁盘的变更视为no-change,二次 apply 零 写入,checkExecution与--check复用同一分类。 applyChangesOrThrow是测试脚手架物化write()输出的便捷封装;取代了此前 占位的artifact-executor.ts(无漂移/授权/ 回滚的最小文件系统原语),按"不保留遗留资产"原则整体删除,不是新增 并行实现。- CLI 接入(
packages/ai-jue/src/core-apply.ts):jue apply校验 Extension 默认导出并直接调用其中唯一 Adapter 的write(),所有内置 Adapter 统一走 Core 执行器,--dry-run(零写入预览,恒退出0)与--check(只读,no-change退出0、pending/blocked-conflict退出3、blocked-unauthorized退出4、rolled-back退出1)已接入真实 退出码。包顶层方法不参与 apply 运行时合同。scripts/smoke-apply.js新增runCoreExecutorSmoke(),用真实构建产物dist/cli.js验证:空项目--dry-run零写入、--check退出3、 apply 退出0并写入、apply 后--check退出0、二次 apply 不改写 文件 mtime(零差异)。范围说明:真实磁盘漂移阻塞blocked-conflict已在core-executor.test.ts用直接构造的ArtifactChange验证;单次jue apply调用内write()与applyExecution紧邻执行、之间没有真实时间窗口,因此无法也不需要在 CLI 级别重现外部并发修改触发漂移的场景。 npm test(282 通过,含新增 17 项core-executor.test.ts断言)。
- 漂移检测:写入前重新读取磁盘真实哈希,与
- Claude 原生可用性验证(JUE-109,
scripts/verify-claude-native.js,可从 干净 worktree 重放):用真实write()/applyChangesOrThrow()在隔离临时 目录生成一个只含单个确定性 command 的最小 Plugin;claude plugin validate --strict通过;强制制造一次批次中途真实写入失败(第二个变更的父路径与已 存在的普通文件冲突),core-executor.ts的applyExecution完整回滚,回滚 后用同一个claude plugin validate --strict复核 fixture 未被破坏;claude --bare -p "/jue-109-verify:status" --plugin-dir <fixture> --output-format stream-json --verbose --allowedTools ""的system/init显示生成的 Plugin 出现在plugins、plugin_errors对其无条目、slash_commands含生成的 command,最终result为{is_error:false, result:"JUE-109-OK"}(确定性标记文本,证明能力被真实 发现且调用);单次真实计费 $0.003–$0.005。发现三处真实事实:--bare认证严格要求ANTHROPIC_API_KEY或经--settings的apiKeyHelper(不读 OAuth/keychain,本机交互式登录不适用于--bare,本次验证改用 Anthropic-API 兼容的第三方后端满足该要求);--bare不隔离机器上已安装的 其余真实 Plugin(plugins清单会连同 fixture 一起出现);plugin_errors在无错误时是整字段缺失而非空数组。完整证据见packages/ai-jue-adapter-claude/fixtures/README.md"JUE-109 native usability verification"一节。范围说明:fixture 刻意只含 command,未覆盖agents/mcp.servers在--bareheadless 下的 inventory(已知--bare会丢失二者,见 JUE-104/105 记录)——这两类的 read()/write() 正反等价已由 JUE-106/107 的单测覆盖,只是未过这一关;confirm()方法本身与defineExtension()组装不在本任务验收范围内,仍未开始。 - Claude MVP Gate(JUE-110,
scripts/verify-claude-mvp-gate.js,一条命令, 可从干净临时目录重放):用真实project/原生 fixture(与 JUE-105/106/ 107 测试同一份,非另造样本)串起完整 R1 链路——read()得到 Canonical 并 通过CanonicalDocumentSchema;转换为 Plugin 前剥离context.global(Claude Code 的 Plugin 没有 CLAUDE.md 等价机制,write()对artifactKind:"plugin"从不产出context.global,与plugin/fixture 自身的能力覆盖矩阵一致,是既有的 Artifact-kind 边界而非本任务引入的 缺陷);加入一个仅用于验证的确定性 command 后写入全新临时目录并生成 Plugin,经 Core 执行器 apply;claude plugin validate --strict通过;read()结果与写入前 CanonicaldeepStrictEqual(normalize(read(write( read(N))))=normalize(read(N))合同,在同一条脚本内端到端验证);对同一 Canonical 再次write()得到零变更(幂等);claude --bare -p "/jue-110-mvp-gate:mvpGateProbe" --plugin-dir <fixture> --output-format stream-json --verbose --allowedTools ""的system/init显示 Plugin 已加载且无错误条目、探针 command 出现在slash_commands,最终result为确定性标记文本,证明真实发现并调用,单次真实计费约 $0.005;并确认 fixture 自带的失效mcp.servers(指向不存在的node server.js)不会 阻塞或挂起该调用。完整证据见packages/ai-jue-adapter-claude/fixtures/README.md"JUE-110 Claude MVP Gate"一节。R1(JUE-101 至 JUE-110)全部done;delivery-plan.md中 "JUE-110 未完成前不开始其他 Agent 实现"的限制已解除,下一个ready任务是 JUE-201。 agent-extensionSkill(JUE-201,packages/jue-preset-internal/skills/adapter-creator/,SKILL.mdv6.0.0):既有的六阶段方法论现已显式自证为 delivery-plan.md R2 所指的agent-extensionSkill,并补齐三处此前落后于 JUE-108/109/110 实际实现的 内容——Phase 4 新增:Adapter 的write()输出必须经core-executor.ts(JUE-108)的planExecution/applyExecution/checkExecution驱动,不得每个 Adapter 各自实现 apply/回滚;Phase 5 修正:等价性合同用真实applyChangesOrThrow验证,不再引用已删除的 占位applyChanges脚手架;Phase 6 新增"可复用脚本形态",把scripts/verify-claude-native.js/verify-claude-mvp-gate.js的具体做法 (确定性标记 command、强制批次失败并用原生工具复核回滚、认证与隔离是两个 要分别核实的独立问题、外部进程引用损坏不一定阻塞 headless)泛化为任意 目标 Agent 通用的模板。Phase 2 新增"聚合 Artifact 调查",引用 adapter-standardization.md 的粒度取舍判据。此变更是文档/方法论资产更新, 未新增测试用例;npm test(282 通过,无回归)。- 共享合同测试套件(JUE-202,
packages/ai-jue-core/src/ adapter-contract-kit.ts):defineAdapterContractSuite(options)通过options.testApi接收调用方从 Vitest ESM 导入的describe、expect、it,一次调用 即注册六类合同测试——两条等价性合同、幂等、未托管字段保留、敏感引用拒绝、 按 Artifact kind 的原生确认(每个 fixture 可选的confirmNatively回调)——内部经真实applyChangesOrThrow/core-executor.ts落盘,不是 另一套测试专用写入器。只从ai-jue-core/testkit子路径导出(包根新增testkit.js/testkit.d.ts,vitest声明为可选peerDependency),运行时不从 CommonJS Core 加载 Vitest,且不进入ai-jue-core主入口index.ts,避免测试框架 依赖与模块格式污染运行时消费者;vitest.config.ts新增对应的 alias 条目使其在仓库内解析到源码而非dist/。已用 Claude Adapter 真实改造验证:新增packages/ai-jue-adapter-claude/test/contract.test.ts(8 项断言,含真实claude plugin validate --strict原生确认)替换手写的write.test.ts(6 项重复断言,已删除),并将read.test.ts中重复的敏感凭据拒绝测试 迁移进共享套件的securityRejectionCases(该测试从read.test.ts移除);adapter-creator/SKILL.md升至 v6.1.0,Phase 5 改为指向该共享套件。npm test(283 通过,净增 1:282 − 6(删除 write.test.ts)+ 8(新增 contract.test.ts)− 1(read.test.ts 去重)= 283)。 - 作者 CLI 支持(JUE-203):前置发现并修复了一个真实缺口——
jue extension validate ai-jue-adapter-claude此前必然失败,该包只有dependencies.ai-jue-core,缺 JUE-103 校验要求的peerDependencies["ai-jue-core"],且从未导出defineExtension()形状的 默认导出(只有独立read/write,从无confirm())。已补齐:新增packages/ai-jue-adapter-claude/src/confirm.ts(Plugin 走真实claude plugin validate --strict;project 无对应原生校验工具,如实返回unconfirmed);index.ts组装Adapter(六类capabilities均supported)并export default defineExtension(...);package.json补上peerDependencies.ai-jue-core。node dist/cli.js extension validate ai-jue-adapter-claude --load首次真实成功。在此基础上新增两个 CLI 入口: ①jue extension validate <pkg> --fixtures <dir>(packages/ai-jue/src/commands/extension.ts的runExtensionFixtureCheck)对目录下每个直接子目录调用已加载 Extension 首个 Adapter 的read()并按CanonicalDocumentSchema校验,逐条报告 通过/失败,任一失败退出码 2;已用真实 Claudeproject/pluginfixture 验证均通过。②jue inspect --extension <pkg> --diagnostics(新增packages/ai-jue/src/commands/inspect.ts):只读报告已加载 Adapter 的id/capabilities,若 cwd 存在项目配置则额外经真实core-executor.ts(JUE-108)的checkExecution报告对该项目的 apply 就绪状态,从不写入;在仓库自身根目录实测发现 17 项待处理变更(真实、非 伪造结果),git status确认零写入。--capability/--preset/--target/--artifact筛选未实现,已在本文件的 CLI 表中标为规划。npm test(293 通过:新增confirm.test.ts3 项、extension-fixtures.test.ts4 项、inspect.test.ts3 项)。 - 中性第二 Adapter 验证(JUE-204):中性 Adapter 建成仓库内测试 fixture
packages/ai-jue-core/test/fixtures/neutral-adapter/,而非packages/ai-jue-adapter-*独立包——jue apply的findAdapters()用 glob 发现适配器,独立包会被真实纳入apply --all/smoke-apply.js候选 列表,一个没有真实原生工具、纯测试用途的构造进入该命名空间即是对公共 语义的污染;这也是 Rollup/Vite/Webpack/Babel/ESLint 等内核+插件仓库验证 框架通用性时的通行做法(合成插件内联在被测框架自身测试目录,不作为兄弟 发布包)。原生形状:七个mergedJsonFile映射,每个 Capability 类型一个 独立 JSON 文件(context.json/rules.json/commands.json/agents.json/skills.json/hooks.json/mcp.json),与 Claude 的 "每条目一个文件/目录"形状完全不同;mcp额外做servers↔mcpServers键名转换(复用assertNoLiteralCredentials),证明toCanonical/toNative转换机制同样泛化。confirm()如实返回unconfirmed(该虚构 Agent 没有任何官方工具可确认)。设计中发现并规避一个真实陷阱:若六个 Capability 共用同一文件、各自独立声明mergedJsonFile,writeCapabilities只做简单拼接、不合并同路径变更,Core 顺序应用时后一个变更会覆盖前一个; 改为每个 Capability 各自独立文件后完全规避,未改capability-mapping.ts。packages/ai-jue-core/test/adapter-contract-kit.neutral.test.ts直接调用 JUE-202 的defineAdapterContractSuite(6 项断言,零 Claude 专属代码)。 已核实canonical-document.ts/capability-mapping.ts/core-executor.ts/extension-host.ts四个文件实现前后 md5 完全一致;check-consistency/smoke-apply.js均确认未新增真实包、未被jue apply发现。npm test(299 通过,新增 6 项)。 - R2 Scale Gate(JUE-205):全量回归复核(
npm test299 通过、npm run build、npm run check-consistency、npm --prefix packages/docs run docs:build、git diff --check全部通过)。 冻结模板(adapter-creator/SKILL.mdv6.2.0)、输入契约(能力矩阵+最小全量 fixture)、输出契约(packages/ai-jue-adapter-{agent}/目录骨架,write()经core-executor.ts驱动)、完成证据契约(claude-code-execution.md"交接合同"从 8 字段扩充为 12 字段:新增status/changes/security_results/next_ready_task)、以及合成测试目标不得建成独立包的 生态位边界(JUE-204 先例)。详见claude-code-execution.md"Scale Gate(JUE-205)冻结内容"一节。R3 三条任务(JUE-301/302/303)现已解除 阻塞,均为ready。 - R3 三个并行 Adapter(JUE-301 Codex、JUE-302 OpenClaw、JUE-303 Hermes)均已 按 JUE-205 输出契约建成:各自的
capabilities/*.ts声明表 +read.ts/write.ts/confirm.ts/index.ts组装Adapter+defineExtension(),write()均经core-executor.ts驱动,因而jue apply --adapter <codex|openclaw|hermes> --dry-run/--check现已可用 (不再局限于 Claude)。三者原生确认路径各不相同:Codex 走真实codex plugin marketplace add+plugin add+plugin list --json;OpenClaw 走真实openclaw --profile <isolated> config validate --json(vitest worker 内调用有空 stdout 的经验性怪癖,故合同套件内不调用confirmNatively,原生确认改在独立脚本scripts/verify-openclaw-native.js跑);Hermes 走真实tirith config validate(scripts/verify-hermes-native.js)。npm test当前 292 通过。JUE-401(四 Adapter 可移植子集矩阵)也已完成, 详见 delivery-plan.md R4 与packages/ai-jue-adapter-hermes/audit/ JUE-401-portable-canonical.md。 - 真实 ai-assets 仓库四 Agent 验收:
scripts/smoke-local-preset.js(此前只跑 Codex/Claude Code)扩展为同时对 OpenClaw/Hermes 跑apply并校验各自的 必需原生输出;对内置local-preset-monorepofixture 与真实~/code/github/ai-assets仓库(presets/{mcp,meta,coding,content, agent-os,personal}六个 workspace 包,personal组合其余五个,含 27 个 agent、9 个 skill)均已用npm run smoke:preset-local实测通过,四个 Adapter 全部零错误完成 apply,真实文件正确落盘(含 Hermes 分类回退与嵌套 references)。过程中发现并修复两处与本仓库无关但阻塞该验收的环境/外部 问题:仓库自身node_modules符号链接过期(仍指向已删除的ai-jue-adapter-copilot/ai-jue-adapter-gemini,缺失新增的ai-jue-adapter-openclaw/ai-jue-adapter-hermes),已npm install重新同步;ai-assets 仓库presets/mcp/package.json的ai.capabilities.filesystem仍用已废弃的converter字段名(JUE-101 已把 该字段迁移为type),在 ai-assets 侧改为"type": "mcp"后才能通过CapabilityRefSchema校验。 - 修正一处真实的 Capability Source 缓存隔离 bug(
packages/ai-jue/src/ capability-source/index.ts):resolveSource的默认缓存根目录固定是~/.cache/ai-jue,缓存 key 只由sha256(source+ref+path)决定、与消费方 项目无关;但AI_JUE_SOURCE_MIRROR_DIR(供scripts/smoke-local-preset.js --offline-mirror等测试场景用合成 stub 内容替身真实抓取)此前没有对应的 缓存根目录隔离开关,一次带--offline-mirror的测试运行会把虚构内容 (如neutral-filesystem)写进这个全局共享缓存,此后任何项目对完全相同source/ref/path的真实解析都会静默复用这份虚构内容,而不是真正抓取 ——本任务在对真实 ai-assets 仓库跑验收时曾被这个问题掩盖了 ai-assets 自身presets/mcp/package.json里一个真实存在的错误(npm:@modelcontextprotocol/ server-filesystem@1.2.0从未发布过1.2.0版本,真实抓取会以ETARGET失败,但被之前一次--offline-mirror测试运行污染的缓存条目掩盖成"成功")。 已新增AI_JUE_CACHE_DIR环境变量(与AI_JUE_SOURCE_MIRROR_DIR对称) 覆盖缓存根目录,smoke-local-preset.js在--offline-mirror true时一并 设置到临时目录,不再触碰真实缓存;已清理本机被污染的~/.cache/ai-jue并在 ai-assets 侧把版本改为真实存在的2026.7.10,复核.mcp.json输出 确认指向真实包名而非虚构 stub。新增回归测试packages/ai-jue/test/capability-source.test.ts"honors AI_JUE_CACHE_DIR when options.cacheDir is not supplied"(npm test293 通过,净增 1)。 - 修正两处
packages/ai-jue/src/commands/apply.ts里 OpenClaw/Hermes 短名解析 的真实 bug:①ADAPTER_ALIAS_MAP此前没有openclaw/hermes条目,jue apply --adapter openclaw会把短名直接当 npm 包名去装——在全新项目里 实测真的从公共 npm registry 装并加载了一个同名但完全无关的第三方包 (openclaw@2026.7.1-2,一个消息网关工具),触发 ESM/CJS 冲突崩溃;已补 齐别名映射。②ADAPTER_INDICATORS给 Hermes 用的 footprint 探测文件最初 选了裸config.yaml——这个文件名在 Docusaurus、mkdocs、Ansible、 Serverless 等大量无关工具里都很常见,会让jue apply(未显式传--adapter)在毫不相关的项目里误判并静默触发npm install -D ai-jue-adapter-hermes与一次错误的 apply;已改为MEMORY.md,与其余 Adapter 探测文件(如CLAUDE.md)的特异性对齐。
Cursor 后续工作
JUE-304 已完成 Cursor project/plugin 正反转。 jue-preset-internal 的 adapter-creator 以 packages/ai-jue-adapter-cursor/src/capabilities/layout.ts 写出双布局合同。 Cursor fixtures/failures/ 接入共享套件的 securityRejectionCases,并记录 hook 路径穿越拒绝与未知事件透传。 OpenClaw compatible-bundle 可通过显式 tools.openclaw.bundleFormat: "cursor" 委托 Cursor plugin 布局;auto 仍只选 Claude/Codex。 下列 GitHub Issues 为独立后续任务——Agent 开工前必须阅读 issue 全文(含 Acceptance criteria 与 Implementation notes):
| Issue | 任务 |
|---|---|
| #8 | .cursor-plugin/marketplace.json 生成 |
尚未实现的关键合同
resolveFinalConfig仍返回混合 ProjectConfig 字段的MergedConfig,不是CanonicalDocument;jue apply对 Core 执行器路径都在各自入口内单独调用toCanonicalDocument(config),尚未让resolveFinalConfig本身统一产出CanonicalDocument供全部 Adapter 共用。Claude/Codex/Cursor/OpenClaw/Hermes 的默认 Extension 均提供 Adapterwrite()并接入 Core 执行器(Cursor project + plugin,JUE-304)。- Hermes Adapter(JUE-303)在
CanonicalDocumentSchema上新增了一个cron字段(packages/ai-jue-core/src/canonical-document.ts,cron/jobs.json整文件直通),不属于本文件其余各处反复强调"冻结"的六类原子 Capability (rule/command/skill/agent/hook/mcp)之一。这是先诚实暴露一个 真实存在的 Hermes 原生表面,但尚未经过 RFC 决定其架构地位:应作为第七类 原子 Capability 正式收编、还是改走tools.hermestarget-private 字段、 还是维持现状,是一个需要显式决策而非默认接受的公共合同缺口。 jue apply已统一通过defineExtension()默认导出的 Adapter 对象调用write();写入后的原生confirm()生命周期仍未接入 apply。capabilities的integrity字段已可提供但未对远程来源强制校验。- Preset、Extension、Adapter、Artifact 四个概念中,Extension/Adapter 已有
ExtensionDefinition/Adapter公开类型;Preset、Artifact 仍无独立公开 类型。 loadExtensionGuarded的"隔离"是进程内 API 守卫(拦截并阻断经由 require 链直接调用的 fs/子进程/网络/process.exit),不是 OS 或 VM 级别的 沙箱:无法阻止原生插件绕过这些模块、无法限制 CPU/内存耗尽、也无法对同步 死循环设置超时。真正的隔离边界(独立进程或 VM)仍是待办。- 四个 Agent 的往返、幂等和未托管字段保留测试。
- Claude Code 能力发现中,Monitor、Theme、Channel、
bin/、userConfig的 运行时行为,claude plugin eval,marketplace 私有/企业分发路径,以及 managed/enterprise scope 仍未实测验证(本机无 managed settings、无法安装 真实 Plugin 走完整交互会话);JUE-105 的 fixture 已按此边界构造,themes/与workflows/样本仅作为文档来源的保留字段样本,未附带运行时验证。 - 后续原生确认(JUE-109)与其他 Agent 迁移必须使用
packages/ai-jue-adapter-claude/fixtures/README.md记录的经过实测的字段 形状(hooks.json外层hooks键、dependencies数组形状、userConfig.title必填等),不得复用 JUE-104 报告中未经复核的原始断言。 - Marketplace/聚合索引 Artifact(多 Plugin 打包发布)尚未实现,也不在当前 Gate 范围内;只有 R5 ai-assets 真的需要把多个 Preset 作为一个可分发单元 时才实现,取舍原则见
packages/docs/architecture/adapter-standardization.md。 - 同一运行时跨发现根的 Skill 碰撞规划见 RFC-0006(Proposed)。 Adapter 发现证据与 Core 规划尚未接线;Antigravity 覆盖跟随 #30。