Skip to main content

Documentation Index

Fetch the complete documentation index at: https://openclaw.zhcndoc.com/llms.txt

Use this file to discover all available pages before exploring further.

openclaw path

由插件提供的 shell 访问能力,针对 oc:// 定位基底:一种按类型分派的路径方案,用于检查和编辑可寻址的工作区文件(markdown、jsonc、jsonl)。自托管者、插件作者和编辑器扩展可用它来读取、查找或更新某个狭窄位置,而无需为每种文件手写解析器。 CLI 与该基底公开的动词保持一致:
  • resolve 是具体且单一匹配的。
  • find 是用于通配符、并集、谓词和位置展开的多匹配动词。
  • set 仅接受具体路径或插入标记;通配符模式会在写入前被拒绝。
path 由捆绑的可选 oc-path 插件提供。在首次使用前启用它:
openclaw plugins enable oc-path

为什么使用它

OpenClaw 状态分散在可人工编辑的 markdown、带注释的 JSONC 配置,以及只追加的 JSONL 日志中。Shell 脚本、钩子和代理经常只需要这些文件中的一个小值:一个 frontmatter 键、一个插件设置、一条日志记录字段,或某个命名部分下的一个项目符号。 openclaw path 为这些调用方提供了稳定地址,而不是针对每种文件都临时使用 grep、正则或解析器。同一个 oc:// 路径可以从终端进行验证、解析、搜索、试运行和写入,这让窄范围自动化更易审查,也更安全可重放。尤其适合在保留其余文件注释、换行符和周边格式的同时,只更新一个叶子节点的场景。 当你要处理的内容有逻辑地址,但物理文件形态会变化时,就应使用它:
  • 某个钩子想从带注释的 JSONC 中读取一个设置,同时在写回时不丢失注释。
  • 某个维护脚本想在 JSONL 日志中查找每个匹配的事件字段,而无需把整份日志加载到自定义解析器里。
  • 某个编辑器扩展想按 slug 跳转到 markdown 的某个章节或项目符号,然后渲染它实际解析到的精确行。
  • 某个代理想在应用之前试运行一次小型工作区编辑,并在审查中能看到变更字节。
对于普通的整文件编辑、富配置迁移,或内存特定写入,你大概不需要 openclaw path。这些应该使用所属命令或插件。path 适用于那些小而可寻址的文件操作,在这类场景下,可复现的终端命令比另一个定制解析器更清晰。

如何使用

从人工编辑的配置文件中读取一个值:
openclaw path resolve 'oc://config.jsonc/plugins/github/enabled'
在不触碰磁盘的情况下预览写入:
openclaw path set 'oc://config.jsonc/plugins/github/enabled' 'true' --dry-run
在只追加的 JSONL 日志中查找匹配记录:
openclaw path find 'oc://session.jsonl/[event=tool_call]/name'
通过章节和条目而不是行号来定位 markdown 中的一条指令:
openclaw path resolve 'oc://AGENTS.md/runtime-safety/openclaw-gateway'
在 CI 或预检脚本中于脚本读写之前验证路径:
openclaw path validate 'oc://AGENTS.md/tools/$last/risk'
这些命令都设计成可以直接复制到 shell 脚本中。调用方需要结构化输出时使用 --json,当人类在检查结果时使用 --human

工作原理

openclaw path 做四件事:
  1. oc:// 地址解析为槽位:文件、章节、项目、字段,以及可选会话。
  2. 从目标扩展名(.md.jsonc.jsonl 及相关别名)中选择对应的文件类型适配器。
  3. 将槽位映射到该文件类型的 AST:markdown 标题/项目、JSONC 对象键/数组索引,或 JSONL 行记录。
  4. 对于 set,通过同一个适配器输出编辑后的字节,因此文件中未触及的部分在该类型支持的情况下可保留其注释、换行符和附近格式。
resolveset 要求一个具体目标。find 是探索性动词:它会把通配符、并集、谓词和序数展开为具体匹配,供你在决定写入哪一个之前检查。

子命令

