Skip to main content

apollo/
workspace_init.rs

1//! Workspace identity kit — minimal templates on first run.
2
3use std::path::Path;
4
5const SOUL: &str = "# SOUL\n\nBe direct, capable, and honest. Adapt tone to the user.\n";
6const USER: &str = "# USER\n\n(Add preferences, timezone, projects.)\n";
7const IDENTITY: &str = "# IDENTITY\n\nName: (assistant)\n";
8const MEMORY: &str = "# MEMORY\n\nCurated long-term notes. Use memory/*.md for daily logs.\n";
9const HEARTBEAT: &str =
10    "# HEARTBEAT\n\n<!-- Add `- [ ]` tasks the agent should check periodically -->\n";
11const NOW: &str = "# NOW\n\nCurrent focus and active threads.\n";
12const BRIEF_LOOPS: &str = "# Open loops\n\n- (none yet)\n";
13const BRIEF_TIME: &str = "# Time contexts\n\n- (none yet)\n";
14
15pub fn ensure_workspace_kit(workspace: &Path) -> std::io::Result<()> {
16    write_if_missing(&workspace.join("SOUL.md"), SOUL)?;
17    write_if_missing(&workspace.join("USER.md"), USER)?;
18    write_if_missing(&workspace.join("IDENTITY.md"), IDENTITY)?;
19    write_if_missing(&workspace.join("MEMORY.md"), MEMORY)?;
20    write_if_missing(&workspace.join("HEARTBEAT.md"), HEARTBEAT)?;
21    write_if_missing(&workspace.join("NOW.md"), NOW)?;
22    let mem = workspace.join("memory");
23    std::fs::create_dir_all(&mem)?;
24    write_if_missing(&mem.join("open-loops.md"), BRIEF_LOOPS)?;
25    write_if_missing(&mem.join("time-contexts.md"), BRIEF_TIME)?;
26    Ok(())
27}
28
29fn write_if_missing(path: &Path, content: &str) -> std::io::Result<()> {
30    if path.exists() {
31        return Ok(());
32    }
33    if let Some(parent) = path.parent() {
34        std::fs::create_dir_all(parent)?;
35    }
36    std::fs::write(path, content)
37}