Skip to main content

kimun_notes/cli/
mod.rs

1// tui/src/cli/mod.rs
2pub 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 notes by query
22    Search {
23        query: String,
24        #[arg(long, value_enum, default_value = "text")]
25        format: OutputFormat,
26    },
27    /// List all notes
28    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    /// Manage workspaces
35    Workspace {
36        #[command(subcommand)]
37        subcommand: WorkspaceSubcommand,
38    },
39    /// Note operations (create, append, show)
40    Note {
41        #[command(subcommand)]
42        subcommand: NoteSubcommand,
43    },
44    /// Append to or show journal entries
45    Journal(JournalArgs),
46    /// Start the MCP server (stdio transport)
47    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}