@@ -120,6 +120,13 @@ func Run(exec executor.Executor, log *progress.Logger, cfg *cli.Config) error {
120120 loggedInUsername = u .Username
121121 }
122122
123+ // Create a user-aware executor that delegates commands to the logged-in user
124+ // when running as root. This ensures tools like brew, pip3, npm etc. execute
125+ // in the correct user context (many refuse to run as root or return different
126+ // results). File-based detectors (IDE, extensions, MCP) use the original exec
127+ // since file operations don't need user delegation.
128+ userExec := executor .NewUserAwareExecutor (exec , loggedInUsername )
129+
123130 // Resolve search dirs
124131 searchDirs := resolveSearchDirs (exec , cfg .SearchDirs )
125132 fmt .Fprintln (os .Stderr )
@@ -148,7 +155,7 @@ func Run(exec executor.Executor, log *progress.Logger, cfg *cli.Config) error {
148155 fmt .Fprintln (os .Stderr )
149156
150157 log .Progress ("Detecting AI CLI tools..." )
151- cliTools := detector .NewAICLIDetector (exec ).Detect (ctx )
158+ cliTools := detector .NewAICLIDetector (userExec ).Detect (ctx )
152159 for _ , t := range cliTools {
153160 log .Progress (" Found: %s (%s) v%s at %s" , t .Name , t .Vendor , t .Version , t .BinaryPath )
154161 }
@@ -158,7 +165,7 @@ func Run(exec executor.Executor, log *progress.Logger, cfg *cli.Config) error {
158165 fmt .Fprintln (os .Stderr )
159166
160167 log .Progress ("Detecting general-purpose AI agents..." )
161- agents := detector .NewAgentDetector (exec ).Detect (ctx , searchDirs )
168+ agents := detector .NewAgentDetector (userExec ).Detect (ctx , searchDirs )
162169 for _ , a := range agents {
163170 log .Progress (" Found: %s (%s) at %s" , a .Name , a .Vendor , a .InstallPath )
164171 }
@@ -168,7 +175,7 @@ func Run(exec executor.Executor, log *progress.Logger, cfg *cli.Config) error {
168175 fmt .Fprintln (os .Stderr )
169176
170177 log .Progress ("Detecting AI frameworks and runtimes..." )
171- frameworks := detector .NewFrameworkDetector (exec ).Detect (ctx )
178+ frameworks := detector .NewFrameworkDetector (userExec ).Detect (ctx )
172179 for _ , f := range frameworks {
173180 running := "false"
174181 if f .IsRunning != nil && * f .IsRunning {
@@ -206,17 +213,24 @@ func Run(exec executor.Executor, log *progress.Logger, cfg *cli.Config) error {
206213
207214 if brewEnabled {
208215 log .Progress ("Detecting Homebrew..." )
209- brewDetector := detector .NewBrewDetector (exec )
216+ brewDetector := detector .NewBrewDetector (userExec )
210217 brewPkgMgr = brewDetector .DetectBrew (ctx )
211218 if brewPkgMgr != nil {
212219 log .Progress (" Found: Homebrew v%s at %s" , brewPkgMgr .Version , brewPkgMgr .Path )
213- brewScanner := detector .NewBrewScanner (exec , log )
220+ brewScanner := detector .NewBrewScanner (userExec , log )
214221 if r , ok := brewScanner .ScanFormulae (ctx ); ok {
215222 brewScans = append (brewScans , r )
223+ log .Progress (" Formulae scan: exit_code=%d, error=%q, raw_len=%d" , r .ExitCode , r .Error , len (r .RawStdoutBase64 ))
224+ } else {
225+ log .Progress (" Formulae scan: skipped (brew not in PATH)" )
216226 }
217227 if r , ok := brewScanner .ScanCasks (ctx ); ok {
218228 brewScans = append (brewScans , r )
229+ log .Progress (" Casks scan: exit_code=%d, error=%q, raw_len=%d" , r .ExitCode , r .Error , len (r .RawStdoutBase64 ))
230+ } else {
231+ log .Progress (" Casks scan: skipped (brew not in PATH)" )
219232 }
233+ log .Progress (" Total brew scans: %d" , len (brewScans ))
220234 } else {
221235 log .Progress (" Homebrew not found" )
222236 }
@@ -238,7 +252,7 @@ func Run(exec executor.Executor, log *progress.Logger, cfg *cli.Config) error {
238252
239253 if pythonEnabled {
240254 log .Progress ("Detecting Python package managers..." )
241- pyDetector := detector .NewPythonPMDetector (exec )
255+ pyDetector := detector .NewPythonPMDetector (userExec )
242256 pythonPkgManagers = pyDetector .DetectManagers (ctx )
243257 for _ , pm := range pythonPkgManagers {
244258 log .Progress (" Found: %s v%s at %s" , pm .Name , pm .Version , pm .Path )
@@ -248,7 +262,7 @@ func Run(exec executor.Executor, log *progress.Logger, cfg *cli.Config) error {
248262 }
249263
250264 log .Progress ("Scanning Python global packages..." )
251- pyScanner := detector .NewPythonScanner (exec , log )
265+ pyScanner := detector .NewPythonScanner (userExec , log )
252266 pythonGlobalPkgs = pyScanner .ScanGlobalPackages (ctx )
253267 log .Progress (" Found %d Python global package source(s)" , len (pythonGlobalPkgs ))
254268
@@ -277,7 +291,7 @@ func Run(exec executor.Executor, log *progress.Logger, cfg *cli.Config) error {
277291 log .Progress ("Node.js package scanning is ENABLED" )
278292
279293 log .Progress ("Detecting Node.js package managers..." )
280- npmDetector := detector .NewNodePMDetector (exec )
294+ npmDetector := detector .NewNodePMDetector (userExec )
281295 pkgManagers = npmDetector .DetectManagers (ctx )
282296 for _ , pm := range pkgManagers {
283297 log .Progress (" Found: %s v%s at %s" , pm .Name , pm .Version , pm .Path )
0 commit comments