子命令目的
resolve <oc-path>打印路径处的具体匹配(或“未找到”)。
find <pattern>枚举通配符 / 并集 / 谓词路径的匹配项。
set <oc-path> <value>在具体路径上写入一个叶子或插入目标。支持 --dry-run
validate <oc-path>仅解析;打印结构分解(文件 / 章节 / 项目 / 字段)。
emit <file>通过 parseXxx + emitXxx 对文件进行往返(字节保真诊断)。

全局标志

标志目的
--cwd <dir>以该目录解析文件槽位(默认:process.cwd())。
--file <path>覆盖文件槽位解析后的路径(绝对访问)。
--json强制 JSON 输出(当 stdout 不是 TTY 时默认启用)。
--human强制人类可读输出(当 stdout 是 TTY 时默认启用)。
--dry-run(仅用于 set)打印将要写入但不会实际写入的字节。

oc:// 语法

oc://FILE/SECTION/ITEM/FIELD?session=SCOPE
槽位规则:field 需要 item,而 item 需要 section。在这四个槽位中:
  • 带引号的片段"a/b.c" 可穿过 /. 分隔符。 内容按字节字面量处理;引号内不允许出现 "\。 文件槽位也支持引号:oc://"skills/email-drafter"/Tools/$last 会将 skills/email-drafter 视为单个文件路径。
  • 谓词[k=v][k!=v][k<v][k<=v][k>v][k>=v]。数值运算要求两侧都可转换为有限数字。
  • 并集{a,b,c} 匹配任一候选项。
  • 通配符*(单个子段)和 **(零个或多个, 递归)。find 接受这些;resolveset 会因其含糊而拒绝它们。
  • 位置$last 解析为最后一个索引 / 最后声明的键。
  • 序数#N 表示按文档顺序的第 N 个匹配。
  • 插入标记++key+nnn 用于键 / 索引 插入(配合 set 使用)。
  • 会话作用域?session=cron-daily 等。与槽位 嵌套正交。会话值是原始值,不进行百分号解码;它们不能包含 控制字符或保留查询分隔符(?&%)。
保留字符(?&%)在带引号、谓词或并集 片段之外会被拒绝。控制字符(U+0000-U+001F、U+007F)在任何地方都会被拒绝, 包括 session 查询值。 formatOcPath(parseOcPath(path)) === path 对规范路径是有保证的。 非规范查询参数会被忽略,除了第一个非空的 session= 值。

按文件类型寻址

KindAddressing model
Markdown通过 slug 定位 H2 章节,通过 slug 或 #N 定位项目符号,frontmatter 通过 [frontmatter]
JSONC/JSON对象键和数组索引;除非加引号,否则点号会拆分嵌套子段。
JSONL顶层行地址(L1L2$last),然后在该行内按 JSONC 风格深入。
resolve 返回结构化匹配:rootnodeleafinsertion-point,并带有从 1 开始的行号。叶子值会以文本形式呈现,并附带 leafType,这样插件作者就可以在不依赖各类型 AST 形态的情况下渲染预览。

变更约定

set 会写入一个具体目标:
  • Markdown frontmatter 值和 - key: value 项目字段是字符串叶子。 Markdown 插入会追加章节、frontmatter 键或章节项目,并为变更后的文件呈现规范化 markdown 形态。
  • JSONC 叶子写入会将字符串值强制转换为现有叶子类型 (string、有限 numbertrue/falsenull)。JSONC 对象和数组 插入会将 <value> 解析为 JSON,并对普通叶子写入使用 jsonc-parser 的编辑路径, 从而保留注释和附近格式。
  • JSONL 叶子写入在行内的强制转换方式与 JSONC 相同。整行替换和 追加会将 <value> 解析为 JSON。渲染后的 JSONL 会保留文件的主导 LF/CRLF 行尾约定。
在面向用户的写入前,如精确字节很重要,请先使用 --dry-run。该 基底在 parse/emit 往返中保持字节完全一致的输出,但一次变更可能会根据类型对编辑区域或整个文件进行规范化。

示例

# 验证路径(不访问文件系统)
openclaw path validate 'oc://AGENTS.md/Tools/$last/risk'

