PersonaSpec toolkit for LLM agents
Project description
larva
PersonaSpec toolkit for LLM agents. Validate, assemble, normalize, register, and resolve canonical persona specifications.
What larva Does
larva manages PersonaSpec — structured JSON definitions for AI agent personas. It provides:
- Validate — schema + semantic checks on PersonaSpec JSON
- Assemble — compose personas from reusable components (prompts, toolsets, constraints, models)
- Register / Resolve — store and retrieve personas from a global registry (
~/.larva/) - Clone / Update / Delete — full lifecycle management
- Export — bulk export for integrations
- MCP server — programmatic access for other tools
Install
pip install larva
Quick Start
# Register a persona
cat <<'EOF' > my-agent.json
{
"spec_version": "0.1.0",
"id": "code-reviewer",
"description": "Reviews code for correctness and style",
"prompt": "You are a senior code reviewer...",
"model": "openai/gpt-5.4",
"can_spawn": false,
"side_effect_policy": "read_only"
}
EOF
larva validate my-agent.json
larva register my-agent.json
larva resolve code-reviewer
# List all personas
larva list
# Clone and experiment
larva clone code-reviewer code-reviewer-exp
larva update code-reviewer-exp --set model=openai/gpt-5.4-pro
# Export all
larva export --all --json
Interfaces
MCP Server (primary)
larva.validate(spec) → ValidationReport
larva.assemble(components) → PersonaSpec
larva.register(spec) → {id, registered}
larva.resolve(id, overrides?) → PersonaSpec
larva.list() → [{id, spec_digest, model}]
larva.update(id, patches) → PersonaSpec
larva.clone(source_id, new_id) → PersonaSpec
larva.delete(id) → {id, deleted}
larva.clear(confirm) → {cleared, count}
larva.export(all?, ids?) → [PersonaSpec, ...]
larva.component_list() → {prompts, toolsets, constraints, models}
larva.component_show(type, name) → component content
CLI
larva validate <spec.json> [--json]
larva register <spec.json> [--json]
larva resolve <id> [--override key=value]... [--json]
larva list [--json]
larva update <id> --set key=value [--set ...] [--json]
larva clone <source-id> <new-id> [--json]
larva delete <id> [--json]
larva clear --confirm "CLEAR REGISTRY" [--json]
larva export --all [--json]
larva export --id <id> [--id <id>]... [--json]
larva assemble --id <id> [--prompt <name>]... [--toolset <name>]... [--constraints <name>]... [--model <name>] [--override key=value]... [--var key=value]... [-o output.json]
larva component list [--json]
larva component show <type>/<name> [--json]
Python Library
from larva.shell.python_api import (
validate, assemble, register, resolve, list,
update, clone, delete, clear,
export_all, export_ids,
component_list, component_show,
)
# Register
result = validate({"id": "my-agent", "spec_version": "0.1.0", "prompt": "..."})
register({"id": "my-agent", "spec_version": "0.1.0", "prompt": "..."})
# Resolve
spec = resolve("my-agent")
# Clone + update
clone("my-agent", "my-agent-exp")
updated = update("my-agent-exp", {"model": "openai/gpt-5.4-pro"})
# Export all
all_specs = export_all()
Component Library
~/.larva/
components/
prompts/ # Prompt text fragments (.md files)
toolsets/ # Tool permission maps (.yaml)
constraints/ # can_spawn + side_effect_policy (.yaml)
models/ # Model + inference params (.yaml)
registry/ # Registered PersonaSpec JSON files
# Assemble from components
larva assemble --id code-reviewer \
--prompt code-reviewer --prompt careful-reasoning \
--toolset read-only \
--constraints strict \
--model claude-opus
# Browse components
larva component list
larva component show prompts/code-reviewer
Web UI
A browser-based persona manager is included in contrib/web/:
pip install fastapi uvicorn
python contrib/web/server.py
# → opens http://localhost:7400
OpenCode Plugin
An OpenCode plugin that registers larva personas as agents:
// .opencode/opencode.json
{
"plugin": ["file:///path/to/larva/contrib/opencode-plugin/larva.ts"]
}
See contrib/opencode-plugin/README.md for details.
Architecture
larva follows a strict layered architecture enforced by Invar:
| Layer | Path | Rules |
|---|---|---|
| Core | src/larva/core/ |
Pure logic, @pre/@post contracts, no I/O |
| Shell | src/larva/shell/ |
I/O adapters, returns Result[T, E] |
| App | src/larva/app/ |
Orchestration facade |
Key Design Decisions
- Composition, not inheritance. No
base:field. Components are orthogonal building blocks. - Error-on-conflict. Two components setting the same scalar field → assembly fails. Use
overrides. - Authority, not runtime. larva owns persona definitions; execution belongs elsewhere.
- No cross-run mutable state. Persona changes require explicit
register.
License
AGPL-3.0-or-later
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file larva-0.2.1.tar.gz.
File metadata
- Download URL: larva-0.2.1.tar.gz
- Upload date:
- Size: 428.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
598028961c6a51a03b433659f4442461ba0668bf8f35f39a96888d2e12c04cfb
|
|
| MD5 |
6355b90a083e567a374ea865a195c524
|
|
| BLAKE2b-256 |
30846b3b75beed3228d6090e08adbbe9f2a7b41bc16c8b7ff68cfff707ce260d
|
Provenance
The following attestation bundles were made for larva-0.2.1.tar.gz:
Publisher:
publish.yml on Tefx/larva
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
larva-0.2.1.tar.gz -
Subject digest:
598028961c6a51a03b433659f4442461ba0668bf8f35f39a96888d2e12c04cfb - Sigstore transparency entry: 1107845635
- Sigstore integration time:
-
Permalink:
Tefx/larva@97d94a1c91754f3f5e163cc78640e23fec8dc0ed -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/Tefx
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@97d94a1c91754f3f5e163cc78640e23fec8dc0ed -
Trigger Event:
release
-
Statement type:
File details
Details for the file larva-0.2.1-py3-none-any.whl.
File metadata
- Download URL: larva-0.2.1-py3-none-any.whl
- Upload date:
- Size: 74.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
74e765d8fa67cfd8b7fb836bfcf8f864fc48ab1cecff70caf8515e7433b43cbe
|
|
| MD5 |
bc8271e0fc9b3646cb196db7c1eade58
|
|
| BLAKE2b-256 |
b45b090d5df73e2f303da6c2e6f7adf638d608eafb9a65e9d609020f433edd7f
|
Provenance
The following attestation bundles were made for larva-0.2.1-py3-none-any.whl:
Publisher:
publish.yml on Tefx/larva
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
larva-0.2.1-py3-none-any.whl -
Subject digest:
74e765d8fa67cfd8b7fb836bfcf8f864fc48ab1cecff70caf8515e7433b43cbe - Sigstore transparency entry: 1107845646
- Sigstore integration time:
-
Permalink:
Tefx/larva@97d94a1c91754f3f5e163cc78640e23fec8dc0ed -
Branch / Tag:
refs/tags/v0.2.1 - Owner: https://github.com/Tefx
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@97d94a1c91754f3f5e163cc78640e23fec8dc0ed -
Trigger Event:
release
-
Statement type: