Putting all the packages together through the human-facing command surface.
The alembic CLI groups commands by purpose:
plan, forgeingest, distill, marketingrun, runs, propose, approve, reject, replaystatus, serve, cockpit, tui, tail, doctordocs, Forge publish gateMost commands accept --offline, --data-dir, and --json.
Think of it like… the control panel of a factory: every button maps to a subsystem, but the same underlying machinery runs them all.
apps/cli wires every package. runDistill uses @alembic/harness and @alembic/etl. runIngest uses @alembic/ingestion. runGoalPlan uses @alembic/forge, @alembic/vm, @alembic/swarm, @alembic/coda, and @alembic/loop-engineering. Commands return typed Result objects and render text or JSON.
# full offline cycle
alembic doctor
alembic plan "Add a /health endpoint"
alembic forge "Add a /health endpoint" --offline
alembic run --goal GOAL.md --plan alembic.plan.ts --yes --offline
alembic docs ./docs ./siteThe CLI uses Node's util.parseArgs and Zod for argument parsing. It expands ~ to $HOME, respects ALEMBIC_OFFLINE, and returns non-zero exit codes on failure. Every command is tested against the offline registry so the test suite stays hermetic.
Pick a small task and run the full offline cycle: doctor → plan → forge → run. Verify that the run directory contains all expected artifacts.