double_o/lib.rs
1// SPDX-License-Identifier: Apache-2.0
2#![warn(missing_docs)]
3
4//! `oo` (double-o) — a context-efficient command runner for AI coding agents.
5//!
6//! This library helps AI agents run shell commands efficiently by classifying output
7//! and reducing context usage. Commands are executed, their output is analyzed, and
8//! results are compressed using pattern matching and intelligent categorization.
9//!
10//! # Core Concepts
11//!
12//! - **Classification**: Commands are categorized into four tiers based on success/failure
13//! and output size. Small successful outputs pass through verbatim, while large outputs
14//! are pattern-matched to extract terse summaries or indexed for later recall.
15//! - **Patterns**: Regular expressions define how to extract summaries from command output.
16//! Built-in patterns exist for common tools (pytest, cargo test, npm test, etc.).
17//! Custom patterns can be loaded from project-local `<git-root>/.oo/patterns/` or
18//! user-global TOML files in the user patterns directory (project patterns take precedence).
19//! - **Storage**: Large unpatterned outputs are stored in a searchable database (SQLite by
20//! default, with optional Vipune semantic search). Stored outputs can be recalled with
21//! full-text search.
22//! - **Categories**: Commands are auto-detected as Status (tests, builds, linters),
23//! Content (git show, diff, cat), Data (git log, ls, gh), or Unknown. This determines
24//! default behavior when no pattern matches.
25//!
26//! # Example
27//!
28//! ```
29//! use double_o::{classify, Classification, CommandOutput, Pattern};
30//! use double_o::pattern::builtins;
31//!
32//! // Run a command
33//! let args = vec!["echo".into(), "hello".into()];
34//! let output = double_o::exec::run(&args).unwrap();
35//!
36//! // Classify the output
37//! let command = "echo hello";
38//! let patterns = builtins(); // or load_user_patterns(&path)
39//! let result = classify(&output, command, &patterns);
40//!
41//! match result {
42//! Classification::Passthrough { output } => {
43//! println!("Output: {}", output);
44//! }
45//! Classification::Success { label, summary } => {
46//! println!("✓ {}: {}", label, summary);
47//! }
48//! Classification::Failure { label, output, .. } => {
49//! println!("✗ {}: {}", label, output);
50//! }
51//! Classification::Bounded { label, size, .. } => {
52//! println!("Bounded: {} ({} bytes)", label, size);
53//! }
54//! Classification::Large { label, size, .. } => {
55//! println!("Indexed: {} ({} bytes)", label, size);
56//! }
57//! }
58//! ```
59
60/// Command output classification and intelligent truncation.
61pub mod classify;
62#[doc(hidden)]
63#[allow(missing_docs)]
64pub mod commands;
65/// Config directory resolution (`OO_CONFIG_DIR` or the platform config dir).
66mod config;
67/// Savings suffix for compressed indicator lines (shared by the render arms).
68mod display;
69/// Error types for oo operations.
70pub mod error;
71/// Command execution and output capture.
72pub mod exec;
73/// Failure-tier display and recall notice (used by `render_classification`).
74mod failure_display;
75#[doc(hidden)]
76#[allow(missing_docs)]
77pub mod help;
78/// Indexing of raw command output for `oo recall` (shared by the render arms).
79mod indexing;
80#[doc(hidden)]
81#[allow(missing_docs)]
82pub mod init;
83#[doc(hidden)]
84#[allow(missing_docs)]
85pub mod init_pi;
86/// LLM-powered pattern learning.
87pub mod learn;
88/// Pattern matching and output compression.
89pub mod pattern;
90/// Canonical pattern-set assembly (project/user/builtins precedence) shared
91/// by the dispatch layer and the rewrite/hook feature modules.
92#[doc(hidden)]
93pub mod pattern_load;
94/// Retention of indexed output (`[store] retention` in config.toml).
95mod retention;
96/// Session tracking and management.
97pub mod session;
98/// Storage backends for indexed output.
99pub mod store;
100
101/// Claude Code PreToolUse hook processor + settings.json installer (issue #172).
102#[doc(hidden)]
103pub mod hook;
104pub mod recall_display;
105pub mod rewrite;
106
107pub mod commands_patterns;
108#[cfg(test)]
109#[path = "init_args_tests.rs"]
110mod init_args_tests;
111pub mod init_cmd;
112pub mod learn_prompt;
113pub mod learn_utils;
114/// Static usage text for reserved subcommands (`--help` and `oo help <sub>`).
115#[doc(hidden)]
116pub mod usage;
117#[cfg(test)]
118#[path = "usage_tests.rs"]
119mod usage_tests;
120
121// CLI internals - hidden from documentation but accessible to binary crate
122#[doc(hidden)]
123#[allow(missing_docs)]
124pub mod util;
125
126// Re-exports for library users
127pub use classify::{Classification, classify};
128pub use error::Error;
129pub use exec::CommandOutput;
130pub use pattern::{Pattern, builtins, load_user_patterns};
131pub use store::{SessionMeta, Store};
132
133// CLI internals - re-exported for binary crate but hidden from documentation
134#[doc(hidden)]
135pub use commands::{
136 Action, InitFormat, InitMode, check_and_clear_learn_status, cmd_forget, cmd_help, cmd_hook,
137 cmd_init, cmd_learn, cmd_patterns, cmd_patterns_in, cmd_recall, cmd_rewrite, cmd_run,
138 parse_action, render_classification, try_index, write_learn_status,
139};
140
141// Internal type re-exported for learn module
142#[doc(hidden)]
143pub use pattern::FailureSection;