feat(bootstrap): create temporary settings and config files to prevent data loss refactor(edit_log): switch from Vec to VecDeque for efficient memory management fix(gateway): ensure store directories are created before starting the API server refactor(bgbash): implement a global singleton for BashControl feat(auth): enhance session authentication middleware to use SessionRepository fix(edit_log_repo): update to use VecDeque for in-memory edit log storage fix(memory_repo): add newline escaping for frontmatter fields fix(session_lock_repo): improve error handling for lock file operations fix(bash_tools): prevent path traversal in job_id argument refactor(delete): enforce empty directory deletion in file system tools fix(edit): optimize string replacement to only replace the first occurrence fix(git_cred): improve credential management with piped input to git commands feat(git_operator): add safety filter to block destructive git operations fix(shell): register background jobs in Bash control feat(spawn): add access tier specification for pipeline stages refactor(hive_mind): run directives concurrently for improved performance fix(auth): update refresh token verification in the refresh handler fix(chat): optimize LLM client usage based on model matching fix(conversations): enhance message deletion to target specific indices feat(api): add JWT authentication middleware for all API routes fix(state): implement refresh token verification in JwtTokenService fix(daemon): improve usage tracking with saturating addition fix(tui): handle compacted messages in the TUI state management
45 lines
1.6 KiB
Rust
45 lines
1.6 KiB
Rust
//! Bootstrap binary — seeds initial system data idempotently.
|
|
//!
|
|
//! Creates default permissions, roles, and admin user if they don't
|
|
//! already exist. Run once after first deployment.
|
|
//!
|
|
//! Usage: cargo run --bin bootstrap
|
|
|
|
fn main() -> anyhow::Result<()> {
|
|
println!("Zesdex Bootstrap — seeding initial data...");
|
|
|
|
let store = zesdex_domain::core::Store::new();
|
|
store.ensure_dirs()?;
|
|
|
|
// Seed default settings if not present
|
|
let settings_path = store.base_dir.join("settings.json");
|
|
if !settings_path.exists() {
|
|
let settings = zesdex_domain::cms::Settings::default();
|
|
let content = serde_json::to_string_pretty(&settings)?;
|
|
let tmp = store.base_dir.join("settings.json.tmp");
|
|
std::fs::write(&tmp, &content)?;
|
|
std::fs::File::open(&tmp)?.sync_all()?;
|
|
std::fs::rename(&tmp, &settings_path)?;
|
|
println!(" ✓ Default settings created");
|
|
} else {
|
|
println!(" · Settings already exist, skipping");
|
|
}
|
|
|
|
// Seed default app config if not present
|
|
let config_path = store.base_dir.join("app_config.json");
|
|
if !config_path.exists() {
|
|
let config = zesdex_domain::cms::AppConfig::default();
|
|
let content = serde_json::to_string_pretty(&config)?;
|
|
let tmp = store.base_dir.join("app_config.json.tmp");
|
|
std::fs::write(&tmp, &content)?;
|
|
std::fs::File::open(&tmp)?.sync_all()?;
|
|
std::fs::rename(&tmp, &config_path)?;
|
|
println!(" ✓ Default app_config created");
|
|
} else {
|
|
println!(" · App config already exists, skipping");
|
|
}
|
|
|
|
println!("Bootstrap complete.");
|
|
Ok(())
|
|
}
|