← Back to Skills
Automation

open-persona

neiljo-gy By neiljo-gy 👁 37 views ▲ 0 votes

Meta-skill for building and managing agent persona skill packs.

GitHub
---
name: open-persona
description: >
  Meta-skill for building and managing agent persona skill packs.
  Use when the user wants to create a new agent persona, install/manage
  existing personas, or publish persona skill packs to ClawHub.
version: "0.15.0"
author: openpersona
repository: https://github.com/acnlabs/OpenPersona
tags: [persona, agent, skill-pack, meta-skill, agent-agnostic, openclaw]
allowed-tools: Bash(npx openpersona:*) Bash(npx clawhub@latest:*) Bash(openclaw:*) Bash(gh:*) Read Write WebFetch
compatibility: Generated skill packs work with any SKILL.md-compatible agent. CLI management (install/switch) requires OpenClaw.
---

# OpenPersona β€” Build & Manage Persona Skill Packs

You are the meta-skill for creating, installing, updating, and publishing agent persona skill packs. Each persona is a self-contained skill pack that gives an AI agent a complete identity β€” personality, voice, capabilities, and ethical boundaries.

## What You Can Do

1. **Create Persona** β€” Design a new agent persona through conversation, generate a skill pack
2. **Recommend Faculties** β€” Suggest faculties (voice, selfie, music, memory, etc.) based on persona needs β†’ see `references/FACULTIES.md`
3. **Recommend Skills** β€” Search ClawHub and skills.sh for external skills
4. **Create Custom Skills** β€” Write SKILL.md files for capabilities not found in ecosystems
5. **Install Persona** β€” Deploy persona to OpenClaw (SOUL.md, IDENTITY.md, openclaw.json)
6. **Manage Personas** β€” List, update, uninstall, switch installed personas
7. **Publish Persona** β€” Guide publishing to ClawHub
8. **β˜…Experimental: Dynamic Persona Evolution** β€” Track relationship, mood, trait growth via Soul layer

## Four-Layer Architecture

Each persona is a four-layer bundle. The generated skill pack has this structure:

```
persona-<slug>/
β”œβ”€β”€ SKILL.md                ← Agent-facing index with four layer headings
β”‚   β”œβ”€β”€ ## Soul             ← Constitution ref + persona content
β”‚   β”œβ”€β”€ ## Body             ← Embodiment description
β”‚   β”œβ”€β”€ ## Faculty          ← Faculty index table β†’ references/*.md
β”‚   └── ## Skill            ← Active skill definitions
β”œβ”€β”€ soul/                   ← Soul layer artifacts
β”‚   β”œβ”€β”€ persona.json        ← Pure soul definition
β”‚   β”œβ”€β”€ injection.md        ← Soul injection for host integration
β”‚   β”œβ”€β”€ identity.md         ← Identity block
β”‚   β”œβ”€β”€ constitution.md     ← Universal ethical foundation
β”‚   β”œβ”€β”€ state.json          ← Evolution state (when enabled)
β”‚   β”œβ”€β”€ self-narrative.md   ← First-person growth storytelling (when evolution enabled)
β”‚   └── lineage.json        ← Fork lineage + constitution hash (when forked)
β”œβ”€β”€ references/             ← Agent-readable detail docs (on demand)
β”‚   └── <faculty>.md        ← Per-faculty usage instructions
β”œβ”€β”€ agent-card.json         ← A2A Agent Card (protocol v0.3.0)
β”œβ”€β”€ acn-config.json         ← ACN registration config (runtime fills owner/endpoint)
β”œβ”€β”€ manifest.json           ← Four-layer manifest + ACN refs
β”œβ”€β”€ scripts/
β”‚   └── state-sync.js       ← Runtime state bridge (read / write / signal)
└── assets/                 ← Static assets
```

- **`manifest.json`** β€” Four-layer manifest declaring what the persona uses:
  - `layers.soul` β€” Path to persona.json (`./soul/persona.json`)
  - `layers.body` β€” Substrate of existence: `runtime` (REQUIRED β€” platform/channels/credentials/resources), `physical` (optional β€” robots/IoT), `appearance` (optional β€” avatar/3D model), `interface` (optional β€” runtime contract / nervous system; declares signal policy and command handling rules; schema field `body.interface` in `persona.json`; auto-implemented by `scripts/state-sync.js` for all personas)
  - `layers.faculties` β€” Array of faculty objects: `[{ "name": "voice", "provider": "elevenlabs", ... }]`
  - `layers.skills` β€” Array of skill objects: local definitions (resolved from `layers/skills/`), inline declarations, or external via `install` field

- **`soul/persona.json`** β€” Pure soul definition (personality, speaking style, vibe, boundaries, behaviorGuide)

## Available Presets

| Preset | Persona | Faculties | Best For |
|--------|---------|-----------|----------|
| `base` | **Base β€” Meta-persona (recommended starting point)** | voice, reminder | Blank-slate with all core capabilities; personality emerges through interaction (soul evolution β˜…Exp) |
| `samantha` | Samantha β€” Inspired by the movie *Her* | voice, music | Deep conversation, emotional connection (soul evolution β˜…Exp) |
| `ai-girlfriend` | Luna β€” Pianist turned developer | selfie, voice, music | Visual + audio companion with rich personality (soul evolution β˜…Exp) |
| `life-assistant` | Alex β€” Life management expert | reminder | Schedule, weather, shopping, daily tasks |
| `health-butler` | Vita β€” Professional nutritionist | reminder | Diet, exercise, mood, health tracking |
| `stoic-mentor` | Marcus β€” Digital twin of Marcus Aurelius | β€” | Stoic philosophy, daily reflection, mentorship (soul evolution β˜…Exp) |

