Layout split
~/.objectiveai (overridable via OBJECTIVEAI_DIR) splits into two trees:
<OBJECTIVEAI_DIR> default: $HOME/.objectiveai
├── bin/ ── machine-wide, shared by every state ──
│ ├── objectiveai[.exe] (cli moves here from the root)
│ ├── objectiveai-api / -viewer / -mcp / -db [.exe]
│ ├── pg-bin/ (postgres install; was db-bin/)
│ ├── plugins/<owner>/<name>/<version>/
│ └── tools/<owner>/<name>/<version>/
└── state/<OBJECTIVEAI_STATE>/ default state: "default"
├── config.json
├── db/ .pgpass db.lock (the postgres cluster, per state)
├── logs/
└── instances/agents/
- bin = executables only: the five shipped binaries, the embedded-postgres install, installed plugins and tools.
- state = everything the runtime accumulates: config, the database (agents, agent instances, continuations, message queues, logs, tasks/schedules), function/profile caches — the works.
CONFIG_BASE_DIR is removed. Two env vars remain:
OBJECTIVEAI_DIR — root override, default $HOME/.objectiveai
OBJECTIVEAI_STATE — state name, default default, restricted to [A-Za-z0-9_-]+
Switching OBJECTIVEAI_STATE switches the entire world (database cluster included) while sharing one set of binaries — states are cheap, isolated, and coexist.
Why: states as profiles
The active state — database AND plugin/tool state, agents, agent instances, queues, schedules — is captured in one directory: a single self-contained profile. That unlocks:
- Snapshotting (future): freeze
state/<name>/ (cluster + config + registry) as an artifact; restore or fork it later.
- Sharing (future): hand a prepared state to someone else — a state that comes pre-loaded with tools and plugin state and agents and agent instances and whatnot, ready to run.
- Per-project / per-experiment states without container gymnastics; the test suite itself runs one shared
OBJECTIVEAI_DIR with a state per test.
Status
The layout split + env model is being implemented now (filesystem resolution, objectiveai-db pg-bin/cluster split, spawn env forwarding, installers, test harness). Snapshot/share tooling is follow-up work tracked by this issue.
🤖 Generated with Claude Code
Layout split
~/.objectiveai(overridable viaOBJECTIVEAI_DIR) splits into two trees:CONFIG_BASE_DIRis removed. Two env vars remain:OBJECTIVEAI_DIR— root override, default$HOME/.objectiveaiOBJECTIVEAI_STATE— state name, defaultdefault, restricted to[A-Za-z0-9_-]+Switching
OBJECTIVEAI_STATEswitches the entire world (database cluster included) while sharing one set of binaries — states are cheap, isolated, and coexist.Why: states as profiles
The active state — database AND plugin/tool state, agents, agent instances, queues, schedules — is captured in one directory: a single self-contained profile. That unlocks:
state/<name>/(cluster + config + registry) as an artifact; restore or fork it later.OBJECTIVEAI_DIRwith a state per test.Status
The layout split + env model is being implemented now (filesystem resolution, objectiveai-db pg-bin/cluster split, spawn env forwarding, installers, test harness). Snapshot/share tooling is follow-up work tracked by this issue.
🤖 Generated with Claude Code