analyze_org/
analyze_org.rs

1// Example: Analyze a GitHub organization
2// Demonstrates the full workflow of OIP
3//
4// Usage:
5//   cargo run --example analyze_org
6//
7// This example analyzes a small GitHub organization (tokio-rs)
8// and generates a YAML report
9
10use anyhow::Result;
11use chrono::Utc;
12use organizational_intelligence_plugin::github::GitHubMiner;
13use organizational_intelligence_plugin::report::{
14    AnalysisMetadata, AnalysisReport, ReportGenerator,
15};
16use std::path::PathBuf;
17
18#[tokio::main]
19async fn main() -> Result<()> {
20    // Initialize logging
21    tracing_subscriber::fmt::fmt()
22        .with_max_level(tracing::Level::INFO)
23        .init();
24
25    println!("šŸš€ Organizational Intelligence Plugin - Example");
26    println!("   Analyzing organization: tokio-rs\n");
27
28    // Initialize GitHub client (unauthenticated for this example)
29    let miner = GitHubMiner::new(None);
30
31    // Fetch organization repositories
32    println!("šŸ“„ Fetching repositories...");
33    let repos = miner.fetch_organization_repos("tokio-rs").await?;
34
35    println!("āœ… Found {} repositories\n", repos.len());
36
37    // Display top 3 by stars
38    let mut sorted_repos = repos.clone();
39    sorted_repos.sort_by(|a, b| b.stars.cmp(&a.stars));
40
41    println!("⭐ Top repositories:");
42    for (i, repo) in sorted_repos.iter().take(3).enumerate() {
43        println!(
44            "   {}. {} ({} ⭐) - {}",
45            i + 1,
46            repo.name,
47            repo.stars,
48            repo.language.as_deref().unwrap_or("Unknown")
49        );
50    }
51
52    // Generate report
53    println!("\nšŸ“Š Generating YAML report...");
54    let report_generator = ReportGenerator::new();
55
56    let metadata = AnalysisMetadata {
57        organization: "tokio-rs".to_string(),
58        analysis_date: Utc::now().to_rfc3339(),
59        repositories_analyzed: repos.len(),
60        commits_analyzed: 0, // Phase 1: Not analyzing commits yet
61        analyzer_version: env!("CARGO_PKG_VERSION").to_string(),
62    };
63
64    let report = AnalysisReport {
65        version: "1.0".to_string(),
66        metadata,
67        defect_patterns: vec![], // Phase 1: No classifier yet
68    };
69
70    // Write to file
71    let output_path = PathBuf::from("tokio-rs-analysis.yaml");
72    report_generator
73        .write_to_file(&report, &output_path)
74        .await?;
75
76    println!("āœ… Report saved to: {}", output_path.display());
77
78    // Display a sample of the YAML
79    let yaml_content = tokio::fs::read_to_string(&output_path).await?;
80    println!("\nšŸ“„ Report preview:");
81    println!("---");
82    for (i, line) in yaml_content.lines().take(15).enumerate() {
83        println!("{}", line);
84        if i == 14 && yaml_content.lines().count() > 15 {
85            println!("   ... (truncated)");
86        }
87    }
88    println!("---");
89
90    println!("\nšŸŽÆ Example complete!");
91    println!("   Phase 1 MVP features demonstrated:");
92    println!("   āœ… GitHub API integration");
93    println!("   āœ… Repository fetching");
94    println!("   āœ… YAML report generation");
95
96    Ok(())
97}