Expand description
§aptu-core
Core library for Aptu - AI-powered issue-triage and PR-review harness.
aptu-core is shared by the Aptu CLI, GitHub Action, and aptu-dev GitHub App. It provides the domain logic, AI provider abstraction, GitHub API integration, and security scanning used across all three surfaces. The GitHub App resolves credentials from repository secrets rather than the local OS keyring; the keyring feature is used only by the CLI.
§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, check crates.io/crates/aptu-core for the current version and pin to it. aptu-core follows Semantic Versioning: patch releases are bug-fixes only; minor releases may add APIs but remain backward-compatible.
§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::TomlConfigSource;pub use config::load_config;pub use config::AiConfig;pub use config::AppConfig;pub use config::CacheConfig;pub use config::ConfigSource;pub use config::GitHubConfig;pub use config::InMemoryConfigSource;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::prompts_dir;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::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::search_repositories;pub use repos::discovery::DiscoveredRepo;pub use repos::discovery::DiscoveryFilter;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 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::parse_and_format_relative_time;pub use utils::truncate;pub use facade::format_issue;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::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::revert_issue;pub use facade::revert_pr;pub use facade::validate_model;pub use github::issues::ApplyResult;pub use github::pulls::PrCreateResult;pub use security::FindingCache;pub use security::Confidence;pub use security::Finding;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.
- metrics
- Fire-and-forget JSONL metrics logging.
- repos
- Curated and custom repository management for Aptu.
- retry
- Retry logic with exponential backoff for transient failures.
- sanitize
- Prompt injection defence: sanitise user-supplied fields before they reach the AI model. Strips structural XML delimiters, enforces per-field byte limits, and wraps cleaned content in a named XML tag so the model can distinguish user data from prompt scaffolding.
- 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.