PI_CODING_AGENT_DIR points at the agent dir, not the `.pi` home
If you copy pi's default config to a custom dir and it silently "doesn't work at all" (no auth, no models), you probably pointed PI_CODING_AGENT_DIR one level too high.
The trap is that pi's default and its env override are asymmetric:
- Default (no env var): the agent dir is
~/.pi/agent. Yourauth.json/models.jsonlive in~/.pi/agent/. - Override:
PI_CODING_AGENT_DIRis used verbatim as the agent dir — no/agentis appended.
So this looks right but isn't:
# WRONG: pi reads ~/.piz/auth.json (empty) and ~/.piz/models.json (missing)
PI_CODING_AGENT_DIR=~/.piz pi
# even though your real config is in ~/.piz/agent/
The fix is to point the variable at the agent leaf, mirroring the default layout:
PI_CODING_AGENT_DIR=~/.piz/agent pi
The relevant resolution (packages/coding-agent/src/config.ts):
export function getAgentDir(): string {
const envDir = process.env[ENV_AGENT_DIR];
if (envDir) return expandTildePath(envDir); // used as-is
return join(homedir(), CONFIG_DIR_NAME, "agent"); // default appends "/agent"
}
This feels weird next to .claude/.codex/.copilot, which keep their config flat in one dir and have no hidden subdir. But the name is the giveaway: it's PI_CODING_AGENT_DIR, not PI_HOME. It names the agent directory itself — the leaf, equivalent to ~/.pi/agent. The flat behavior is exactly what the name promises.
Once you read it that way the design makes sense: ~/.pi is just a home/container, and you can park several independent agent dirs under it (~/.pi/agent, ~/.pi/work, ~/.pi/personal) and switch between them with the env var.