mod doctor;
mod json;
mod new;
mod probes;
mod review;
mod shell;
mod skill;
use std::process::ExitCode;
use project_canon_core::{Archetype, EnvConfig, EnvConfigLayer, Model, Questionnaire};
fn main() -> ExitCode {
let args: Vec<String> = std::env::args().skip(1).collect();
match args.first().map(String::as_str) {
Some("doctor") => doctor::run(&args[1..]),
Some("new") => new::run(&args[1..]),
Some("review") => review::run(&args[1..]),
Some("skill") => skill::run(&args[1..]),
None | Some("--help") | Some("--version") => smoke_summary(),
Some(other) => {
eprintln!("project-canon: unknown subcommand or flag: {other:?}");
eprintln!("known verbs: doctor, new, review, skill");
ExitCode::from(2)
}
}
}
fn smoke_summary() -> ExitCode {
let model = Model::standard();
let cli_sections = model
.resolve(
&Questionnaire::builder(Archetype::Cli)
.all_conditionals_yes()
.build(),
)
.canon_section_set(&model)
.len();
let env_layer = match EnvConfigLayer::from_env_vars(&std::env::vars().collect()) {
Ok(layer) => layer,
Err(err) => {
eprintln!("project-canon: {err}");
return ExitCode::from(2); }
};
let cfg = EnvConfig::resolve(&[&EnvConfigLayer::empty(), &env_layer]);
let home = std::env::var("HOME").unwrap_or_else(|_| "~".to_string());
eprintln!(
"project-canon {}: model loaded ({} base dimensions; cli profile covers {} canon sections).",
env!("CARGO_PKG_VERSION"),
model.base_members().len(),
cli_sections,
);
eprintln!(
"env layer resolved (gh: {}; repo root: {}; {} family repos).",
cfg.gh_account,
EnvConfig::expand_home(&cfg.repo_root, &home),
cfg.family_repos().len(),
);
eprintln!(
"Run `project-canon doctor --help`, `project-canon new --help`, `project-canon review --help`, or `project-canon skill --help`."
);
ExitCode::SUCCESS
}