Files
openclaw/docs/cli/claws.md
T
Gio Della-Libera a3094582ff feat(claws): export reviewed native bootstrap (#115371)
* feat(claws): export reviewed native bootstrap

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 3cdcdb00-ade8-4e61-85a7-8151b35f216a

* fix(claws): fail export when the package bootstrap drifted

Export re-emitted BOOTSTRAP.md only while the seeded copy was still pending, so
an agent whose bootstrap had been edited, flagged unsafe, or become unreadable
exported a package with no bootstrap at all. That is the same class of silent
loss the managed workspace files already guard against, so treat it the same
way: drifted bootstrap state now fails with `bootstrap_drifted` unless the
author supplies a reviewed `--bootstrap` replacement. A consumed bootstrap
stays a completed lifecycle state and still exports without BOOTSTRAP.md.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 3cdcdb00-ade8-4e61-85a7-8151b35f216a

* fix(claws): bind pending bootstrap export bytes

* fix(claws): preserve current export ownership limits

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 3cdcdb00-ade8-4e61-85a7-8151b35f216a
2026-08-08 12:32:26 -07:00

17 KiB

summary, read_when, title
summary read_when title
Create, add, update, and remove experimental Claw agent packages
You are authoring or validating a CLAW.md manifest
You want to preview or add one agent from a Claw
You need to inspect Claw ownership, drift, or cleanup behavior
Claws

openclaw claws

A Claw is a versioned setup for one new OpenClaw agent. It can describe the agent's portable identity, workspace files, skills, plugins, MCP servers, and cron jobs. Harness-specific agent settings may be carried in a conventional package profile. A Claw does not replace or modify an existing agent.

Claws are experimental. Their schema, command output, and lifecycle may change. Enable the command surface explicitly:

export OPENCLAW_EXPERIMENTAL_CLAWS=1

The current CLI reads a local package directory, CLAW.md, or grouped JSON manifest. Publishing, searching, and installing whole Claws through ClawHub are a separate registry track and are not part of this command surface yet.

Create a Claw package

A package contains package.json, a CLAW.md manifest, and any conventional profiles, bootstrap instructions, or portable assets used by that manifest:

{
  "name": "@acme/incident-triage-claw",
  "version": "1.0.0",
  "type": "module",
  "openclaw": { "claw": "CLAW.md" }
}

CLAW.md starts with YAML frontmatter. A non-empty Markdown body is the portable agent prompt. OpenClaw applies it as the Claw-managed SOUL.md for the new agent:

---
schemaVersion: 1
agent:
  id: incident-triage
  name: Incident triage
workspace:
  bootstrapFiles: {}
packages: []
mcpServers: {}
cronJobs: []
---

# Incident triage

You review incoming incidents, identify severity and ownership, and leave a
concise handoff with evidence.

OpenClaw automatically discovers the optional profiles/openclaw.yml file. No manifest pointer is required. Other harnesses may discover their own conventional profile, such as profiles/codex.yml, without changing the portable manifest.

The older metadata.openclaw.config pointer is deprecated but still read, so packages published against it keep working. Reading one reports a deprecated_openclaw_profile_pointer warning; move that file to profiles/openclaw.yml and remove the metadata entry. A pointer that is not a package-relative .yml/.yaml path is rejected, and a pointer that references a different file while profiles/openclaw.yml also exists is rejected as a conflict.

schemaVersion: 1
agent:
  tools:
    profile: coding
    alsoAllow: [cron]
    deny: [exec]
    fs:
      workspaceOnly: true
  memory:
    search:
      enabled: true
      rememberAcrossConversations: true
      sources: [memory, sessions]

This profile exists only inside the Claw package. OpenClaw validates and uses it while inspecting, adding, updating, and exporting that Claw; it is not copied to the user's normal OpenClaw configuration path. Other harnesses consume the portable manifest and interpret only their own conventional profile.

The same strict version 1 schema continues to accept grouped JSON manifests. Grouped JSON discovers the same conventional profile rather than embedding a second copy of the OpenClaw settings. The remaining schema fragments on this page use JSON, with equivalent keys available in CLAW.md frontmatter.

The OpenClaw package profile may select any built-in tool profile registered by the running OpenClaw version, then refine it with alsoAllow, deny, and tools.fs.workspaceOnly: true. A Claw cannot set that field to false and weaken host filesystem confinement. tools.allow remains available as an explicit allowlist but cannot be combined with alsoAllow. A Claw may also set memory.search.enabled, choose the portable memory and sessions sources, and opt into cross-conversation memory with rememberAcrossConversations. Declaring the sessions source requires that opt-in. Host policy still constrains these settings, and Claws do not carry custom profile definitions, providers, credentials, bindings, or local memory paths. The conventional profile is limited to 256 KiB, must be JSON-compatible YAML, may not use aliases, anchors, tags, or merge keys, and must be a regular, non-symlinked, non-hardlinked file inside the package.

An OpenClaw profile may also declare harness-specific extension requirements:

schemaVersion: 1
agent: {}
extensions:
  - id: incident-tools
    kind: plugin
    format: claude
    source: clawhub
    ref: "@acme/incident-tools"
    version: 2.0.0

format asserts the artifact format that OpenClaw must detect (openclaw, claude, codex, or cursor). The canonical plugin preflight resolves the exact artifact and reports which components the current OpenClaw adapter maps and which remain unavailable. Missing identity, integrity, format detection, or adapter identity blocks apply. Extension-backed plugins use the existing plugin installer and ownership model; they are shared host requirements, not Claw-owned members or a second package system.

OpenClaw ignores foreign harness profiles during apply. Package integrity still covers every published package byte, while a development snapshot binds the portable manifest, bootstrap and workspace sources, and the selected OpenClaw profile. Status and doctor report adapter mapping drift or unavailable inspection. Export writes extension-backed plugins to profiles/openclaw.yml and does not duplicate them in the portable packages list.

Package and workspace paths must remain inside the package root. Manifests are limited to 1 MiB, package metadata to 256 KiB, and workspace sources enforce separate per-file and aggregate limits. Workspace sources also reject symlinked parents.

The CLAW.md body is the preferred portable source for SOUL.md; do not also declare a SOUL.md sidecar when the body is non-empty. Other bootstrap files use named entries, while additional files use package-relative sources and workspace-relative targets:

{
  "workspace": {
    "bootstrapFiles": {
      "AGENTS.md": { "source": "workspace/AGENTS.md" }
    },
    "files": [
      {
        "source": "workspace/reference/policy.md",
        "path": "reference/policy.md"
      }
    ]
  }
}

Additional files are the portable asset mechanism. Authors may organize package sources under directories such as assets/, schemas/, templates/, and examples/, then map them into the new agent workspace with workspace.files. Apply records those destinations as managed files; update reconciles unchanged managed assets, and remove preserves modified or user-owned files.

An optional package-root BOOTSTRAP.md supplies conversational first-run instructions. OpenClaw seeds it into the new agent workspace and records progress through the native workspace bootstrap state. Once the agent consumes or removes it, Claw update does not recreate it. Root BOOTSTRAP.md therefore cannot also be declared through workspace.files. Claw removal deletes an unchanged, still-pending package bootstrap after verifying its recorded digest; it preserves edited bootstrap content and files created during onboarding.

Skills and plugins use exact ClawHub versions:

{
  "packages": [
    {
      "kind": "skill",
      "source": "clawhub",
      "ref": "incident-triage",
      "version": "1.0.0"
    },
    {
      "kind": "plugin",
      "source": "clawhub",
      "ref": "@acme/audit-plugin",
      "version": "2.0.0"
    }
  ]
}

The dry run uses the existing skill and plugin preflight paths to resolve the exact artifact, integrity, and any ClawHub trust warning before consent. The warning remains visible in the integrity-bound plan. Each requirement is shown as satisfied, missing-installable, conflicting, or setup-required. The exact plan consent approves missing installs; OpenClaw completes those canonical plugin actions before creating the agent or workspace. Apply reuses matching artifacts and records whether the Claw introduced or referenced each resource. Plugins remain process-wide OpenClaw capabilities rather than per-agent installations.

Cron jobs declare scheduled work for the new agent:

{
  "cronJobs": [
    {
      "id": "daily-summary",
      "name": "Daily incident summary",
      "schedule": { "cron": "0 9 * * *", "timezone": "UTC" },
      "session": "isolated",
      "message": "Summarize active incidents."
    }
  ]
}

Claws use the existing Gateway scheduler and bind created jobs to the new agent. Preview, provenance, status, and removal cover those jobs without changing the behavior of ordinary cron commands. Removal rereads the live job through the Gateway and preserves it when its owned definition changed after planning.

MCP declarations use the existing mcp.servers configuration model:

{
  "mcpServers": {
    "statuspage": {
      "command": "npx",
      "args": ["--yes", "@acme/statuspage-mcp@1.0.0"],
      "env": { "STATUSPAGE_TOKEN": "${STATUSPAGE_TOKEN}" }
    }
  }
}

Environment references remain references; Claws do not embed resolved secret values. A collision-free declaration becomes managed, while an exact existing or shared declaration is referenced. Preview, provenance, status, export, and removal follow the same ownership policy as other Claw resources.

Inspect and preview

Validate the source without planning local changes. For OpenClaw profile extensions, inspect also performs the canonical read-only artifact probe and reports mapped and unavailable components:

openclaw claws inspect ./incident-triage.claw.json

Preview all proposed lifecycle actions:

openclaw claws add ./incident-triage.claw.json --dry-run --json

The plan reports the derived agent and workspace, every proposed action, prerequisites, blockers, distinct capability escalations, and a planIntegrity digest. Capability records show the exact package, MCP, scheduled-work, sandbox, tool, or heartbeat effect. Review the plan before creating the agent:

openclaw claws add ./incident-triage.claw.json \
  --yes \
  --plan-integrity <SHA256_FROM_DRY_RUN>

--yes alone is insufficient. OpenClaw rebuilds the plan and rejects consent when the source, destination, or live configuration changed after preview. Use --agent-id or --workspace during both preview and apply when package defaults collide with local state. For disposable profiles and parallel validation, pass an explicit --workspace; OPENCLAW_STATE_DIR relocates runtime state but does not change the default workspace location.

Adding a Claw first realizes consented shared plugin requirements, then creates the new agent and workspace configuration, seeds optional first-run instructions, writes declared workspace assets, realizes workspace skills, and records package, MCP, and cron provenance. Existing files are not overwritten, and retries fail closed when owned content drifted.

Inspect installed state

openclaw claws status
openclaw claws status incident-triage --json
openclaw doctor

status compares the installed agent and its recorded workspace, package, MCP, and cron provenance with current state. It also reports whether native first-run bootstrap remains pending. It reports incomplete installs, missing resources, and drift without changing local state. openclaw doctor adds Claw-specific diagnostics for incomplete ownership records, unsafe managed files, and cron jobs that cannot be corroborated with live Gateway inventory.

Claw provenance distinguishes two relationships:

  • Managed: the Claw introduced and currently manages the resource. It is a cleanup candidate when unchanged and no conflicting owner remains.
  • Referenced: the resource existed independently or is shared. Removal releases this Claw's reference and retains the resource by default.

This is not a reference count. Ordinary plugin, skill, and agent commands keep their existing behavior; Claws add provenance and guarded lifecycle operations on top.

Update an installed Claw

By default, update uses the source recorded when the Claw was added. Use --from when that source moved or when testing another package directory:

openclaw claws update incident-triage --dry-run --json
openclaw claws update incident-triage \
  --from ./incident-triage-next \
  --dry-run --json

The plan compares current provenance and live state with the target manifest. It reports agent, workspace, package, MCP, cron, and ownership changes, including capability escalations and blockers. Capability escalations have separate machine-readable records and ! lines with exact redacted effects in human output. Resolved package integrity, install identity, trust warnings, and remaining local setup prerequisites are included. Removing a package declaration releases this Claw's edge without uninstalling the artifact during update. The eventual exact planIntegrity confirmation binds that disclosed set as well as ordinary content changes. Hosts may use the same records for a separate dialog or an aggregate multi-agent review. Apply the exact reviewed plan with explicit consent:

openclaw claws update incident-triage \
  --yes \
  --plan-integrity <SHA256_FROM_DRY_RUN>

OpenClaw rebuilds the plan and compare-and-swaps owned state before each mutation. Removed package declarations release dependency edges without uninstalling artifacts. Cron changes reread the live scheduler definition and stop on operator drift. Package installers, source-config writers, and the Gateway scheduler are not one transaction. If compensation cannot be proven after an external mutation, OpenClaw reports error code update_partial with structured status: partial, preserves uncertain provenance, and stops. Inspect claws status, the affected resource, and openclaw doctor; then preview again before retrying or removing anything.

Remove an installed Claw

Preview removal before selecting cleanup:

openclaw claws remove incident-triage --dry-run --json
openclaw claws remove incident-triage \
  --yes \
  --plan-integrity <SHA256_FROM_DRY_RUN>

The default removes eligible managed state and releases referenced state. Modified files and resources with another current owner are retained or blocked. Cleanup choices are part of the plan digest; --yes never broadens them. Globally installed plugins are retained while this Claw's reference is released. Removal reports which retained requirements Claw add introduced; use the ordinary plugin lifecycle separately when you intend to uninstall a process-wide plugin.

To remove unchanged Claw-introduced references that have no other current owner, include --remove-unused in both preview and apply. To select exact referenced resources instead, repeat --remove-referenced:

openclaw claws remove incident-triage \
  --dry-run \
  --remove-referenced 'plugin:@acme/audit-plugin@2.0.0'

Use --force-referenced only after reviewing the displayed dependents, independent owners, and pre-existing origin. It allows selected cleanup despite those conflicts; it does not skip plan-integrity consent.

Export an installed agent

Export creates a new package directory and fails if the destination exists or managed state has drifted:

openclaw claws export incident-triage --out ./incident-triage-export --json

Use --bootstrap <path> to attach an explicitly reviewed Markdown file as the package-root BOOTSTRAP.md. Export re-emits an unchanged, still-pending package bootstrap automatically. A package bootstrap that drifted in the workspace (edited, unsafe, or unreadable) fails the export with bootstrap_drifted, the same way managed workspace files fail with workspace_files_drifted; pass --bootstrap <path> with a reviewed replacement to export anyway. A bootstrap the agent already consumed is a completed lifecycle state, so export omits BOOTSTRAP.md instead of failing. The exporter validates the completed package and removes the new output directory if validation fails. Bootstrap is package-authored prompt content: do not include credentials, tokens, private answers, or machine-specific paths. Export does not infer questions, render personal-data templates, persist answers, or add a separate setup lifecycle.

The result contains package.json, canonical CLAW.md, and managed workspace sidecars. Managed SOUL.md content is emitted as the CLAW.md body when it is non-empty UTF-8 and the combined document fits the manifest limit. Otherwise, export retains it as an explicit sidecar so the package remains importable. It is a portable Claw package, not a whole-instance backup: unrelated agents, credentials, sessions, and unowned local state are excluded.

Command reference

Command Purpose
claws inspect <source> Validate a package directory or grouped manifest.
claws add <source> Preview or create one new agent and workspace.
claws status [claw-or-agent] Report installed state, ownership, and drift.
claws update <claw-or-agent> Preview or apply changes from the selected source.
claws remove <claw-or-agent> Preview or remove the agent and eligible resources.
claws export <agent> --out <path> Create a portable package from an installed agent.

Use --json for experimental machine-readable output.

See also