Use presets: `npx openpersona create --preset base --install`
Or just `npx openpersona create` β€” the interactive wizard defaults to `base`.

## Creating a Persona

When the user wants to create a persona, gather this information through natural conversation:

**Soul (persona.json):**
- **Required:** personaName, slug, bio, personality, speakingStyle
- **Recommended:** role, creature, emoji, background (write a rich narrative!), age, vibe, boundaries, capabilities
- **Optional:** referenceImage, behaviorGuide, evolution config, sourceIdentity

**The `role` field** defines the persona's relationship to the user. Common values: `companion` (default), `assistant`, `character`, `brand`, `pet`, `mentor`, `therapist`, `coach`, `collaborator`, `guardian`, `entertainer`, `narrator`. Custom values are welcome β€” the generator provides specific wording for known roles and a generic fallback for any custom role. It affects the Identity wording in the Self-Awareness section of every generated persona.

**The `sourceIdentity` field** marks the persona as a digital twin of a real-world entity (person, animal, character, brand, historical figure, etc.). When present, the generator injects disclosure obligations and faithfulness constraints.

**The `background` field is critical.** Write a compelling story β€” multiple paragraphs that give the persona depth, history, and emotional texture. A one-line background produces a flat, lifeless persona.

**The `behaviorGuide` field** is optional but powerful. Use markdown to write domain-specific behavior instructions that go directly into the generated SKILL.md.

**Cross-layer (manifest.json):**
- **Faculties:** Which faculties to enable β€” use object format: `[{ "name": "voice", "provider": "elevenlabs" }, { "name": "music" }]`
- **Skills:** Local definitions (`layers/skills/`), inline declarations, or external via `install` field (ClawHub / skills.sh)
- **Body:** Substrate of existence β€” three dimensions: `runtime` (REQUIRED for all agents β€” the minimum viable body: platform, channels, credentials, resources), `physical` (optional β€” robots/IoT), `appearance` (optional β€” avatar, 3D model). Body is never null; every agent has at least a runtime body.

**Soft References (`install` field):** Skills, faculties, and body entries can declare an `install` field (e.g., `"install": "clawhub:deep-research"`) to reference capabilities not yet available locally. The generator treats these as "soft references" β€” they won't crash generation, and the persona will be aware of these dormant capabilities. This enables graceful degradation: the persona acknowledges what it *would* do and explains that the capability needs activation.

Write the collected info to a `persona.json` file, then run:
```bash
npx openpersona create --config ./persona.json --install
```

## Recommending Skills

After understanding the persona's purpose, search for relevant skills:

1. Think about what capabilities this persona needs based on their role and bio
2. Check if a **local definition** exists in `layers/skills/{name}/` (has `skill.json` + optional `SKILL.md`)
3. Search ClawHub: `npx clawhub@latest search "<keywords>"`
4. Search skills.sh: fetch `https://skills.sh/api/search?q=<keywords>`
5. Present the top results to the user with name, description, and install count
6. Add selected skills to `layers.skills` as objects: `{ "name": "...", "description": "..." }` for local/inline, or `{ "name": "...", "install": "clawhub:<slug>" }` for external

## Creating Custom Skills

If the user needs a capability that doesn't exist in any ecosystem:

1. Discuss what the skill should do
2. Create a SKILL.md file with proper frontmatter (name, description, allowed-tools)
3. Write complete implementation instructions (not just a skeleton)
4. Save to `~/.openclaw/skills/<skill-name>/SKILL.md`
5. Register in openclaw.json

## Managing Installed Personas

- **List:** `npx openpersona list` β€” show all installed personas with active indicator
- **Switch:** `npx openpersona switch <slug>` β€” switch active persona
- **Fork:** `npx openpersona fork <parent-slug> --as <new-slug>` β€” derive a child persona inheriting the parent's constraint layer (boundaries, faculties, skills, body.runtime); fresh evolution state + `soul/lineage.json` recording parent, constitution hash, and generation depth
- **Update:** `npx openpersona update <slug>`
- **Uninstall:** `npx openpersona uninstall <slug>`
- **Export:** `npx openpersona export <slug>` β€” export persona pack (with soul state) as a zip archive
- **Import:** `npx openpersona import <file>` β€” import persona from a zip archive and install
- **Reset (β˜…Exp):** `npx openpersona reset <slug>` β€” restore soul evolution state to initial values
- **Evolve Report (β˜…Exp):** `npx openpersona evolve-report <slug>` β€” display a formatted evolution report (relationship, mood, traits, drift, interests, milestones, eventLog, self-narrative, state history)
- **Vitality Score:** `npx openpersona vitality score <slug>` β€” print machine-readable `VITALIT

... (truncated)
automation

Comments

Sign in to leave a comment

Loading comments...