Fix bash 3.2 parser error on escaped space in collect-inventory.sh (=~ ^require\ ]] -> [[:space:]]). Remove unused Go imports in cmd/audit/main.go and internal/security/claude.go, and an unused test variable in osv_test.go so go build and go vet pass. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GVbEgdgcC1w6qwSq3zC4kg
97 lines
2.8 KiB
Go
97 lines
2.8 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
|
|
"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))
|
|
}
|