Skip to content
Theme:

User and Project Settings

Aether loads settings from two locations — user level and project level — and merges them into a single resolved configuration.

  • Directory$HOME/.aether/
    • settings.json — Shared across all projects

User-level settings live in $HOME/.aether/settings.json. Set the AETHER_HOME environment variable to use a different directory:

Terminal window
export AETHER_HOME=/custom/path/.aether

Generate a user-level settings file with the interactive wizard:

Terminal window
aether settings init --user

Paths in user settings resolve from the Aether home directory ($HOME/.aether by default):

$HOME/.aether/settings.json
{
"agents": [
{
"name": "Planner",
"description": "Plans work across any workspace",
"model": "anthropic:claude-sonnet-4-5-20250929",
"userInvocable": true,
"prompts": ["planner/SYSTEM.md"],
"mcps": ["mcp.json"]
}
]
}

Here planner/SYSTEM.md resolves to $HOME/.aether/planner/SYSTEM.md, and mcp.json resolves to $HOME/.aether/mcp.json.

  • Directorymy-project/.aether/
    • settings.json — Specific to this project

Project-level settings are optional and live in my-project/.aether/settings.json.

Generate a project-level settings file with the interactive wizard:

Terminal window
aether settings init --project

Plain relative paths in project settings resolve from the workspace root (the directory containing .aether/):

.aether/settings.json
{
"agents": [
{
"name": "Build",
"description": "Builds features",
"model": "anthropic:claude-sonnet-4-5-20250929",
"userInvocable": true,
"prompts": ["AGENTS.md"],
"mcps": [".aether/mcp.json"]
}
]
}

Here AGENTS.md resolves to <workspace-root>/AGENTS.md.

aether settings init runs an interactive wizard by default. Pass flags to answer the prompts non-interactively, which is useful for scripts and CI:

FlagDescription
--user / --projectRequired. Choose the settings scope.
--path <dir>Project directory to initialize (defaults to .). Only with --project.
--provider <name>Provider to use, e.g. anthropic, codex, or bedrock. Skips the provider prompt.
--preset <name>minimal (a single agent with bash and skills tools) or batteries-included (Plan, Build, and Explore agents wired to the built-in MCP servers). Skips the preset prompt.
--harness <name>Harness conventions to auto-load with batteries-included. Repeatable: claude, agents.
--forceOverwrite an existing settings file at the selected target.
Terminal window
# Batteries-included project setup, fully non-interactive
aether settings init --project \
--provider anthropic \
--preset batteries-included \
--harness claude --harness agents

All resource paths support $VAR / ${VAR} variable expansion. This lets user-level settings reference project files without knowing the project’s location.

Use this for prompt files and MCP config files that should be loaded up front. Do not use prompts to load read-triggered rules; rule artifacts are loaded automatically by the MCP servers when their read globs match.

${WORKSPACE} always resolves to the current workspace root — the project directory you launched Aether from.

$HOME/.aether/settings.json
{
"agents": [
{
...
"prompts": [
"BUILD.md",
{ "type": "file", "path": "${WORKSPACE}/AGENTS.md", "optional": true }
],
"mcps": [
"mcp.json",
{ "type": "file", "path": "${WORKSPACE}/.aether/mcp.json", "optional": true }
]
}
]
}

In this example:

  • BUILD.md loads from $HOME/.aether/BUILD.md (user home).
  • ${WORKSPACE}/AGENTS.md loads from the current project’s root.
  • ${WORKSPACE}/.aether/mcp.json loads the project’s MCP config.
  • The optional flag means the agent still works in projects that don’t have these files.

Settings can be passed directly via the --settings-json CLI flag. This bypasses file loading and uses the same schema:

Terminal window
aether headless \
--settings-json '{
"agent": "Hello",
"agents": [
{
"name": "Hello",
"description": "A minimal hello world agent",
"model": "zai:glm-5.1",
"userInvocable": true,
"prompts": [
{
"type": "text",
"text": "You are a friendly assistant."
}
]
}
]
}' \
"Say hello"

Inline settings are merged on top of file-based settings using the same rightmost-wins rules.

Define a general-purpose agent in user settings and let projects extend it:

$HOME/.aether/settings.json
{
"agents": [
{
"name": "Build",
"description": "Builds features and fixes bugs",
"model": "anthropic:claude-sonnet-4-5-20250929",
"reasoningEffort": "high",
"userInvocable": true,
"prompts": [
"BUILD.md",
{ "type": "file", "path": "${WORKSPACE}/AGENTS.md", "optional": true }
],
"mcps": [
{ "type": "file", "path": "mcp.json", "proxy": true },
{
"type": "file",
"path": "${WORKSPACE}/.aether/mcp.json",
"optional": true,
"proxy": true
}
]
}
]
}

This agent loads its base system prompt and MCP config from the user’s Aether home, then optionally adds project-level instructions and MCP servers when they exist.

Commit .aether/settings.json and .aether/mcp.json to version control so every team member gets the same agent configuration:

.aether/settings.json
{
"agent": "Build",
"agents": [
{
"name": "Build",
"description": "Builds features for this project",
"model": "anthropic:claude-sonnet-4-5-20250929",
"userInvocable": true,
"prompts": [".aether/BUILD.md", "AGENTS.md"],
"mcps": [".aether/mcp.json"]
}
]
}