1pub mod commands;
3pub mod helpers;
4pub mod json_output;
5pub mod metadata_extractor;
6pub mod output;
7
8use clap::Subcommand;
9use color_eyre::eyre::{Result, eyre};
10use commands::note_ops::NoteSubcommand;
11use commands::workspace::WorkspaceSubcommand;
12use commands::JournalArgs;
13use helpers::{
14 create_and_init_vault, load_and_resolve_workspace, load_settings, resolve_quick_note_path,
15};
16use kimun_core::NoteVault;
17use output::OutputFormat;
18
19#[derive(Subcommand)]
20pub enum CliCommand {
21 Search {
23 query: String,
24 #[arg(long, value_enum, default_value = "text")]
25 format: OutputFormat,
26 },
27 Notes {
29 #[arg(long, help = "Filter notes by path prefix")]
30 path: Option<String>,
31 #[arg(long, value_enum, default_value = "text")]
32 format: OutputFormat,
33 },
34 Workspace {
36 #[command(subcommand)]
37 subcommand: WorkspaceSubcommand,
38 },
39 Note {
41 #[command(subcommand)]
42 subcommand: NoteSubcommand,
43 },
44 Journal(JournalArgs),
46 Mcp,
48}
49
50pub async fn run_cli(command: CliCommand, config_path: Option<std::path::PathBuf>) -> Result<()> {
51 match command {
52 CliCommand::Workspace { subcommand } => {
53 let mut settings = load_settings(config_path)?;
54 commands::workspace::run(subcommand, &mut settings).await
55 }
56 CliCommand::Note { subcommand } => {
57 let (settings, workspace_path, workspace_name) =
58 load_and_resolve_workspace(config_path)?;
59 let quick_note_path = resolve_quick_note_path(&settings);
60 let vault = NoteVault::new(&workspace_path).await?;
61 match vault.validate().await? {
62 kimun_core::db::DBStatus::Ready => {
63 commands::note_ops::run(subcommand, &vault, &quick_note_path, &workspace_name)
64 .await
65 }
66 status => Err(eyre!(
67 "Workspace index is not ready ({status}).\nRun `kimun workspace reindex` to initialise it."
68 )),
69 }
70 }
71 CliCommand::Search { query, format } => {
72 let (vault, workspace_name) = create_and_init_vault(config_path).await?;
73 commands::search::run(&vault, &query, format, &workspace_name, false).await
74 }
75 CliCommand::Notes { path, format } => {
76 let (vault, workspace_name) = create_and_init_vault(config_path).await?;
77 commands::notes::run(&vault, path.as_deref(), format, &workspace_name, false).await
78 }
79 CliCommand::Journal(args) => {
80 let (vault, workspace_name) = create_and_init_vault(config_path).await?;
81 commands::journal::run(args, &vault, &workspace_name).await
82 }
83 CliCommand::Mcp => commands::mcp::run(config_path).await,
84 }
85}