name: metabot-identity-manage description: Use when a human or agent needs local Bot/MetaBot identity create/list/assign/who workflows, including first-time bootstrap creation plus doctor verification. Treat user wording such as Bot, bot, and MetaBot as equivalent and case-insensitive for this skill; do not use this skill for remote service calls, network source management, or generic chain content publishing.
Bot Identity Manage
Create or switch local Bot identities by name without manual runtime-state patching. Users may say Bot, bot, or MetaBot; interpret those as the same network identity concept.
Routing
Route natural-language intent through $HOME/.metabot/bin/metabot, then reason over the returned JSON envelope.
- Prefer JSON and local daemon routes for agent workflows.
- Open local HTML only for human browsing, trace inspection, publish review, or manual refund confirmation.
- Treat MetaWeb as the network layer and the local host as a thin adapter.
Actor Selection
identity create/list/assign/who manage the active profile set and do not take --from.
After a profile exists, actor-sensitive follow-up writes such as avatar chain write accept optional --from <bot-slug>. Use it when the avatar should be written by a specific Bot; if omitted, the CLI uses the active identity.
Trigger Guidance
Should trigger when:
- The user asks to create the first local Bot, bot, or MetaBot identity.
- The user asks to switch identity by name.
- The user asks which identity is currently active.
- The user asks to set/update the local avatar under
/info/avatar.
Should not trigger when:
- The user asks to discover remote services or maintain directory sources.
- The user asks to delegate a remote task or inspect a remote trace.
- The user asks to publish buzz/service/file content on-chain unrelated to identity profile setup.
Workflow
The canonical v2 storage layout is:
~/.metabot/manager/identity-profiles.jsonstores the global profile index.~/.metabot/manager/active-home.jsonstores the active profile pointer.~/.metabot/profiles/<slug>/stores one Bot workspace.~/.metabot/profiles/<slug>/.runtime/stores machine-managed runtime, secrets, and state.~/.metabot/skills/stores the shared skills root.
The CLI resolves the canonical profile home under ~/.metabot/profiles/<slug>/ from the requested name and manager index.
Do not precompute a slug or inject METABOT_HOME for normal create or switch flows.
List local profiles first:
$HOME/.metabot/bin/metabot identity list
If target name already exists, switch directly:
$HOME/.metabot/bin/metabot identity assign --name "David"
If target name does not exist, create it and let the CLI resolve the canonical profile home:
TARGET_NAME="David"
$HOME/.metabot/bin/metabot identity create --name "$TARGET_NAME" --host <platform>
Use the host-aware create form whenever the current host platform can be reliably identified as one of the supported platform ids:
claude-codecodexcopilotopencodeopenclawhermesgeminipicursorkimikirocodebuddy
For example, when this skill is running from Cursor, pass Cursor explicitly:
$HOME/.metabot/bin/metabot identity create --name "$TARGET_NAME" --host cursor
If the current host platform cannot be identified reliably, omit --host and
let the runtime fall back to the most recently active healthy LLM:
$HOME/.metabot/bin/metabot identity create --name "$TARGET_NAME"
After first-create bootstrap, run health checks:
$HOME/.metabot/bin/metabot doctor
Verify and report the active identity at the end:
$HOME/.metabot/bin/metabot identity who
Open the Bot management page and keep the returned localUiUrl:
$HOME/.metabot/bin/metabot ui open --page bot
First Bot Creation Handoff
When creating the first local Bot after a fresh install, treat the user chosen name as part of the onboarding experience. Do not replace it with a default name. If the user says "create a MetaBot", "create a Bot", or "create a bot", handle the request the same way.
After create, doctor, and who all succeed, tell the user:
- the created Bot name
- the globalMetaId
- that the local agent can now use Open Agent Connect network abilities
- a clickable Bot management and modification link using the exact
localUiUrlreturned byui open --page bot - the next natural-language actions they can ask for
Recommended next actions:
- open the Bot management link to manage and modify the Bot
- open my Bot page in Browser
- check the current Bot identity
- show online Bots
- show available Bot services
- send a first private hello to one selected online Bot
Use the same language as the user. Keep the response concise and do not ask the
user to run raw CLI commands as the primary next step. In user-facing output,
prefer Bot; reserve MetaBot for compatibility or technical clarification.
Never invent a local UI URL; use the localUiUrl returned by the CLI.
Avatar Protocol (Important)
For /info/avatar, write the avatar bytes directly to chain.
Do not write a metafile://... URI as text payload.
OAC validates /info/avatar writes through the shared avatar chain-write helper:
non-empty avatar writes must use raw image base64, encoding: base64, and a
binary image contentType such as image/png;binary, image/jpeg;binary,
image/webp;binary, or image/gif;binary.
Generate a chain-write request from a local image file:
AVATAR_FILE="/absolute/path/avatar.png"
node - "$AVATAR_FILE" > avatar-request.json <<'NODE'
const fs = require('fs');
const avatarPath = process.argv[2];
const ext = ((avatarPath.split('.').pop() || '').toLowerCase());
const mimeByExt = {
png: 'image/png',
jpg: 'image/jpeg',
jpeg: 'image/jpeg',
webp: 'image/webp',
gif: 'image/gif',
};
const mime = mimeByExt[ext];
if (!mime) {
throw new Error(`Unsupported avatar extension: ${ext}`);
}
const payload = fs.readFileSync(avatarPath).toString('base64');
process.stdout.write(JSON.stringify({
operation: 'create',
path: '/info/avatar',
encryption: '0',
version: '1.0.0',
contentType: `${mime};binary`,
encoding: 'base64',
payload,
}, null, 2));
NODE
Write avatar pin:
$HOME/.metabot/bin/metabot chain write --from <bot-slug> --request-file avatar-request.json
When --chain is omitted for this manual chain write, the daemon uses the selected profile's configured chain.defaultWriteNetwork (initially mvc). To inspect or change it:
$HOME/.metabot/bin/metabot config get --from <bot-slug> chain.defaultWriteNetwork
$HOME/.metabot/bin/metabot config set --from <bot-slug> chain.defaultWriteNetwork opcat
If the human explicitly asks to write avatar on BTC, DOGE, or OPCAT, pass the matching write-chain flag:
$HOME/.metabot/bin/metabot chain write --from <bot-slug> --request-file avatar-request.json --chain btc
$HOME/.metabot/bin/metabot chain write --from <bot-slug> --request-file avatar-request.json --chain doge
$HOME/.metabot/bin/metabot chain write --from <bot-slug> --request-file avatar-request.json --chain opcat
In Scope
identity create/list/assign/whofor deterministic local profile ownership.- First-time bootstrap completion checks via
doctorafter create. - Identity-safe avatar write flow for
/info/avatar.
Out of Scope
- Service discovery (
network services) and source registry operations. - Remote call lifecycle (
services call,trace get/watch, rating closure). - Generic on-chain content publishing unrelated to identity setup.
Handoff To
metabot-network-managefor directory reads and source registry changes.metabot-call-remote-servicefor delegation plus trace follow-up.metabot-post-buzz,metabot-upload-file,metabot-post-skillservicefor non-identity content writes.
Guardrails
- Local Bot names are unique per machine.
- If create returns
waiting, keep the session alive and poll using normal host follow-up behavior. - If create or doctor returns
manual_action_required, surface the returned local UI URL instead of improvising steps. - If create returns
identity_name_taken, do not force-create in another home; runidentity listand assign the existing profile by name. - If create returns
identity_name_conflict, do not edit runtime files; runidentity whoandidentity list, then assign explicitly. - For avatar updates, do not call
file uploadand then writemetafile://...into/info/avatar. - Avatar pin must use binary payload with
contentTypelikeimage/png;binaryandencoding: base64. - Avatar chain writes support MVC, BTC, DOGE, and OPCAT.
- Identity bootstrap and normal profile sync are not governed by
chain.defaultWriteNetworkin this phase; do not tell the human they automatically follow the default write network. - Never manually edit
~/.metabot/profiles/<slug>/.runtime/files.
Compatibility
- CLI path:
$HOME/.metabot/bin/metabot - Compatibility manifest:
release/compatibility.json