openclaw path
Предоставляемый Plugin доступ из оболочки к основе адресации oc://: единая
схема путей с диспетчеризацией по типу для проверки и редактирования адресуемых
файлов рабочей области (markdown, jsonc, jsonl, yaml/yml/lobster). Пользователи
с самостоятельным хостингом, авторы Plugin и расширения редакторов используют
ее, чтобы читать, находить или обновлять узкую область без написания отдельных
парсеров для каждого типа файлов.
CLI отражает публичные глаголы основы:
resolveконкретен и возвращает одно совпадение.find— глагол для множественных совпадений по подстановкам, объединениям, предикатам и позиционному разворачиванию.setпринимает только конкретные пути или маркеры вставки; шаблоны с подстановками отклоняются до записи.
path предоставляется встроенным опциональным Plugin oc-path. Включите его
перед первым использованием:
Зачем это использовать
Состояние OpenClaw распределено по редактируемым человеком markdown-файлам, конфигурации JSONC с комментариями, журналам JSONL только для добавления и YAML файлам рабочих процессов/спецификаций. Скриптам оболочки, хукам и агентам часто нужно одно небольшое значение из этих файлов: ключ frontmatter, настройка Plugin, поле записи журнала, шаг YAML или пункт списка под именованным разделом.openclaw path дает таким вызывающим сторонам стабильный адрес вместо
одноразового grep, регулярного выражения или парсера для каждого типа файла.
Один и тот же путь oc:// можно валидировать, разрешать, искать, выполнять в
пробном режиме и записывать из терминала, что упрощает проверку узкой
автоматизации и делает ее безопаснее для повторного запуска. Это особенно
полезно, когда нужно обновить один лист, сохранив остальные комментарии файла,
переводы строк и окружающее форматирование.
Используйте это, когда нужный объект имеет логический адрес, но физическая
форма файла различается:
- Хук хочет прочитать одну настройку из JSONC с комментариями, не теряя комментарии при обратной записи значения.
- Скрипт обслуживания хочет найти каждое совпадающее поле события в журнале JSONL, не загружая весь журнал в пользовательский парсер.
- Расширение редактора хочет перейти к разделу markdown или пункту списка по slug, а затем отобразить точную строку, к которой был разрешен путь.
- Агент хочет пробно выполнить небольшое редактирование рабочей области перед применением, чтобы измененные байты были видны при ревью.
openclaw path для обычного редактирования всего файла,
сложных миграций конфигурации или записей, специфичных для памяти. Для этого
следует использовать команду или Plugin владельца. path предназначен для
небольших адресуемых операций с файлами, где повторяемая терминальная команда
понятнее, чем еще один специальный парсер.
Как это используется
Прочитать одно значение из редактируемого человеком файла конфигурации:--json,
когда вызывающей стороне нужен структурированный вывод, и --human, когда
результат просматривает человек.
Как это работает
openclaw path делает четыре вещи:
- Разбирает адрес
oc://на слоты: файл, раздел, элемент, поле и опциональную сессию. - Выбирает адаптер типа файла по целевому расширению (
.md,.jsonc,.jsonl,.yaml,.yml,.lobsterи связанные псевдонимы). - Разрешает слоты относительно AST этого типа файла: заголовки/элементы markdown, ключи объектов/индексы массивов JSONC, построчные записи JSONL или узлы map/sequence YAML.
- Для
setвыводит отредактированные байты через тот же адаптер, чтобы нетронутые части файла сохраняли комментарии, переводы строк и близкое форматирование там, где тип это поддерживает.
resolve и set требуют одну конкретную цель. 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) вывести байты, которые были бы записаны, без записи. |
--diff | (с set --dry-run) вывести unified diff вместо полных байтов. |
Синтаксис oc://
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принимает их;resolveиsetотклоняют их как неоднозначные. - Позиционные указатели —
$first/$lastразрешаются в первый / последний индекс или объявленный ключ. - Порядковый указатель —
#Nдля N-го совпадения в порядке документа. - Маркеры вставки —
+,+key,+nnnдля вставки по ключу / индексу (используйте сset). - Область сессии —
?session=cron-dailyи т. п. Ортогональна вложенности слотов. Значения сессии являются сырыми, не percent-decoded; они не могут содержать управляющие символы или зарезервированные разделители запроса (?,&,%).
?, &, %) вне сегментов в кавычках,
предикатов или объединений отклоняются. Управляющие символы
(U+0000-U+001F, U+007F) отклоняются везде, включая значение запроса session.
formatOcPath(parseOcPath(path)) === path гарантируется для канонических
путей. Неканонические параметры запроса игнорируются, кроме первого
непустого значения session=.
Адресация по типу файла
| Тип | Модель адресации |
|---|---|
| Markdown | Разделы H2 по slug, пункты списка по slug или #N, frontmatter через [frontmatter]. |
| JSONC/JSON | Ключи объектов и индексы массивов; точки разделяют вложенные подсегменты, если они не в кавычках. |
| JSONL | Верхнеуровневые адреса строк (L1, L2, $first, $last), затем спуск в стиле JSONC внутри строки. |
| YAML/YML/.lobster | Ключи map и индексы sequence; комментарии и flow style обрабатываются API документа YAML. |
resolve возвращает структурированное совпадение: root, node, leaf или
insertion-point, с номером строки, начинающимся с 1. Значения листьев
выводятся как текст плюс leafType, чтобы авторы Plugin могли отображать
предпросмотры без зависимости от формы AST конкретного типа.
Контракт мутации
set записывает одну конкретную цель:
- Значения frontmatter markdown и поля элементов
- key: valueявляются строковыми листьями. Вставки markdown добавляют разделы, ключи frontmatter или элементы раздела и отрисовывают каноническую форму markdown для измененного файла. - Записи листьев JSONC приводят строковое значение к существующему типу листа
(
string, конечныйnumber,true/falseилиnull). Используйте--value-json, когда замена листа JSONC/JSON/JSONL должна разобрать<value>как JSON и может изменить форму, например при замене строкового сокращения SecretRef объектом. Вставки объектов и массивов JSONC разбирают<value>как JSON и используют путь редактированияjsonc-parserдля обычных записей листьев, сохраняя комментарии и близкое форматирование. - Записи листьев JSONL приводятся как JSONC внутри строки. Замена всей строки и
добавление разбирают
<value>как JSON. Отрисованный JSONL сохраняет преобладающее в файле соглашение о переводах строк LF/CRLF. - Записи листьев YAML приводятся к существующему скалярному типу (
string, конечныйnumber,true/falseилиnull). Вставки YAML используют API документа встроенного пакетаyamlдля обновлений map/sequence. Некорректные YAML-документы с ошибками парсера отклоняются перед мутацией сparse-error.
--dry-run перед видимыми пользователю записями, когда точные
байты имеют значение. Основа сохраняет побайтно идентичный вывод для циклов
parse/emit, но мутация может канонизировать отредактированную область или файл
в зависимости от типа. Добавьте --diff, когда нужен предпросмотр в виде
сфокусированного патча до/после вместо полного отрисованного файла.
Примеры
Рецепты по типам файлов
Одни и те же пять команд работают для всех типов; схема адресации выбирает обработчик по расширению файла. Примеры ниже используют фикстуры из описания PR.Markdown
[frontmatter] адресует блок YAML frontmatter; tools
сопоставляется с заголовком ## Tools через slug, а листья элементов сохраняют свою форму slug,
даже когда в источнике используются подчёркивания (send_email → send-email).
JSONC
jsonc-parser, поэтому комментарии и пробелы сохраняются после
set. Сначала запускайте с --dry-run, чтобы проверить байты перед записью.
JSONL
[event=action]), когда
номер строки неизвестен, или по каноническому сегменту LN, когда он известен.
YAML
Document пакета yaml, а не самописный парсер,
поэтому обычные циклы parse/emit сохраняют комментарии и авторскую структуру, а
разрешённые пути используют ту же модель ключей map / индексов sequence, что и JSONC. Тот же
адаптер обрабатывает файлы .yaml, .yml и .lobster.
Справочник подкоманд
resolve <oc-path>
Читает один leaf или node. Wildcard запрещены — используйте для них find.
Завершается с 0 при совпадении, с 1 при корректном отсутствии совпадения, с 2 при ошибке разбора или отклонённом
паттерне.
find <pattern>
Перечисляет каждое совпадение для шаблона с подстановочными символами / предикатом / объединением. Завершается с кодом 0
при наличии хотя бы одного совпадения, с 1 при их отсутствии. Подстановочные символы слота файла отклоняются с
OC_PATH_FILE_WILDCARD_UNSUPPORTED — передайте конкретный файл (globbing по нескольким файлам
планируется как последующая функция).
set <oc-path> <value>
Записывает конечный узел. Используйте вместе с --dry-run, чтобы предварительно просмотреть байты, которые были бы
записаны, не изменяя файл. Добавьте --diff для предварительного просмотра unified diff.
Завершается с кодом 0 при успешной записи, с 1, если субстрат отказывает (например, при
срабатывании sentinel guard), с 2 при ошибках разбора.
+key создает именованный дочерний элемент, если он еще не
существует; +nnn и одиночный + работают для индексированной вставки и вставки в конец соответственно.
validate <oc-path>
Проверка только разбора. Без доступа к файловой системе. Полезно, когда нужно подтвердить, что
путь шаблона имеет корректную форму перед подстановкой переменных, или когда нужна
структурная разбивка для отладки:
0, если путь действителен, с 1, если недействителен (со структурированными code и
message), с 2 при ошибках аргументов.
emit <file>
Пропускает файл через parser и emitter для соответствующего типа туда и обратно. Вывод должен
быть побайтно идентичен вводу для корректного файла — расхождение указывает на
ошибку parser или срабатывание sentinel. Полезно для отладки поведения субстрата на
реальных входных данных.
Коды выхода
| Код | Значение |
|---|---|
0 | Успех. (resolve / find: хотя бы одно совпадение. set: запись выполнена.) |
1 | Нет совпадений, или set отклонен субстратом (без ошибки системного уровня). |
2 | Ошибка аргумента или разбора. |
Режим вывода
openclaw path учитывает TTY: удобочитаемый вывод в терминале, JSON, когда
stdout передается по pipe или перенаправляется. --json и --human переопределяют
автоопределение.
Примечания
setзаписывает байты через emit-путь субстрата, который автоматически применяет redaction-sentinel guard. Конечный узел, содержащий__OPENCLAW_REDACTED__(дословно или как подстроку), отклоняется во время записи.- Разбор JSONC и правки конечных узлов используют Plugin-локальную зависимость
jsonc-parser, поэтому комментарии и форматирование сохраняются при обычных записях конечных узлов вместо прохождения через самописный parser/re-render путь. pathне знает о LKG. Если файл отслеживается LKG, следующий вызов observe решает, выполнять ли promote / recover.set --batchдля атомарного multi-set через жизненный цикл promote/recover LKG планируется вместе с субстратом LKG-recovery.