pub mod parser;
pub mod project;
pub mod status;
pub mod task;
pub use project::{
create_local_project, create_project, delete_project_by_path, ensure_global_ai_config,
ensure_global_claude_md, get_data_dir, get_local_kanban_dir, get_projects_dir, init_data_dir,
list_local_project_dirs, list_project_dirs, load_project, load_project_config,
load_project_with_type, save_project_config,
};
pub use task::{delete_task, get_max_order_in_status, get_next_task_id, move_task, save_task};
use crate::models::{Project, ProjectType};
use anyhow::Result;
pub fn load_all_projects() -> Result<Vec<Project>> {
let config = crate::config::load_config().unwrap_or_default();
init_data_dir()?;
let mut projects = Vec::new();
let global_project_dirs = list_project_dirs()?;
for dir_name in global_project_dirs {
match load_project_with_type(&dir_name, ProjectType::Global) {
Ok(project) => {
if !crate::config::is_project_hidden(&config, &project.name) {
projects.push(project);
}
}
Err(e) => eprintln!("警告: 无法加载全局项目 {}: {}", dir_name.display(), e),
}
}
let local_project_dirs = list_local_project_dirs()?;
let current_local_dir = get_local_kanban_dir();
for dir_name in local_project_dirs {
match load_project_with_type(&dir_name, ProjectType::Local) {
Ok(project) => {
let is_current_dir = dir_name == current_local_dir;
if is_current_dir || !crate::config::is_project_hidden(&config, &project.name) {
projects.push(project);
}
}
Err(e) => eprintln!("警告: 无法加载本地项目 {}: {}", dir_name.display(), e),
}
}
Ok(projects)
}