Non-interactive, scriptable control of an Aeon repo — the dashboard's features as
plain commands. Every command reuses apps/dashboard/lib, so the CLI and the
dashboard's /api/* routes return identical data from one source of truth.
apps/cli/aeon <command> [subcommand] [--json]
The dashboard (./aeon) is a local web console. The CLI is the same capabilities
without a browser or a running server — good for scripts, CI, ssh, and quick
checks. It shells out to the same gh + git the dashboard does.
No separate setup for the repo owner — the launcher self-installs a tiny runtime
(tsx + yaml, ~12MB) into apps/cli/node_modules on first run. It does not
require the full dashboard app to be installed.
The shortest way to run it is the repo-root ./aeon: bare ./aeon launches
the web dashboard, and ./aeon <command> … runs this CLI.
./aeon skills ls # ← same as ./apps/cli/aeon skills ls
./aeon skills disable heartbeat --dry-run
./aeon # (no args) launches the dashboardOr put it on your PATH as aeon to drop the ./:
ln -s "$PWD/apps/cli/aeon" /usr/local/bin/aeon # or: (cd apps/cli && npm link)
aeon skills lsThe launcher pins the repo it manages via AEON_REPO_ROOT, so aeon works from
any directory — and you can set AEON_REPO_ROOT yourself to target a different
Aeon checkout. It uses your authenticated gh CLI for the commands that touch
GitHub (runs, secrets, auth, skills run, …).
| Command | What it shows |
|---|---|
aeon skills ls [--enabled] [--pack <k>] · aeon skills <name> |
roster + per-skill detail |
aeon runs ls [--limit <n>] · aeon runs logs <id> |
recent runs + a run's Run-step/## Summary |
aeon secrets ls [--set] [--unset] |
credential vault — names + set-state, never values |
aeon config show |
model / harness / gateway / repo from aeon.yml |
aeon memory [logs|topics|issues|search] … |
the agent's persistent memory |
aeon packs ls |
first-party + community skill packs |
aeon mcp ls · aeon mcp catalog |
configured MCP servers + the featured catalog |
aeon strategy show · aeon soul show |
STRATEGY.md · soul/SOUL.md + STYLE.md |
These edit aeon.yml / .mcp.json (commit + push to origin, so scheduled
runs pick the change up), call gh (secrets/auth), or dispatch a workflow.
| Command | Effect |
|---|---|
aeon skills enable|disable <name> |
toggle a skill in aeon.yml |
aeon skills schedule <name> "<cron>" |
set its schedule |
aeon skills set <name> [--var|--model|--harness] |
set per-skill fields |
aeon skills rm <name> --yes |
delete the skill dir + config entry |
aeon skills run <name> [--var|--model] |
dispatch a run (gh workflow run aeon.yml) |
aeon secrets set <NAME> --stdin · aeon secrets rm <NAME> |
manage secrets via gh |
aeon auth --oauth | --key <k> [--provider|--base-url] |
set Claude auth |
aeon sync [--status] |
commit + push local changes |
aeon config set model|harness|gateway <v> |
set top-level config |
aeon strategy set --stdin|--file · aeon strategy build "<goal>" |
write / regenerate STRATEGY.md |
aeon soul build [--handle|--name|--links] |
dispatch soul-builder |
aeon packs install <owner/repo> [slugs…] |
install a community pack (auto-merging PR) |
aeon mcp add <slug> | <name> <url> · aeon mcp rm <name> |
edit .mcp.json |
aeon telegram register |
re-register the bot / command menu |
Add --json to any command for machine-readable output, --dry-run to any
write to preview it without touching anything, and --help per command.
Exit code is non-zero on error.
- Every command imports
apps/dashboard/libdirectly —config.ts,gh.ts,github.ts,frontmatter.ts,memory.ts,gateway.ts,auth-provider.ts,mcp-catalog.ts,types.ts. - Route-embedded logic was lifted into shared lib so the dashboard routes and
the CLI call the same functions (no duplication to drift):
skills.ts(roster merge),runs.ts(run filter + log parsing),secrets-catalog.ts(credential catalog + set/delete side-effects),run-skill.ts(dispatch),builders.ts(strategy/soul briefs),sync.ts(git),auth.ts(auth flow),packs.ts(pack join). Ten routes now wrap these. apps/dashboard/lib/gh.tshonoursAEON_REPO_ROOTso the shared lib is location-independent (unset = the dashboard's original cwd-relative behaviour).
(cd ../dashboard && npm ci) # the CLI borrows the dashboard's typescript + @types
npm ci && npm run typecheck # strict; compiles src/ plus the shared dashboard libBecause tsconfig.json compiles ../dashboard/lib/**/*.ts and points
typeRoots at that app, the CLI has no typescript dependency of its own and
cannot be typechecked without the dashboard's node_modules. CI does exactly
the two installs above — see .github/workflows/ci-apps.yml.