Operator and contributor guide for Animus (animus / ao CLI).
Use Animus to build Animus. Requirements, tasks, workflows, queue entries, and review state in this repo are Animus-managed data, and this workspace remains Rust-only.
When prose and code disagree, trust the code and generated references:
Cargo.tomlfor current workspace membersdocs/reference/cli/index.mdfor the current CLI treedocs/reference/mcp-tools.mdanddocs/guides/agents.mdfor MCP surface docscrates/orchestrator-cli/src/cli_types/root_types.rsfor the current top-level commandscrates/orchestrator-core/src/config.rsfor project-root resolutioncrates/orchestrator-core/src/services.rsfor bootstrap and state persistencecrates/orchestrator-cli/src/services/operations/ops_web.rsfor howanimus webresolves the external transport plugins
Do not keep outdated counts or removed crates alive in docs.
Rust Cargo workspace with the current members listed below. Main binary: animus (crates/orchestrator-cli). The
web stack (transport + UI) lives in external plugins under
launchapp-dev. The workspace also depends
on external protocol crates from that repo. The authoritative pins live in
Cargo.toml and crates/orchestrator-cli/Cargo.toml; current builds pin the
animus-protocol family to the unified v0.1.26 tag so protocol,
animus-config-protocol, animus-subject-protocol, animus-provider-protocol,
animus-session-backend, animus-journal-protocol, and animus-actor resolve
from the same source.
Current workspace members from Cargo.toml:
crates/
├── animus-runtime-shared/ # Shared workflow execution/runtime-contract helpers used by daemon and workflow_runner plugins
├── animus-mcp-oauth/ # OAuth authorization-code + PKCE helpers and proxy bridge for protected MCP servers
├── animus-plugin-protocol/ # In-tree stdio plugin protocol types
├── animus-plugin-runtime/ # Runtime helpers for plugin implementations
├── orchestrator-cli/ # Main `animus` binary
├── orchestrator-config/ # Workflow, pack, and template config loading
├── orchestrator-core/ # Domain services, subject_adapter, store, bootstrap, state mutation APIs
├── orchestrator-daemon-runtime/ # Daemon queue and scheduling runtime
├── orchestrator-logging/ # Shared tracing and log file utilities
└── orchestrator-plugin-host/ # Plugin discovery, install, stdio host, session backend bridge (folded in v0.5.3)
The OpenAI-compatible runner (formerly crates/oai-runner/) moved
out-of-tree to launchapp-dev/animus-provider-oai-agent v0.1.5 in the
v0.5.2 surface-shrink. Install via
animus plugin install launchapp-dev/animus-provider-oai-agent.
Runtime-critical binaries and supporting crates must stay healthy:
orchestrator-cliorchestrator-logginganimus-runtime-sharedorchestrator-daemon-runtime
Do not add desktop shell frameworks or their transitive equivalents.
Startup flow:
- Parse global flags and the selected top-level command.
- Resolve project root with this precedence:
--project-root- Git common root for the current working directory or linked worktree
- Current working directory
- Bootstrap project-local
.animus/files and scoped runtime state under~/.animus/<repo-scope>/. - Construct
FileServiceHub. - Dispatch into CLI operations, daemon runtime, agent runtime, or web services.
Key implementation files:
crates/orchestrator-cli/src/main.rscrates/orchestrator-cli/src/cli_types/root_types.rscrates/orchestrator-cli/src/shared/output.rscrates/orchestrator-core/src/config.rscrates/orchestrator-core/src/services.rscrates/orchestrator-config/src/workflow_config/- external
protocol::Configandprotocol::repository_scope::*from thelaunchapp-dev/animus-protocoldependency pinned inCargo.toml
Animus now splits project-local config from scoped runtime state.
Project-local config in <project>/.animus/:
config.jsonworkflows.yamlworkflows/*.yamlplugins.lock(created by plugin install/update flows when project-local lockfile resolution is active)
Scoped runtime state in ~/.animus/<repo-scope>/:
core-state.jsonresume-config.jsonworkflow.dbchat/config/daemon/docs/logs/metrics/runs/artifacts/secrets/state/worktrees/
Global config in protocol::Config::global_config_dir():
config.jsoncredentials.jsondaemon-events.jsonlcli-tracker.jsonrunner-sessions/
Repository scope format:
<repo-scope>=<sanitized-repo-name>-<12 hex sha256(canonical-root)>- managed task worktrees live under
~/.animus/<repo-scope>/worktrees/
Legacy fallback readers still check some repo-local run/artifact paths. Do not depend on those fallback locations for new features unless you are intentionally preserving compatibility.
Visible top-level commands:
versiondaemonagentchatqueueworkflowhistorygitapprovalskillpackpluginstatusoutputmcpwebinitinstalladdremovedoctortriggerlogssubjectflavorupdatecostautheventsstatesecret
Use these reference docs instead of hand-maintained summaries:
docs/reference/cli/index.mddocs/reference/mcp-tools.mddocs/guides/agents.md
- Treat
~/.animus/<repo-scope>/and.animus/*.jsonas Animus-managed state. - Use
animus queue,animus subject,animus workflow,animus plugin, andanimus packcommands for mutations. - Do not hand-edit generated state JSON unless the task is explicitly about persistence or migrations.
- Supported exception: project-local workflow YAML overlays in
.animus/workflows.yamland.animus/workflows/*.yaml. - In scripts and automation, always pass
--project-root "$(pwd)".
- Keep the workspace Rust-only. Do not introduce
tauri,wry,tao,gtk,webkit*,webview*, or similar desktop shell dependencies. - If you change CLI surface, update
docs/reference/cli/index.mdin the same change. - If you change MCP tools, update both
docs/reference/mcp-tools.mdanddocs/guides/agents.md. - If you change workflow config loading, verify both project-local YAML overlays and compiled scoped state behavior.
- Prefer source files over prose for command counts, crate counts, routes, or runtime paths.
cargo animus-fmt
cargo animus-lint
cargo animus-bin-check
cargo test -p orchestrator-cli
cargo test --workspace
animus status
animus subject list --kind task
animus subject next --kind task
animus queue list
animus daemon health
animus workflow listanimus subject next --kind task
animus subject status --kind task --id task:TASK-XXX --status in_progress
animus workflow run --task-id TASK-XXX
animus output monitor --run-id <run-id>
animus subject status --kind task --id task:TASK-XXX --status done