package main import ( "encoding/json" "flag" "fmt" "log" "os" "path/filepath" "github.com/user/package-review/internal/inventory" "github.com/user/package-review/internal/report" "github.com/user/package-review/internal/security" ) func main() { var ( inventoryFile = flag.String("inventory", "inventory.json", "Path to inventory JSON file") outputJSON = flag.String("json", "audit_report.json", "Output audit report as JSON") outputHTML = flag.String("html", "audit_report.html", "Output audit report as HTML") claudeMode = flag.String("claude", "claude", "Claude integration mode: 'claude' (CLI) or 'sdk' (Anthropic SDK)") ) flag.Usage = func() { fmt.Fprintf(os.Stderr, `Usage: audit [options] Options: `) flag.PrintDefaults() fmt.Fprintf(os.Stderr, ` Examples: # Collect inventory and run audit ./scripts/collect-inventory.sh && go run ./cmd/audit # Use existing inventory go run ./cmd/audit -inventory=/path/to/inventory.json # Specify output files go run ./cmd/audit -json=report.json -html=report.html # Use Anthropic SDK for Claude (requires ANTHROPIC_API_KEY) go run ./cmd/audit -claude=sdk `) } flag.Parse() // Verify inventory file exists if _, err := os.Stat(*inventoryFile); os.IsNotExist(err) { log.Fatalf("āŒ Inventory file not found: %s\nRun: ./scripts/collect-inventory.sh", *inventoryFile) } fmt.Println("šŸ” Loading inventory...") inv, err := inventory.LoadInventory(*inventoryFile) if err != nil { log.Fatalf("Error loading inventory: %v", err) } fmt.Printf("āœ“ Loaded %d packages from inventory\n\n", inv.CountPackages()) // Scan for vulnerabilities fmt.Println("šŸ”Ž Scanning for vulnerabilities...") audit := security.NewAudit(inv) if err := audit.ScanOSV(); err != nil { log.Fatalf("Error scanning OSV.dev: %v", err) } // Get high-severity findings highSev := audit.FilterByMinSeverity(7.0) fmt.Printf("āš ļø Found %d high-severity vulnerabilities\n\n", len(highSev)) // Run Claude analysis on high-severity items if len(highSev) > 0 { fmt.Println("šŸ¤– Analyzing with Claude...") if err := audit.AnalyzeWithClaude(*claudeMode); err != nil { log.Fatalf("Error running Claude analysis: %v", err) } } // Generate reports fmt.Println("\nšŸ“Š Generating reports...") // JSON report if err := report.WriteJSON(audit, *outputJSON); err != nil { log.Fatalf("Error writing JSON report: %v", err) } fmt.Printf("āœ“ JSON report: %s\n", *outputJSON) // HTML report (via Astro) if err := report.GenerateAstroSite(audit, *outputHTML); err != nil { log.Fatalf("Error generating HTML report: %v", err) } fmt.Printf("āœ“ HTML report: %s\n", *outputHTML) fmt.Println("\nāœ… Audit complete!") fmt.Printf("šŸ“ˆ Summary: %d packages scanned, %d with CVEs, %d high-severity\n", inv.CountPackages(), audit.CountVulnerable(), len(highSev)) }