use anyhow::{Context, Result};
use cqs::Embedder;
use crate::cli::{find_project_root, Cli};
pub(crate) fn cmd_init(cli: &Cli) -> Result<()> {
let _span = tracing::info_span!("cmd_init").entered();
let root = find_project_root();
let cqs_dir = root.join(cqs::INDEX_DIR);
if !cli.quiet {
println!("Initializing cqs...");
}
std::fs::create_dir_all(&cqs_dir).context("Failed to create .cqs directory")?;
#[cfg(unix)]
{
use std::os::unix::fs::PermissionsExt;
if let Err(e) = std::fs::set_permissions(&cqs_dir, std::fs::Permissions::from_mode(0o700)) {
tracing::debug!(error = %e, "Failed to set .cqs directory permissions");
}
}
let gitignore = cqs_dir.join(".gitignore");
std::fs::write(
&gitignore,
"index.db\nindex.db-wal\nindex.db-shm\nindex.lock\nindex.hnsw.graph\nindex.hnsw.data\nindex.hnsw.ids\nindex.hnsw.checksum\nindex.hnsw.lock\n*.tmp\n",
)
.context("Failed to create .gitignore")?;
if !cli.quiet {
let size = if cli.try_model_config()?.dim >= 1024 {
"~1.3GB"
} else {
"~547MB"
};
println!("Downloading model ({size})...");
}
let embedder =
Embedder::new(cli.try_model_config()?.clone()).context("Failed to initialize embedder")?;
if !cli.quiet {
println!("Detecting hardware... {}", embedder.provider());
}
embedder.warm()?;
if !cli.quiet {
println!("Created .cqs/");
println!();
println!("Run 'cqs index' to index your codebase.");
}
Ok(())
}