Skip to main content

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/// API key presence check for `oo learn`.
61pub mod api_key;
62/// Command output classification and intelligent truncation.
63pub mod classify;
64/// Byte-bounded head+tail truncation, re-exported from [`classify`].
65mod classify_bounded;
66#[doc(hidden)]
67#[allow(missing_docs)]
68pub mod commands;
69/// Config and data directory resolution (`OO_CONFIG_DIR`, `OO_DATA_DIR`, or the platform dirs).
70mod config;
71/// Savings suffix for compressed indicator lines (shared by the render arms).
72mod display;
73/// Error types for oo operations.
74pub mod error;
75/// Command execution and output capture.
76pub mod exec;
77/// Failure-tier display and recall notice (used by `render_classification`).
78mod failure_display;
79#[doc(hidden)]
80#[allow(missing_docs)]
81pub mod help;
82/// Indexing of raw command output for `oo recall` (shared by the render arms).
83mod indexing;
84#[doc(hidden)]
85#[allow(missing_docs)]
86pub mod init;
87#[doc(hidden)]
88#[allow(missing_docs)]
89pub mod init_pi;
90/// LLM-powered pattern learning.
91pub mod learn;
92mod learn_payload;
93#[doc(hidden)]
94pub mod learn_status;
95/// Pattern matching and output compression.
96pub mod pattern;
97/// Canonical pattern-set assembly (project/user/builtins precedence) shared
98/// by the dispatch layer and the rewrite/hook feature modules.
99#[doc(hidden)]
100pub mod pattern_load;
101/// Retention of indexed output (`[store] retention` in config.toml).
102mod retention;
103/// Session tracking and management.
104pub mod session;
105/// Storage backends for indexed output.
106pub mod store;
107
108/// Claude Code PreToolUse hook processor + settings.json installer (issue #172).
109#[doc(hidden)]
110pub mod hook;
111pub mod recall_display;
112pub mod rewrite;
113
114pub mod commands_patterns;
115#[cfg(test)]
116#[path = "init_args_tests.rs"]
117mod init_args_tests;
118pub mod init_cmd;
119pub mod learn_prompt;
120mod learn_url;
121pub mod learn_utils;
122/// Static usage text for reserved subcommands (`--help` and `oo help <sub>`).
123#[doc(hidden)]
124pub mod usage;
125#[cfg(test)]
126#[path = "usage_tests.rs"]
127mod usage_tests;
128
129// CLI internals - hidden from documentation but accessible to binary crate
130#[doc(hidden)]
131#[allow(missing_docs)]
132pub mod util;
133
134// Re-exports for library users
135pub use classify::{Classification, classify};
136pub use config::warn_ignored_overrides;
137pub use error::Error;
138pub use exec::CommandOutput;
139pub use pattern::{Pattern, builtins, load_user_patterns};
140pub use store::{SessionMeta, Store};
141
142// CLI internals - re-exported for binary crate but hidden from documentation
143#[doc(hidden)]
144pub use commands::{
145    Action, InitFormat, InitMode, cmd_forget, cmd_help, cmd_hook, cmd_init, cmd_learn,
146    cmd_patterns, cmd_patterns_in, cmd_recall, cmd_rewrite, cmd_run, parse_action,
147    render_classification, try_index,
148};
149
150// Internal type re-exported for learn module
151#[doc(hidden)]
152pub use pattern::FailureSection;