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 helpers::{
13    create_and_init_vault, load_and_resolve_workspace, load_settings, resolve_quick_note_path,
14};
15use kimun_core::NoteVault;
16use output::OutputFormat;
17
18#[derive(Subcommand)]
19pub enum CliCommand {
20    /// Search notes by query
21    Search {
22        query: String,
23        #[arg(long, value_enum, default_value = "text")]
24        format: OutputFormat,
25    },
26    /// List all notes
27    Notes {
28        #[arg(long, help = "Filter notes by path prefix")]
29        path: Option<String>,
30        #[arg(long, value_enum, default_value = "text")]
31        format: OutputFormat,
32    },
33    /// Manage workspaces
34    Workspace {
35        #[command(subcommand)]
36        subcommand: WorkspaceSubcommand,
37    },
38    /// Note operations (create, append, journal)
39    Note {
40        #[command(subcommand)]
41        subcommand: NoteSubcommand,
42    },
43}
44
45pub async fn run_cli(command: CliCommand, config_path: Option<std::path::PathBuf>) -> Result<()> {
46    match command {
47        CliCommand::Workspace { subcommand } => {
48            let mut settings = load_settings(config_path)?;
49            commands::workspace::run(subcommand, &mut settings).await
50        }
51        CliCommand::Note { subcommand } => {
52            let (settings, workspace_path, workspace_name) =
53                load_and_resolve_workspace(config_path)?;
54            let quick_note_path = resolve_quick_note_path(&settings);
55            let vault = NoteVault::new(&workspace_path).await?;
56            match vault.validate().await? {
57                kimun_core::db::DBStatus::Ready => {
58                    commands::note_ops::run(subcommand, &vault, &quick_note_path, &workspace_name)
59                        .await
60                }
61                status => Err(eyre!(
62                    "Workspace index is not ready ({status}).\nRun `kimun workspace reindex` to initialise it."
63                )),
64            }
65        }
66        CliCommand::Search { query, format } => {
67            let (vault, workspace_name) = create_and_init_vault(config_path).await?;
68            commands::search::run(&vault, &query, format, &workspace_name, false).await
69        }
70        CliCommand::Notes { path, format } => {
71            let (vault, workspace_name) = create_and_init_vault(config_path).await?;
72            commands::notes::run(&vault, path.as_deref(), format, &workspace_name, false).await
73        }
74    }
75}