//go:build darwin package client import ( "os" "os/exec" "path/filepath" "strings" ) func collectPersistenceAudit() PersistenceAuditReport { report := PersistenceAuditReport{Platform: "darwin"} home, _ := os.UserHomeDir() if home != "" { agentsDir := filepath.Join(home, "Library", "LaunchAgents") if entries, err := os.ReadDir(agentsDir); err == nil { for _, e := range entries { if e.IsDir() || !strings.HasSuffix(e.Name(), ".plist") { continue } report.Entries = append(report.Entries, PersistenceAuditEntry{ Kind: "launch_agent", Name: e.Name(), Detail: agentsDir, }) } } } out, err := exec.Command("/bin/sh", "-c", "launchctl list 2>/dev/null | head -40").CombinedOutput() if err == nil { for _, line := range strings.Split(string(out), "\n") { line = strings.TrimSpace(line) if line == "" || strings.HasPrefix(line, "PID") { continue } fields := strings.Fields(line) if len(fields) < 3 { continue } report.Entries = append(report.Entries, PersistenceAuditEntry{ Kind: "launchctl", Name: fields[len(fields)-1], Detail: line, Enabled: fields[0] != "-", }) } } report.Count = len(report.Entries) return report }