Persist settings, keybindings, and AGENTS.md from XDG config
Seeds empty files on first run. Mounted into the container so
pi picks them up as global configuration.
Assisted-by: Claude Opus 4.6 via pi
diff --git a/assets/compose.yml b/assets/compose.yml
index 5d90527..d64ab0f 100644
--- a/assets/compose.yml
+++ b/assets/compose.yml
@@ -9,3 +9,6 @@ services:
volumes:
- "${RAMEKIN_WORKSPACE:-.}:/workspace"
- "${RAMEKIN_DATA_DIR}:/root/.pi"
+ - "${RAMEKIN_CONFIG_DIR}/settings.json:/root/.pi/agent/settings.json"
+ - "${RAMEKIN_CONFIG_DIR}/keybindings.json:/root/.pi/agent/keybindings.json"
+ - "${RAMEKIN_CONFIG_DIR}/AGENTS.md:/root/.pi/agent/AGENTS.md"
diff --git a/src/main.rs b/src/main.rs
index d5dc0ec..a55ed14 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -45,7 +45,23 @@ fn run() -> Result<()> {
.create_data_directory("")
.wrap_err("failed to create pi data directory")?;
- info!(data = %pi_data_dir.display(), "pi data directory");
+ let pi_config_dir = xdg
+ .create_config_directory("")
+ .wrap_err("failed to create pi config directory")?;
+
+ // Seed empty config files if they don't exist
+ for file in ["settings.json", "keybindings.json"] {
+ let path = pi_config_dir.join(file);
+ if !path.exists() {
+ fs_err::write(&path, "{}")?;
+ }
+ }
+ let agents_md = pi_config_dir.join("AGENTS.md");
+ if !agents_md.exists() {
+ fs_err::write(&agents_md, "")?;
+ }
+
+ info!(data = %pi_data_dir.display(), config = %pi_config_dir.display(), "pi directories");
info!(workspace = %workspace.display(), "starting agent");
// Write embedded files to XDG cache so docker compose can find them
@@ -75,7 +91,8 @@ fn run() -> Result<()> {
.env("RAMEKIN_WORKSPACE", &workspace)
.env("RAMEKIN_DATA_DIR", &pi_data_dir)
.env("RAMEKIN_DOCKERFILE", &dockerfile)
- .env("RAMEKIN_BUILD_CONTEXT", &build_context);
+ .env("RAMEKIN_BUILD_CONTEXT", &build_context)
+ .env("RAMEKIN_CONFIG_DIR", &pi_config_dir);
Ok(cmd)
};