pub mod incremental;
pub mod label;
pub mod layered;
pub mod obsidian_detect;
pub mod project;
pub mod prompt_packet;
pub mod prompts_index;
pub mod role;
pub mod wiki_link;
use std::path::{Path, PathBuf};
use crate::graph::GraphDb;
#[derive(Debug, Clone)]
pub enum DocsTarget {
Local(PathBuf),
Vault(Option<PathBuf>),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DocsMode {
Full,
Incremental,
}
#[derive(Debug, Clone)]
pub struct DocsOptions {
pub prompt_packets: bool,
pub frontmatter: bool,
pub wiki_links_style: WikiLinkStyle,
pub include_dead_code: bool,
pub include_duplicates: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum WikiLinkStyle {
Obsidian,
Markdown,
}
impl Default for DocsOptions {
fn default() -> Self {
Self {
prompt_packets: true,
frontmatter: true,
wiki_links_style: WikiLinkStyle::Obsidian,
include_dead_code: true,
include_duplicates: true,
}
}
}
#[derive(Debug, Clone, Default)]
pub struct DocsReport {
pub output_dir: PathBuf,
pub module_notes_written: usize,
pub module_notes_skipped: usize,
pub index_notes_written: usize,
pub mode: &'static str,
}
pub fn generate_vault(
repo_path: &Path,
db: &GraphDb,
target: DocsTarget,
mode: DocsMode,
opts: &DocsOptions,
) -> anyhow::Result<DocsReport> {
let output_dir = match target {
DocsTarget::Local(p) => p,
DocsTarget::Vault(Some(p)) => p.join("cgx-docs"),
DocsTarget::Vault(None) => obsidian_detect::detect_default_vault()
.ok_or_else(|| {
anyhow::anyhow!(
"No Obsidian vault detected. Pass a path: `cgx docs --vault <path>`."
)
})?
.join("cgx-docs"),
};
layered::write_vault(repo_path, db, &output_dir, mode, opts)
}