# 读取叶子节点
openclaw path resolve 'oc://gateway.jsonc/version'

# 通配符搜索
openclaw path find 'oc://session.jsonl/*/event' --file ./logs/session.jsonl

# 试运行写入
openclaw path set 'oc://gateway.jsonc/version' '2.0' --dry-run

# 应用写入
openclaw path set 'oc://gateway.jsonc/version' '2.0'

# 字节级一致性往返(诊断)
openclaw path emit ./AGENTS.md
更多语法示例:
# 对包含 / 或 . 的键使用引号
openclaw path resolve 'oc://config.jsonc/agents.defaults.models/"anthropic/claude-opus-4-7"/alias'

# 在 JSONC 子项上进行谓词搜索
openclaw path find 'oc://config.jsonc/plugins/[enabled=true]/id'

# 插入到 JSONC 数组中
openclaw path set 'oc://config.jsonc/items/+1' '{"id":"new","enabled":true}' --dry-run

# 插入一个 JSONC 对象键
openclaw path set 'oc://config.jsonc/plugins/+github' '{"enabled":true}' --dry-run

# 追加一个 JSONL 事件
openclaw path set 'oc://session.jsonl/+' '{"event":"checkpoint","ok":true}' --file ./logs/session.jsonl

# 解析最后一个 JSONL 值行
openclaw path resolve 'oc://session.jsonl/$last/event' --file ./logs/session.jsonl

# 定位 markdown frontmatter
openclaw path resolve 'oc://AGENTS.md/[frontmatter]/name'

# 插入 markdown frontmatter
openclaw path set 'oc://AGENTS.md/[frontmatter]/+description' 'Agent instructions' --dry-run

# 查找 markdown 项目字段
openclaw path find 'oc://SKILL.md/Tools/*/send_email'

# 验证带会话作用域的路径
openclaw path validate 'oc://AGENTS.md/Tools/$last/risk?session=cron-daily'

按文件类型分类的配方

同样的五个动词适用于所有类型;寻址方案会根据文件扩展名进行分发。下面的示例使用 PR 描述中的固定测试数据。

Markdown

<!-- frontmatter.md -->
---
name: drafter
description: 邮件撰写代理
tier: core
---
## Tools
- gh: GitHub CLI
- curl: HTTP 客户端
- send_email: 已启用
$ openclaw path resolve 'oc://x.md/[frontmatter]/tier' --file frontmatter.md --human
leaf @ L4: "core" (string)

$ openclaw path resolve 'oc://x.md/tools/gh/gh' --file frontmatter.md --human
leaf @ L9: "GitHub CLI" (string)

$ openclaw path find 'oc://x.md/tools/*' --file frontmatter.md --human
3 matches for oc://x.md/tools/*:
  oc://x.md/tools/gh  node @ L9 [md-item]
  oc://x.md/tools/curl  node @ L10 [md-item]
  oc://x.md/tools/send-email  node @ L11 [md-item]
[frontmatter] 谓词用于定位 YAML frontmatter 块;tools 通过 slug 匹配 ## Tools 标题,而条目叶子节点即使源文本使用下划线(send_emailsend-email),也会保持其 slug 形式。

JSONC

// config.jsonc
{
  "plugins": {
    "github": {"enabled": true, "role": "vcs"},
    "slack":  {"enabled": false, "role": "chat"}
  }
}
$ openclaw path resolve 'oc://config.jsonc/plugins/github/enabled' --file config.jsonc --human
leaf @ L4: "true" (boolean)

$ openclaw path set 'oc://config.jsonc/plugins/slack/enabled' 'true' --file config.jsonc --dry-run
--dry-run: would write 142 bytes to /…/config.jsonc
{
  "plugins": {
    "github": {"enabled": true, "role": "vcs"},
    "slack":  {"enabled": true, "role": "chat"}
  }
}
JSONC 编辑会通过 jsonc-parser 处理,因此注释和空白会在 set 之后保留。先使用 --dry-run 运行,以便在提交前检查字节内容。

JSONL

