Expand description
§aptu-core
Core library for Aptu - AI-Powered Triage Utility.
§Features
- AI Triage - Analyze issues with summaries, labels, and contributor guidance
- PR Review - AI-powered pull request analysis with full file content and multi-language AST context (Rust, Python, Go, Java, TypeScript, TSX, JavaScript, C, C++, C#, Fortran)
- Security Scanning - Built-in security pattern detection with SARIF output
- Multiple Providers -
OpenRouter(default), Cerebras, Groq, Gemini,Z.AI, andZenMux - GitHub Integration - Auth, issues, PRs, and GraphQL queries
- Resilient - Exponential backoff, circuit breaker, rate limit handling
§Installation
Add to your Cargo.toml:
[dependencies]
aptu-core = "*"Note: Replace
*with the current version on crates.io when used in production.
§Optional Features
| Feature | Description |
|---|---|
keyring | Secure token storage using system keyring (macOS Keychain, Linux Secret Service, Windows Credential Manager) |
ast-context | AST and call-graph context injection for PR reviews (Rust, Go, Python, TypeScript, JS, C/C++, C#, Java, Fortran) |
To enable optional features:
[dependencies]
aptu-core = { version = "*", features = ["keyring"] }§Example
use aptu_core::{load_config, AiClient, IssueDetails, ai::AiProvider};
use anyhow::Result;
#[tokio::main]
async fn main() -> Result<()> {
// Load configuration
let config = load_config()?;
// Create AI client
let client = AiClient::new(&config.ai.provider, &config.ai)?;
// Create issue details
let issue = IssueDetails::builder()
.owner("block".to_string())
.repo("goose".to_string())
.number(123)
.title("Example issue".to_string())
.body("Issue description...".to_string())
.url("https://github.com/block/goose/issues/123".to_string())
.build();
// Analyze with AI
let response = client.analyze_issue(&issue).await?;
println!("Summary: {}", response.triage.summary);
Ok(())
}§Modules
ai- AI integration and triage analysisconfig- Configuration loading and XDG pathsfacade- High-level platform-agnostic APIgithub- GitHub API and authenticationhistory- Contribution history trackingrepos- Curated repository listsecurity- Security pattern detection and SARIF output
§Benchmarks
Head-to-head comparison of aptu+mercury-2 vs a raw claude-opus-4.6 call (no schema, no rubric, no AST context) across 6 fixtures (3 triage, 3 PR review).
| Arm | Quality (mean, /5) | Cost/call | Latency p50 |
|---|---|---|---|
| aptu+mercury-2 | 4.8/5 | $0.0011 | 1,934 ms |
| raw claude-opus-4.6 | 2.2/5 | $0.0193 | 16,032 ms |
Measured across aptu #737, #850, #1094 (triage) and #1091, #1098, #1101 (PR review); n=1 per fixture.
aptu+mercury-2 is 17x cheaper and 8x faster than a raw claude-opus-4.6 call, while scoring more than twice as high on the structured rubric.
See docs/BENCHMARKS.md for full methodology, fixture breakdown, and C1-C5 scores.
§FAQ
Q: The install examples use "*" – what version should I pin in production?
The "*" wildcard in documentation examples means “any version” and is used so the docs stay accurate across releases. For production use or library dependencies, always pin to a specific version:
[dependencies]
aptu-core = "0.4" # semver-compatible: accepts patch and minor updates
# or for exact pinning:
aptu-core = "=0.4.0" # exact: only this releaseCheck crates.io/crates/aptu-core for the latest published version.
aptu-core follows Semantic Versioning: patch releases are bug-fixes only; minor releases may add new APIs but remain backward-compatible with existing usage.
§Support
For questions and support, visit clouatre.ca.
§License
Apache-2.0. See LICENSE.
Re-exports§
pub use auth::TokenProvider;pub use error::AptuError;pub use config::AiConfig;pub use config::AppConfig;pub use config::CacheConfig;pub use config::GitHubConfig;pub use config::TaskType;pub use config::UiConfig;pub use config::UserConfig;pub use config::config_dir;pub use config::config_file_path;pub use config::data_dir;pub use config::load_config;pub use config::prompts_dir;pub use cache::CacheEntry;pub use cache::FileCache;pub use cache::FileCacheImpl;pub use ai::types::IssueComment;pub use ai::types::IssueDetails;pub use ai::types::PrDetails;pub use ai::types::PrFile;pub use ai::types::PrReviewResponse;pub use ai::types::ReviewEvent;pub use ai::types::TriageResponse;pub use ai::AiClient;pub use ai::AiModel;pub use ai::ModelProvider;pub use ai::ProviderConfig;pub use ai::all_providers;pub use ai::get_provider;pub use github::auth::TokenSource;pub use github::graphql::IssueNode;pub use github::ratelimit::RateLimitStatus;pub use github::ratelimit::check_rate_limit;pub use ai::types::CreditsStatus;pub use history::AiStats;pub use history::Contribution;pub use history::ContributionStatus;pub use history::HistoryData;pub use repos::discovery::DiscoveredRepo;pub use repos::discovery::DiscoveryFilter;pub use repos::discovery::search_repositories;pub use repos::CuratedRepo;pub use repos::RepoFilter;pub use triage::APTU_SIGNATURE;pub use triage::TriageStatus;pub use triage::check_already_triaged;pub use triage::render_pr_review_comment_body;pub use triage::render_pr_review_markdown;pub use triage::render_triage_markdown;pub use retry::is_retryable_anyhow;pub use retry::is_retryable_http;pub use retry::retry_backoff;pub use bulk::BulkOutcome;pub use bulk::BulkResult;pub use bulk::process_bulk;pub use utils::format_relative_time;pub use utils::infer_repo_from_git;pub use utils::is_priority_label;pub use utils::parse_and_format_relative_time;pub use utils::truncate;pub use utils::truncate_with_suffix;pub use facade::add_custom_repo;pub use facade::analyze_issue;pub use facade::analyze_pr;pub use facade::apply_triage_labels;pub use facade::create_pr;pub use facade::discover_repos;pub use facade::fetch_issue_for_triage;pub use facade::fetch_issues;pub use facade::fetch_pr_for_review;pub use facade::format_issue;pub use facade::label_pr;pub use facade::list_curated_repos;pub use facade::list_models;pub use facade::list_repos;pub use facade::post_issue;pub use facade::post_pr_review;pub use facade::post_triage_comment;pub use facade::remove_custom_repo;pub use facade::validate_model;pub use github::issues::ApplyResult;pub use github::pulls::PrCreateResult;pub use security::Confidence;pub use security::Finding;pub use security::FindingCache;pub use security::PatternEngine;pub use security::SarifReport;pub use security::SecurityConfig;pub use security::SecurityScanner;pub use security::Severity;pub use security::needs_security_scan;pub use git::patch::PatchError;pub use git::patch::PatchStep;pub use git::patch::apply_patch_and_push;
Modules§
- ai
- AI integration module.
- auth
- Token provider abstraction for multi-platform credential resolution.
- bulk
- Generic bulk processing with concurrent execution and retry logic.
- cache
- TTL-based file caching for GitHub API responses.
- config
- Configuration management for the Aptu CLI.
- error
- Error types for the aptu-core library.
- facade
- Platform-agnostic facade functions for FFI and CLI integration.
- git
- Git utilities: patch application, branch management, and version gating.
- github
- GitHub integration module.
- history
- Local contribution history tracking.
- repos
- Curated and custom repository management for Aptu.
- retry
- Retry logic with exponential backoff for transient failures.
- security
- Security scanning module for vulnerability detection.
- triage
- Triage status detection for GitHub issues.
- utils
- Text utility functions for Aptu.
Enums§
- State
- The status of a issue or pull request.
Type Aliases§
- Result
- Convenience Result type for Aptu operations.