


























@@ -9,11 +9,19 @@ title: "Path"
991010# `openclaw path`
111112-Plugin-provided shell access to the `oc://` addressing substrate — one universal,
13-kind-dispatched path scheme for inspecting and surgically editing workspace
14-files (markdown, jsonc, jsonl). Self-hosters and editor extensions use
15-it to read or write a single leaf inside a workspace file without scripting
16-against the SDK directly.
12+Plugin-provided shell access to the `oc://` addressing substrate: one
13+kind-dispatched path scheme for inspecting and editing addressable workspace
14+files (markdown, jsonc, jsonl). Self-hosters, plugin authors, and editor
15+extensions use it to read, find, or update a narrow location without
16+hand-rolling per-file parsers.
17+18+The CLI mirrors the substrate's public verbs:
19+20+- `resolve` is concrete and single-match.
21+- `find` is the multi-match verb for wildcards, unions, predicates, and
22+ positional expansion.
23+- `set` only accepts concrete paths or insertion markers; wildcard patterns are
24+ rejected before writing.
17251826`path` is provided by the bundled optional `oc-path` plugin. Enable it before
1927first use:
@@ -26,10 +34,10 @@ openclaw plugins enable oc-path
26342735| Subcommand | Purpose |
2836| ----------------------- | ---------------------------------------------------------------------------- |
29-| `resolve <oc-path>` | Print the match at the path (or "not found"). |
30-| `find <pattern>` | Enumerate matches for a wildcard / predicate path. |
31-| `set <oc-path> <value>` | Write a leaf at the path. Supports `--dry-run`. |
32-| `validate <oc-path>` | Parse-only — print structural breakdown (file / section / item / field). |
37+| `resolve <oc-path>` | Print the concrete match at the path (or "not found"). |
38+| `find <pattern>` | Enumerate matches for a wildcard / union / predicate path. |
39+| `set <oc-path> <value>` | Write a leaf or insertion target at a concrete path. Supports `--dry-run`. |
40+| `validate <oc-path>` | Parse-only; print structural breakdown (file / section / item / field). |
3341| `emit <file>` | Round-trip a file through `parseXxx` + `emitXxx` (byte-fidelity diagnostic). |
34423543## Global flags
@@ -48,7 +56,7 @@ openclaw plugins enable oc-path
4856oc://FILE/SECTION/ITEM/FIELD?session=SCOPE
4957```
505851-Slot rules — `field` requires `item`, `item` requires `section`. Across all
59+Slot rules: `field` requires `item`, and `item` requires `section`. Across all
5260four slots:
53615462- **Quoted segments** — `"a/b.c"` survives `/` and `.` separators.
@@ -65,12 +73,49 @@ four slots:
6573- **Ordinal** — `#N` for Nth match by document order.
6674- **Insertion markers** — `+`, `+key`, `+nnn` for keyed / indexed
6775 insertion (use with `set`).
68-- **Session scope** — `?session=cron:daily` etc. Orthogonal to slot
69- nesting.
76+- **Session scope** — `?session=cron-daily` etc. Orthogonal to slot
77+ nesting. Session values are raw, not percent-decoded; they may not contain
78+ control characters or reserved query delimiters (`?`, `&`, `%`).
70797180Reserved characters (`?`, `&`, `%`) outside quoted, predicate, or union
72-segments are rejected. Control characters (U+0000–U+001F, U+007F) are
73-rejected anywhere.
81+segments are rejected. Control characters (U+0000-U+001F, U+007F) are rejected
82+anywhere, including the `session` query value.
83+84+`formatOcPath(parseOcPath(path)) === path` is guaranteed for canonical paths.
85+Non-canonical query parameters are ignored except for the first non-empty
86+`session=` value.
87+88+## Addressing by file kind
89+90+| Kind | Addressing model |
91+| ---------- | -------------------------------------------------------------------------------- |
92+| Markdown | H2 sections by slug, bullet items by slug or `#N`, frontmatter via `[frontmatter]`. |
93+| JSONC/JSON | Object keys and array indexes; dots split nested sub-segments unless quoted. |
94+| JSONL | Top-level line addresses (`L1`, `L2`, `$last`), then JSONC-style descent inside the line. |
95+96+`resolve` returns a structured match: `root`, `node`, `leaf`, or
97+`insertion-point`, with a 1-based line number. Leaf values are surfaced as text
98+plus a `leafType` so plugin authors can render previews without depending on
99+the per-kind AST shape.
100+101+## Mutation contract
102+103+`set` writes one concrete target:
104+105+- Markdown frontmatter values and `- key: value` item fields are string leaves.
106+ Markdown insertions append sections, frontmatter keys, or section items and
107+ render a canonical markdown shape for the changed file.
108+- JSONC leaf writes coerce the string value to the existing leaf type
109+ (`string`, finite `number`, `true`/`false`, or `null`). JSONC object and array
110+ insertions parse `<value>` as JSON and use the `jsonc-parser` edit path for
111+ ordinary leaf writes, preserving comments and nearby formatting.
112+- JSONL leaf writes coerce like JSONC inside a line. Whole-line replacement and
113+ append parse `<value>` as JSON. Rendered JSONL preserves the file's dominant
114+ LF/CRLF line-ending convention.
115+116+Use `--dry-run` before user-visible writes when the exact bytes matter. The
117+substrate preserves byte-identical output for parse/emit round-trips, but a
118+mutation can canonicalize the edited region or file depending on kind.
7411975120## Examples
76121@@ -94,6 +139,40 @@ openclaw path set 'oc://gateway.jsonc/version' '2.0'
94139openclaw path emit ./AGENTS.md
95140```
96141142+More grammar examples:
143+144+```bash
145+# Quote keys containing / or .
146+openclaw path resolve 'oc://config.jsonc/agents.defaults.models/"anthropic/claude-opus-4-7"/alias'
147+148+# Predicate search over JSONC children
149+openclaw path find 'oc://config.jsonc/plugins/[enabled=true]/id'
150+151+# Insert into a JSONC array
152+openclaw path set 'oc://config.jsonc/items/+1' '{"id":"new","enabled":true}' --dry-run
153+154+# Insert a JSONC object key
155+openclaw path set 'oc://config.jsonc/plugins/+github' '{"enabled":true}' --dry-run
156+157+# Append a JSONL event
158+openclaw path set 'oc://session.jsonl/+' '{"event":"checkpoint","ok":true}' --file ./logs/session.jsonl
159+160+# Resolve the last JSONL value line
161+openclaw path resolve 'oc://session.jsonl/$last/event' --file ./logs/session.jsonl
162+163+# Address markdown frontmatter
164+openclaw path resolve 'oc://AGENTS.md/[frontmatter]/name'
165+166+# Insert markdown frontmatter
167+openclaw path set 'oc://AGENTS.md/[frontmatter]/+description' 'Agent instructions' --dry-run
168+169+# Find markdown item fields
170+openclaw path find 'oc://SKILL.md/Tools/*/send_email'
171+172+# Validate a session-scoped path
173+openclaw path validate 'oc://AGENTS.md/Tools/$last/risk?session=cron-daily'
174+```
175+97176## Exit codes
9817799178| Code | Meaning |
@@ -110,7 +189,7 @@ auto-detection.
110189111190## Notes
112191113-- `set` writes raw bytes through the substrate's emit path, which applies the
192+- `set` writes bytes through the substrate's emit path, which applies the
114193 redaction-sentinel guard automatically. A leaf carrying
115194`__OPENCLAW_REDACTED__` (verbatim or as a substring) is refused at write
116195 time.
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。