1#![cfg_attr(feature = "mcp", allow(dead_code))]
2pub(crate) mod args;
6pub(crate) mod check;
7pub(crate) mod check_scenario;
8pub(crate) mod color;
9pub(crate) mod daemon;
10pub(crate) mod diff;
11pub(crate) mod extract;
12pub(crate) mod harness;
13pub(crate) mod langs;
14pub(crate) mod language_kinds;
15#[cfg(feature = "mcp")]
16pub(crate) mod live_control;
17pub(crate) mod manifest;
18#[cfg(feature = "mcp")]
19pub(crate) mod mcp;
20#[cfg(feature = "mcp")]
21pub(crate) mod mcp_command;
22pub(crate) mod page;
23pub(crate) mod query;
24pub(crate) mod rules;
25#[cfg(any(feature = "tui", feature = "mcp"))]
26pub(crate) mod session;
27pub(crate) mod shapes;
28pub(crate) mod stats;
29#[cfg(feature = "pretty")]
30pub(crate) mod tree;
31#[cfg(feature = "tui")]
32pub(crate) mod ui;
33#[cfg(feature = "tui")]
34pub(crate) mod ui_command;
35#[cfg(any(feature = "tui", feature = "mcp"))]
36pub(crate) mod views;
37#[cfg(any(feature = "tui", feature = "mcp"))]
38pub(crate) mod workspace_index;
39
40use std::io::Write;
41use std::process::ExitCode;
42
43#[cfg(any(feature = "tui", feature = "mcp"))]
44pub use args::LiveRefresh;
45#[cfg(feature = "mcp")]
46pub use args::McpArgs;
47#[cfg(feature = "tui")]
48pub use args::UiArgs;
49pub use args::{
50 Charset, CheckArgs, CheckFormat, Cli, CodexHarnessArgs, ColorChoice, Command, DaemonArgs,
51 DaemonCommand, DaemonRootArgs, DefaultRules, ExtractArgs, HarnessArgs, HarnessCommand,
52 HarnessToolBackend, HarnessToolFilesArgs, LangsArgs, LangsFormat, ManifestArgs, ManifestFormat,
53 MonikerFormat, OutputFormat, OutputMode, QueryArgs, RulesArgs, RulesCommand, RulesFileArgs,
54 RulesLearnArgs, RulesLearnFormat, RulesShowArgs, RulesShowFormat, ShapesArgs, StatsArgs,
55 StatsFormat,
56};
57pub use code_moniker_workspace::lang::{LangError, path_to_lang};
58pub use extract::{MatchSet, Predicate, RefMatch};
59
60pub(crate) const DEFAULT_SCHEME: &str = "code+moniker://";
61
62#[derive(Copy, Clone, Debug, Eq, PartialEq)]
63pub enum Exit {
64 Match,
65 NoMatch,
66 UsageError,
67}
68
69impl From<Exit> for ExitCode {
70 fn from(e: Exit) -> Self {
71 match e {
72 Exit::Match => ExitCode::SUCCESS,
73 Exit::NoMatch => ExitCode::from(1),
74 Exit::UsageError => ExitCode::from(2),
75 }
76 }
77}
78
79pub fn run<W1: Write, W2: Write>(cli: &Cli, stdout: &mut W1, stderr: &mut W2) -> Exit {
80 match &cli.command {
81 Command::Extract(args) => extract::run(args, stdout, stderr),
82 Command::Stats(args) => stats::run(args, stdout, stderr),
83 Command::Check(args) => check::run(args, stdout, stderr),
84 Command::Diff(args) => diff::run(args, stdout, stderr),
85 Command::Rules(args) => rules::run(args, stdout, stderr),
86 Command::Daemon(args) => daemon::run_daemon(args, stdout, stderr),
87 Command::Query(args) => query::run(args, stdout, stderr),
88 Command::Harness(args) => harness::run(args, stdout, stderr),
89 #[cfg(feature = "tui")]
90 Command::Ui(args) => ui_command::run(args, stdout, stderr),
91 #[cfg(feature = "mcp")]
92 Command::Mcp(args) => mcp_command::run(args, stdout, stderr),
93 Command::Langs(args) => langs::run(args, stdout, stderr),
94 Command::Shapes(args) => shapes::run(args, stdout, stderr),
95 Command::Manifest(args) => manifest::run(args, stdout, stderr),
96 }
97}