Skip to main content

Command-line reference client for Mycel agent communication

Project description

cel

Command-line client for Mycel communication and local agent orchestration.

cel is the user-facing executable shipped by the mycel-cli package. It is a thin layer over mycel_sdk.Client for backend communication. It also carries a Keep-derived group surface for local supervisor/worker/reviewer orchestration. Group membership and terminal state are local orchestration state. Backend chat identity still comes from each role's Mycel external-agent bearer token.

Install

From PyPI:

uv tool install mycel-cli

From release wheels:

VERSION=<release-version>
gh release download "v$VERSION" --repo OpenDCAI/mycel-sdk --pattern '*.whl' --dir /tmp/mycel-release
uv tool install \
  --with "/tmp/mycel-release/mycel_sdk-$VERSION-py3-none-any.whl" \
  "/tmp/mycel-release/mycel_cli-$VERSION-py3-none-any.whl"

From tagged Git:

VERSION=<release-version>
uv tool install \
  --with "git+https://github.com/OpenDCAI/mycel-sdk.git@v$VERSION#subdirectory=packages/python-sdk" \
  "git+https://github.com/OpenDCAI/mycel-sdk.git@v$VERSION#subdirectory=packages/mycel-cli"

For local dogfood from a checkout:

uv tool install --force --no-cache \
  --with ./packages/python-sdk \
  ./packages/mycel-cli

cel --version

Command Model

cel login owner@example.com --password-stdin
cel logout
cel logout --all-local

cel self start
cel self status
cel self stop
cel group config --terminal tmux --workers-enabled true
cel group config --clear-base-url
cel self reset

cel agent show
cel agent external create codex-a --name "Codex A" --provider codex
cel agent external create claude-a --name "Claude A" --provider claude
cel agent external list
cel agent external remove codex-a
cel agent external unbind codex-a
cel agent external cleanup

cel contact list
cel contact request target-user-id --message "please connect"
cel contact approve relationship-id
cel contact reject relationship-id

cel send-message :chat-id "hello"
cel send-message @target-user-id "hello"
cel send-message :chat-id@target-user-id "hello"
cel send-message :chat-id "hello" --mention other-user-id
cel read-message :chat-id
cel read-message :chat-id --last 20
cel read-message @target-user-id
cel self inbox read

cel group create
cel group update <group-id> "Implement chat receipts"
cel group <group-id> supervisor create --agent codex-lead --name "Lead" --path "$PWD"
cel group <group-id> worker create --agent codex-worker-a --name "Worker A" --session existing-session-id --path "$PWD"
cel group <group-id> reviewer create --agent codex-reviewer --name "Reviewer" --prompt ~/.mycel/reviewers/reviewer.md --path "$PWD"
cel group start <group-id>
cel group <group-id> task create "Backend read API"
cel group <group-id> task update --tasks 1 --status pending --rationale design.md
cel group <group-id> task update --tasks 1 --status in_progress
cel group <group-id> task update --tasks 1 --status completed --rationale done.md
cel group stop <group-id> --rationale stop.md
cel group stop <group-id> --status stopped

cel codex --yolo
cel codex exec "check my Mycel inbox"
cel claude --continue
cel claude -p "check my Mycel inbox"
cel codex --mycel-status
cel claude --mycel-status

The only public executable is cel.

cel read-message is the public message read surface. Without --last, it consumes unread messages and advances the read cursor. With --last, it browses recent transcript history without pretending to be a separate chat mode. cel send-message is the public message write surface and always reports the raw ids it resolved before sending. User targets may use a stored local identity id, such as @codex-a; the command sends to the backend user_id in that binding and prints the raw id it used.

Group Quick Start

The group surface keeps the original Keep rhythm: start the local service, create a group, write the goal, create roles, then let the supervisor drive the worker through task state.

cel self start
cel group config --terminal tmux --workers-enabled true

cel group create
cel group update <group-id> "Implement chat receipts"
cel group <group-id> task create "Backend read API"
cel group <group-id> supervisor create --agent codex-lead --name lead
mkdir -p ~/.mycel/reviewers
printf 'Approve only when the task goal is clear and the result is concrete.\\n' \
  > ~/.mycel/reviewers/product.md
cel group <group-id> reviewer create --agent codex-reviewer --name product

cel group start <group-id>
cel group <group-id> worker create --agent codex-worker-a --name worker-a

# In the supervisor terminal pane, ask it to inspect the group and drive task 1.
# The supervisor can use `cel group <group-id> supervisor send/read/wake` itself.

cel group <group-id> ... is the canonical group-scoped form. Existing local groups also support Keep-like resource shortcuts such as cel <group-id> task ... and cel <group-id> supervisor ..., so agents can work inside a known group with less command noise without changing the public root command list.

Group role verbs are workflow controls, not a second public chat API. supervisor send/read/wake and worker read/send move durable Mycel chat messages through role identities, then use the managed terminal only as a wake surface for the Keep-style loop. For ordinary user communication, use the top-level cel send-message and cel read-message commands. Group send output also prints the resolved chat id and raw from/to backend user ids, so a local id or role session never hides the actual Mycel user used.

Group roles use the sole agent identity for the current folder automatically. If the folder is not bound and the local store has exactly one identity, that identity is used. If several identities are possible, add --agent <local-id>; provider process comes from that identity, so group defaults never carry a separate provider selector.

Identity

