Skip to content

Command line (aop)

PulseAd’s command line is aop (also aop-hermes) — the Agentic Operations CLI that staff use to drive Amazon ad accounts from a terminal. It gives each brand a workspace wired to the Pulse Library, the AOP Memory API, Snowflake/Aurora, and the bundled Amazon Ads / AMC / analytics tools.

aop is installed with uv from GitHub. Prerequisites: uv, Python 3.11 (managed by uv), and a local Pulse Library (the Obsidian vault with docs/<BRAND_CODE> folders) set up first.

Terminal window
# 1. install uv (if you don't have it)
curl -LsSf https://astral.sh/uv/install.sh | sh
# 2. install the aop CLI from GitHub main
uv python install 3.11
uv tool install --python 3.11 "git+https://github.com/PulseAd/aop-hermes.git@main"
uv tool update-shell # put `aop` on PATH, then open a new shell
# 3. verify
aop --version
aop --help

State lives under $AOP_HOME (default ~/.aop-hermes): launcher.json (Pulse Library root), shared.env (Memory API + Snowflake/Aurora), workspaces.json, the model home, and .secrets/. Per-brand workspaces live under ~/aop-workspaces/<BRAND_CODE>.

Upgrades: aop update (self-updates a uv tool install from main). Remove with uv tool uninstall aop-hermes — note aop clean resets state but keeps the binary.

One command wires everything up: aop setup. It walks three sections, then registers the shared GENERAL workspace and runs doctor.

aop setup — connecting the Pulse Library, Memory API, and model, then the doctor report

What it connects:

  1. Pulse Library — where the brand docs live (docs/<BRAND_CODE>); saved to launcher.json.
  2. AOP Memory API — base URL + API key (the brand-memory backend); saved to shared.env.
  3. Model / provider / auth — pick a provider + model and authenticate (managed by Hermes).
Terminal window
aop setup # interactive: pulse-library + memory + model, then doctor
aop setup --json # status check only — print the doctor report, no prompts
# reconfigure one piece at a time
aop setup pulse-library
aop setup memory --base-url https://memory.internal.pulsead.io --api-key <KEY>
aop setup model # opens the model picker

Run aop with no arguments for the interactive launcher, or launch a brand directly.

aop — the interactive workspace launcher listing GENERAL and per-brand workspaces

Terminal window
aop # interactive launcher — pick or create a workspace
aop launch ACME # launch directly into the ACME brand workspace
aop launch ACME -- <hermes args> # pass extra args through to Hermes
aop launch ACME --no-update # skip the self-update preflight

Workspaces come in two kinds: general (the shared GENERAL workspace) and brand. A brand’s scope code is normalized (uppercased, e.g. ACME), maps to docs/<BRAND_CODE> in the Pulse Library, and gets its own isolated HERMES_HOME so logs/state/config stay separate per brand. On first launch, brand specialist profiles and brand memory are set up automatically.

Get started

$ aop

Open the interactive workspace launcher

$ aop --version aop --help

Version / full command surface

$ aop setup
--json--pulse-library-root

Configure pulse-library + memory + model, register GENERAL, run doctor

$ aop setup pulse-library | memory | model

Reconfigure just that piece

Launch & workspaces

$ aop launch <SCOPE>
--kind--profile--home--auto-create--no-update

Launch Hermes in a workspace

$ aop workspace list ws ls
--all--json

List workspaces

$ aop workspace create <SCOPE>
--kind brand|general--display-name--profile

Create a workspace

$ aop workspace show | edit | archive | restore <SCOPE>

Inspect / edit / archive / restore a workspace

⦿Connect

$ aop memory status
--scope--json

Check the AOP Memory API

$ aop memory setup
--base-url--api-key

Save Memory API settings

$ aop model show

Show the source home and its global model

$ aop model set <model> aop model edit
--provider

Set / interactively edit model + auth

Profiles & skills

$ aop profiles list | plan | install | verify | relink

Manage bundled specialist profiles

$ aop profiles sync-skills aop sync-skills

Sync bundled PulseAd skills into profiles

Maintain

$ aop update
--check

Self-update the CLI from GitHub main, then sync skills

$ aop clean --dry-run aop clean --yes

Show / perform a reset of $AOP_HOME + AOP workspaces

  • Pulse Library — brand docs at <root>/docs/<BRAND_CODE>, mounted into each workspace as WIKI_PATH.
  • AOP Memory API — the brand-memory backend (bootstrap, brand context, tasks, inbox), surfaced to agents as aop-memory tools.
  • Snowflake (SNOWFLAKE_* + an RSA key) and Aurora/MySQL (AURORA_*) — for the analytics tools.
  • Bundled aop-tools — Amazon Ads, AMC, analytics, pacing, RTB, reports, and more (Node + in-process), exposed via AOP_TOOLS_ROOT.

aop is the only installable CLI. The other repos expose repo-local runners and task-runners for developers and ops, not packaged CLIs:

  • pulsead-agents — run an agent directly, e.g. python -m agents.campaign_health.pipeline <BRAND> or python -m agents.weekly_report.pipeline <BRAND> --publish; the ops console is a FastAPI server (uvicorn web.backend.main:app).
  • snowflake-semantic-agent — local dispatch via python src/main.py <payload.json> (dry-run by default), plus scripts/*.py smoke/regeneration tools.
  • ai-api — no CLI binary; a Makefile (make dev / test / lint) runs the FastAPI app, and ./deploy.sh builds and deploys it.