Skip to content

Agent Package Format

An agent package is the unit Clawstore distributes: store metadata, persona files, workspace content, dependency declarations, and setup requirements bundled together. It is never executable — every file is markdown, JSON, YAML, CSV, plain text, or an image.

A package is a directory tree with agent.json at the root. Everything else is freeform.

calorie-coach/
├── agent.json # Package manifest (required)
├── README.md # Store-facing description
├── app/
│ ├── AGENTS.md
│ ├── SOUL.md
│ ├── TOOLS.md
│ ├── IDENTITY.md
│ ├── USER.template.md # Write-once template
│ ├── knowledge/
│ │ ├── foods/
│ │ │ ├── fruits.md
│ │ │ └── restaurants.md
│ │ └── nutrition/
│ │ └── macros.md
│ └── data/
│ └── portion-sizes.json
└── store/
├── icon.png
└── screenshots/
├── chat.png
└── daily-log.png
{
"schemaVersion": 1,
"id": "@someone/calorie-coach",
"version": "0.3.1",
"name": "Calorie Coach",
"tagline": "Log meals by chat, get daily nutrition summaries",
"description": "...",
"category": "health-fitness",
"tags": ["nutrition", "tracking", "wellness"],
"author": { "name": "...", "url": "..." },
"license": "MIT",
"homepage": "https://...",
"repository": "https://github.com/...",
"agent": {
"defaults": {
"model": "openai/gpt-5.4",
"thinking": "low"
}
},
"files": ["app/**"],
"dependencies": {
"plugins": [
{ "spec": "clawhub:@someone/nutrition-api", "required": true, "minVersion": "1.2.0" },
{ "spec": "@someone/image-vision", "required": false }
],
"skills": [
{ "slug": "food-search", "required": false }
],
"providers": {
"any": ["anthropic", "openai"]
}
},
"setup": {
"secrets": [
{
"key": "NUTRITIONIX_API_KEY",
"prompt": "Nutritionix API key",
"required": true,
"target": "env"
}
]
},
"store": {
"icon": "store/icon.png",
"screenshots": ["store/screenshots/chat.png", "store/screenshots/daily-log.png"]
},
"openclaw": {
"entrypoints": {
"AGENTS.md": "app/AGENTS.md",
"SOUL.md": "app/SOUL.md",
"TOOLS.md": "app/TOOLS.md",
"IDENTITY.md": "app/IDENTITY.md"
},
"templates": {
"USER.md": "app/USER.template.md"
}
}
}
FieldTypeDescription
schemaVersionintManifest schema version. Currently 1.
idstringScoped package ID: @scope/name. Immutable after first publish.
versionstringSemVer. Must be strictly greater than any previously published version.
namestringHuman-readable display name.
taglinestringOne-line pitch for listings (~70 chars).
descriptionstringFull description. Shown on the detail page.
categorystringOne of the curated category slugs.
tagsstring[]Free-form tags for search and filtering.
authorobject{ name, url } shown on the detail page.
licensestringSPDX identifier.
homepagestring?Optional project URL.
repositorystring?Optional source repository URL.
agent.defaultsobjectDefaults for OpenClaw registration: model, thinking, etc.
filesstring[]Glob patterns defining the package payload.
dependencies.pluginsobject[]Plugin specs resolved at install time.
dependencies.skillsobject[]Skill slugs resolved at install time.
dependencies.providersobject{ any: [...] } — acceptable runtime providers.
setup.secretsobject[]Secrets prompted at install time. Keys only, never values.
store.iconstring?Path to icon file (relative to package root).
store.screenshotsstring[]?Paths to screenshot files.
openclaw.entrypointsobjectMaps package files to canonical OpenClaw workspace filenames.
openclaw.templatesobjectWrite-once files materialized at first install only.

Markdown, JSON, YAML, TOML, CSV, TSV, plain text, and images (PNG, JPG, SVG, WebP).

  • Any file with an executable bit set
  • Blocked extensions: .sh, .bash, .zsh, .js, .ts, .mjs, .cjs, .py, .rb, .php, .exe, .bat, .ps1, .dll, .so, .dylib
  • Known binary executable formats (ELF, Mach-O, PE)
  • Files containing API-key-like strings (AWS keys, OpenAI keys, etc.)
LimitValue
Total package size100 MB
File count10,000
Individual text file (warning)1 MB
Individual asset file10 MB
FileLifecycleNotes
AGENTS.md, SOUL.md, TOOLS.md, IDENTITY.mdPackage-managedReplaced on every update.
BOOTSTRAP.mdPackage-managed with exceptionIf the operator deletes it, updates won’t recreate it.
USER.mdWrite-once templateMaterialized at first install, then operator-owned forever.
MEMORY.mdNever package-managedAlways operator-owned. Preserved across updates and uninstalls.

Hard rules enforced by code:

  • MEMORY.md is never package-owned. Packages cannot ship or manage it.
  • USER.md is template-once, then operator-owned.
  • Operator-created files (notes, logs) are preserved unless the operator explicitly opts into deletion.
  • Updates only replace package-managed files.
  • Uninstalls offer to preserve user-managed files by default.
{ "spec": "clawhub:@someone/nutrition-api", "required": true, "minVersion": "1.2.0" }

Resolved via openclaw plugins install at install time. Required plugins block install on failure; optional plugins prompt the operator.

{ "slug": "food-search", "required": false }

Resolved via openclaw skills install through ClawHub.

"providers": { "any": ["anthropic", "openai"] }

At install, Clawstore checks the operator has at least one matching provider configured.

{
"key": "NUTRITIONIX_API_KEY",
"prompt": "Nutritionix API key",
"required": true,
"target": "env"
}

Prompted at install time. Values are written to ~/.openclaw/.env and never stored in Clawstore’s install records.

IDs follow the @scope/name pattern:

  • Scope is your GitHub username (lowercased), assigned automatically
  • Name is kebab-case, 2-64 characters (a-z, 0-9, -)
  • IDs are immutable after first publish — rename by publishing a new ID and yanking the old one
  • One owner per ID — first publish claims it