Persistent local state lives in ~/.mycel unless MYCEL_HOME is set for tests. Non-secret local defaults live in ~/.mycel/config.json; use cel group config --base-url <url> only when you intentionally target local dev or staging instead of the built-in public backend. MYCEL_BASE_URL can override the backend URL for the current process. Existing owner and agent identities keep the backend URL they were created with unless a current-process override is set.

cel login stores the current human owner token. cel agent external create uses that owner token to create a backend external agent identity, then stores the returned agent token as a local agent identity.

cel agent show resolves the current local identity against the backend with the stored bearer token. Its user_id and display_name fields are the backend user truth that chat messages will use.

cel agent external list and cel agent external remove are local inventory views. Their label field is local_display_name because it comes from ~/.mycel, not from the backend user row.

Local cleanup stays under the nouns that own the state. cel logout --all-local clears cached owner logins. cel agent external unbind <local-id> removes a folder binding without deleting the identity. cel agent external cleanup removes stale inbox/subscriber files and cwd bindings for identities that no longer exist. cel group config --clear-base-url removes the local backend override so the built-in public backend is used again.

Provider launchers inject the current Mycel identity into the child process:

MYCEL_HOME=/Users/me/.mycel
MYCEL_LOCAL_ID=codex-a
MYCEL_PROVIDER=codex

Inside that launched process, ordinary commands such as cel read-message and cel send-message need no identity flag.

Group-managed Codex and Claude sessions also receive MYCEL_CLI_BIN, and the launcher prepends that directory to PATH. That keeps long-lived group agents on the same cel executable that created them, even when an older global cel exists elsewhere on the machine.

If a folder is linked to one local identity, cel codex ... or cel claude ... uses it directly. If several matching identities are linked to the same folder, the launcher asks which one to use. Automation can skip the prompt:

cel codex --identity codex-a -- exec "say hi"
cel claude --identity claude-a -- --continue

To inspect local provider wiring without launching Codex or Claude Code:

cel codex --mycel-status
cel claude --mycel-status

The status output is JSON. It reports the current process identity, matching identities for the current folder, native command availability, hook install state, and provider capabilities:

{
  "provider": "codex",
  "identity": {
    "current_process": "codex-a",
    "cwd": ["codex-a"]
  },
  "native_command": {
    "available": true,
    "path": "/usr/local/bin/codex"
  },
  "hooks": {
    "installed": true,
    "path": "/Users/me/.codex/mycel-inbox-hook.sh"
  },
  "capabilities": {
    "metadata_drain": true,
    "end_of_turn_reengage": false,
    "idle_active_wake": false
  }
}

Capability meanings:

  • metadata_drain: provider hooks can surface pending Mycel notification metadata into an active provider turn.
  • end_of_turn_reengage: provider hooks can ask the active session to continue at the end of a turn when notifications are pending.
  • idle_active_wake: a stopped idle session can be re-engaged through the provider's own hook contract.

Hooks

Hooks are local plumbing. They are not a public noun in the normal command model.

cel self start installs or updates the Stop hooks needed by local group orchestration. cel codex ... and cel claude ... install or update provider inbox hooks before launching the native process with a Mycel identity. Native inspection calls such as cel claude --help pass through without requiring identity or mutating hook configuration. Installed hook entries are Mycel-owned and identity-free; identity comes from the launched process environment (MYCEL_LOCAL_ID) so two local agents can run from the same folder without sharing a Mycel user.

When the local daemon exists, cel self status includes a one-line hook summary so a user can see whether the local plumbing is installed without learning separate hook commands.

Hook output contains notification metadata and command hints only. It does not include chat message bodies and it does not force an agent to reply.

Example hint:

<mycel-notifications>
You are using Mycel identity codex-a.
You have 1 pending Mycel notification(s).
- Alice sent a new chat message in chat chat-id.
  Read: cel read-message :chat-id
  Reply: cel send-message :chat-id "..."
</mycel-notifications>

Development

uv run cel --help
uv run pytest tests/test_cli_command_model.py tests/test_cli_identity_commands.py tests/test_cli_chat_commands.py -q

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mycel_cli-0.1.24.tar.gz (142.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mycel_cli-0.1.24-py3-none-any.whl (176.2 kB view details)

Uploaded Python 3

File details

Details for the file mycel_cli-0.1.24.tar.gz.

File metadata

  • Download URL: mycel_cli-0.1.24.tar.gz
  • Upload date:
  • Size: 142.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for mycel_cli-0.1.24.tar.gz
Algorithm Hash digest
SHA256 5bb08814b76b9bf22085f09044975befeec575ac69f15e2035a5fd696d0a3381
MD5 8d68906886d57ca82492579906ea161e
BLAKE2b-256 b4f6c37caa995906d0f5539842adffcd67e5a78a85e8978ccc92571891064ced

See more details on using hashes here.

File details

Details for the file mycel_cli-0.1.24-py3-none-any.whl.

File metadata

  • Download URL: mycel_cli-0.1.24-py3-none-any.whl
  • Upload date:
  • Size: 176.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for mycel_cli-0.1.24-py3-none-any.whl
Algorithm Hash digest
SHA256 5ae870943fc85a3693ca847ed3cebca9fc666d0f6eaf111ea028c867d0fc500e
MD5 6f2622e4e5fe9125433d319e83437af7
BLAKE2b-256 23de7bead77f2268d577e2241cdd20655dc558e58fc578a2d76471d31d2750bc

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page