{"event":"start","userId":"u1","ts":1}
{"event":"action","userId":"u1","ts":2}
{"event":"end","userId":"u1","ts":3}
$ openclaw path find 'oc://session.jsonl/[event=action]/userId' --file session.jsonl --human
1 match for oc://session.jsonl/[event=action]/userId:
  oc://session.jsonl/L2/userId  leaf @ L2: "u1" (string)

$ openclaw path resolve 'oc://session.jsonl/L2/ts' --file session.jsonl --human
leaf @ L2: "2" (number)
每一行都是一条记录。当你不知道行号时,可以通过谓词([event=action])进行寻址;当你知道行号时,则可以通过规范化的 LN 段进行寻址。

子命令参考

resolve <oc-path>

读取单个叶子或节点。不接受通配符——这些请使用 find。匹配成功时退出码为 0,干净地未命中时为 1,解析错误或拒绝的模式为 2
openclaw path resolve 'oc://AGENTS.md/tools/gh/risk' --human
openclaw path resolve 'oc://gateway.jsonc/server/port' --json

find <pattern>

枚举通配符 / 谓词 / 联合模式的每一个匹配项。至少有一个匹配项时退出码为 0,零个匹配项时为 1。文件槽位的通配符会被拒绝,并返回 OC_PATH_FILE_WILDCARD_UNSUPPORTED——请传入一个具体文件(多文件 glob 是后续特性)。
openclaw path find 'oc://AGENTS.md/tools/**/risk'
openclaw path find 'oc://session.jsonl/[event=action]/userId'
openclaw path find 'oc://config.jsonc/plugins/{github,slack}/enabled'

set <oc-path> <value>

写入一个叶子。可配合 --dry-run 预览将要写入的字节,而不实际触碰文件。成功写入时退出码为 0,若底层基础设施拒绝(例如触发了哨兵保护)则为 1,解析错误则为 2
openclaw path set 'oc://gateway.jsonc/version' '2.0' --dry-run
openclaw path set 'oc://gateway.jsonc/version' '2.0'
openclaw path set 'oc://AGENTS.md/Tools/+gh/risk' 'low'
+key 插入标记会在目标子节点不存在时创建该命名子节点;+nnn 和裸 + 分别用于索引插入和追加插入。

validate <oc-path>

仅解析检查。不访问文件系统。在你想在替换变量之前确认模板路径格式正确,或者想获取结构拆解用于调试时很有用:
$ openclaw path validate 'oc://AGENTS.md/tools/gh' --human
valid: oc://AGENTS.md/tools/gh
  file:    AGENTS.md
  section: tools
  item:    gh
当有效时退出码为 0,无效时为 1(带结构化的 codemessage),参数错误时为 2

emit <file>

通过各文件类型对应的解析器和发射器对文件进行往返处理。对一个正确的文件,输出应与输入字节级完全一致——任何差异都表明解析器有 bug 或触发了哨兵。对于调试真实世界输入上的底层行为很有用。
openclaw path emit ./AGENTS.md
openclaw path emit ./gateway.jsonc --json

退出码

代码含义
0成功。(resolve / find:至少有一个匹配项。set:写入成功。)
1无匹配项,或 set 被基础设施拒绝(非系统级错误)。
2参数或解析错误。

输出模式

openclaw path 会感知 TTY:在终端上输出人类可读内容,在 stdout 被管道传递或重定向时输出 JSON。--json--human 会覆盖自动检测。

说明

  • set 通过底层的 emit 路径写入字节,该路径会自动应用重定向哨兵保护。任何携带 __OPENCLAW_REDACTED__(字面量或其子串)的叶子都会在写入时被拒绝。
  • JSONC 解析和叶子编辑使用插件本地的 jsonc-parser 依赖,因此在普通叶子写入时会保留注释和格式,而不是经过手写的解析/重渲染路径。
  • path 不了解 LKG。如果文件受 LKG 跟踪,那么下一次 observe 调用才决定是否进行 promote / recover。用于通过 LKG promote/recover 生命周期进行原子多重 set 的 set --batch 已与 LKG-recovery 底层机制一并规划中。

相关