use anyhow::Result;
use chrono::Utc;
use organizational_intelligence_plugin::analyzer::OrgAnalyzer;
use organizational_intelligence_plugin::github::GitHubMiner;
use organizational_intelligence_plugin::report::{
AnalysisMetadata, AnalysisReport, ReportGenerator,
};
use std::path::PathBuf;
use tempfile::TempDir;
#[tokio::main]
async fn main() -> Result<()> {
tracing_subscriber::fmt::fmt()
.with_max_level(tracing::Level::INFO)
.init();
println!("đ Organizational Intelligence Plugin - Full Analysis Example\n");
println!("Demonstrates: GitHub API â Git Mining â Classification â YAML Report\n");
println!("đĨ Step 1: Fetching repositories from GitHub...");
let github_miner = GitHubMiner::new(None); let org_name = "tokio-rs";
let repos = github_miner.fetch_organization_repos(org_name).await?;
println!("â
Found {} repositories in {}\n", repos.len(), org_name);
let mut sorted_repos = repos.clone();
sorted_repos.sort_by(|a, b| b.stars.cmp(&a.stars));
println!("â Top 3 repositories:");
for (i, repo) in sorted_repos.iter().take(3).enumerate() {
println!(" {}. {} ({} â)", i + 1, repo.name, repo.stars);
}
println!();
println!("đ Step 2: Analyzing commit history for defect patterns...");
let temp_dir = TempDir::new()?;
let analyzer = OrgAnalyzer::new(temp_dir.path());
let top_repo = &sorted_repos[0];
println!(" Analyzing: {} (up to 100 commits)", top_repo.name);
let patterns = analyzer
.analyze_repository(
&format!("https://github.com/{}/{}", org_name, top_repo.name),
&top_repo.name,
100,
)
.await?;
if patterns.is_empty() {
println!(" âšī¸ No defect patterns detected in last 100 commits");
} else {
println!(" â
Found {} defect categories\n", patterns.len());
println!("đ Defect Patterns Found:");
for pattern in &patterns {
println!(
" âĸ {} (n={}, confidence={:.0}%)",
pattern.category.as_str(),
pattern.frequency,
pattern.confidence * 100.0
);
if !pattern.examples.is_empty() {
let example = &pattern.examples[0];
println!(" Example: {}: {}", example.commit_hash, example.message);
}
}
println!();
}
println!("đ Step 3: Generating YAML report...");
let report_generator = ReportGenerator::new();
let metadata = AnalysisMetadata {
organization: org_name.to_string(),
analysis_date: Utc::now().to_rfc3339(),
repositories_analyzed: 1, commits_analyzed: 100,
analyzer_version: env!("CARGO_PKG_VERSION").to_string(),
};
let report = AnalysisReport {
version: "1.0".to_string(),
metadata,
defect_patterns: patterns,
};
let output_path = PathBuf::from("full-analysis-report.yaml");
report_generator
.write_to_file(&report, &output_path)
.await?;
println!("â
Report saved to: {}", output_path.display());
let yaml_content = tokio::fs::read_to_string(&output_path).await?;
println!("\nđ Report Preview (first 20 lines):");
println!("---");
for (i, line) in yaml_content.lines().enumerate() {
if i >= 20 {
println!(
" ... (truncated, see {} for full report)",
output_path.display()
);
break;
}
println!("{}", line);
}
println!("---");
println!("\nđ¯ Full Analysis Complete!");
println!(" â
GitHub API integration");
println!(" â
Git repository cloning");
println!(" â
Commit history analysis");
println!(" â
Rule-based defect classification");
println!(" â
YAML report generation");
println!("\n Phase 1 MVP complete!");
println!(" Next: User feedback mechanism for Phase 2 ML training");
Ok(())
}