Plugins

Agent of Empires keeps its core small (sessions, tmux, worktrees) and grows a plugin system so optional capabilities can be enabled or disabled at runtime instead of bloating the core. The core ships first-party plugins bundled with the binary and can install external community plugins from GitHub or a local directory. Per-plugin settings and plugin-contributed UI land in follow-up releases; running plugin code is not wired up yet, so an installed external plugin records its grant and files but does not execute until a later release.

To build your own, start with Writing Plugins and the Plugin API Reference. The official starter scaffolds a working plugin in Python, Node, or Rust:

cookiecutter gh:agent-of-empires/plugin-template

Managing plugins

Three equivalent surfaces:

  • CLI: aoe plugin list, aoe plugin info <id>, aoe plugin enable <id>, aoe plugin disable <id>, aoe plugin install <source>, aoe plugin update <id>, aoe plugin uninstall <id>.
  • TUI: open the command palette and run “Manage plugins”, or open Settings and select the Plugins tab (the same manager, hosted inline). Space toggles enable/disable.
  • Web dashboard: Settings, then the Plugins tab. The same list and toggles. Enabling or disabling a plugin requires an elevated (passphrase) session when login is enabled and is blocked in read-only mode; localhost browsers skip the passphrase step, matching the CLI’s same-host trust model.

A plugin’s enable-state is stored under [plugins."<id>"] in config.toml and survives every config save.

Bundled plugins

PluginWhat it doesDisabled behavior
aoe.webThe web dashboard management marker. Present whenever the dashboard is compiled in (--features serve), so every released binary ships it, enabled by default.aoe serve refuses to start until re-enabled (aoe plugin enable aoe.web).

aoe.web is the only bundled plugin today, and it rides along with the web dashboard. So a release binary (or any cargo build --features serve) shows it in aoe plugin list, while a TUI-only build (cargo build, no serve) has an empty registry and aoe plugin list reports no plugins. That is expected, not a bug.

The bundled set is deliberately minimal while the system is proven out. More first-party plugins land as each piece is verified.

Installing external plugins

External plugins are community code that you install at your own risk. Install, update, and uninstall from the CLI (aoe plugin) or from the web dashboard’s Plugins settings (Marketplace searches the aoe-plugin GitHub topic; each mutating action confirms the plugin’s capabilities first). See Trust and capabilities below.

aoe plugin install gh:owner/repo          # latest release (the audited default)
aoe plugin install gh:owner/repo@v1.2.3   # an explicit tag, branch, or commit
aoe plugin install ./path/to/plugin       # a local directory
aoe plugin update <id>
aoe plugin uninstall <id>

With no @ref, install resolves the repo’s latest stable GitHub release (the audited default path) and installs that tag. An explicit @ref installs unverified, un-audited code and asks you to confirm first (--yes skips the prompt). If the repo has published no release, install warns and falls back to the default branch behind the same confirmation. The recorded source stays ref-less, so aoe plugin update keeps tracking the latest release; an @ref install keeps following that ref.

A plugin lands under <app_dir>/plugins/<id>/. A GitHub source is cloned and pinned to the exact commit; if the plugin ships a compiled worker as a release binary, the asset for your platform is downloaded into the plugin directory. To install from a GitHub Enterprise host, set AOE_GITHUB_CLONE_BASE to its base URL.

Trust and capabilities

Bundled plugins are builtin and fully trusted. Installed plugins are community and untrusted: their manifest declares the capabilities they need (network access, filesystem access, spawning processes, and so on), and install prompts you once to grant that exact set. Run non-interactively with --yes to grant without prompting. A capability this version of aoe does not recognize is rejected rather than granted; upgrade aoe.

A grant is pinned to the installed manifest. If an update expands what the plugin can do (new capabilities, changed build steps or UI slots, a runtime or trust change), it must be approved before the new version becomes active. You can approve in a terminal with aoe plugin update <id>, or in-app: the web dashboard’s plugin settings and the TUI plugin manager show an Update action that opens an approval popup describing exactly what changed. Declining keeps the current version active and stops the prompt from reappearing until the next version. The approval is pinned to the exact fetched content, so an update that changed since you reviewed it is refused rather than applied. aoe plugin install and aoe plugin update report the resolved trust level (featured, community, or local) in their success output, and aoe plugin list and aoe plugin info <id> show each plugin’s trust level and whether it is granted. An external plugin cannot use the reserved aoe.* / agent-of-empires.* id namespace.

Resolved versions live in <app_dir>/plugins.lock (the exact commit, manifest hash, and release asset per plugin), so an install is reproducible.

Running plugin code, per-plugin settings, and plugin-contributed UI land in follow-up releases.