mod commands;
mod config;
mod git;
mod paths;
mod registry;
mod render;
mod runner;
mod scanner;
mod state;
mod template;
mod worker;
use anyhow::Result;
use clap::{Parser, Subcommand};
use std::path::PathBuf;
#[derive(Parser)]
#[command(name = "devist")]
#[command(version, about = "Project bootstrap CLI for AI-assisted development")]
struct Cli {
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
enum Commands {
Doctor,
About,
Setup,
Template {
#[command(subcommand)]
cmd: commands::template::TemplateCmd,
},
Project {
#[command(subcommand)]
cmd: commands::project::ProjectCmd,
},
Init {
name: String,
#[arg(short, long)]
template: String,
#[arg(long)]
path: Option<PathBuf>,
#[arg(long = "var", value_name = "KEY=VALUE")]
vars: Vec<String>,
},
Start {
name: String,
#[arg(long)]
dev: bool,
},
Stop {
name: Option<String>,
},
Worker {
#[command(subcommand)]
cmd: commands::worker::WorkerCmd,
},
}
fn main() -> Result<()> {
let cli = Cli::parse();
match cli.command {
Commands::Doctor => commands::doctor::run(),
Commands::About => commands::about::run(),
Commands::Setup => commands::init_workspace::run(),
Commands::Template { cmd } => commands::template::run(cmd),
Commands::Project { cmd } => commands::project::run(cmd),
Commands::Init {
name,
template,
path,
vars,
} => commands::init::run(name, template, path, vars),
Commands::Start { name, dev } => commands::start::run(name, dev),
Commands::Stop { name } => commands::stop::run(name),
Commands::Worker { cmd } => commands::worker::run(cmd),
}
}