
    7jh                    l    d Z ddlmZ ddlmZ ddlmZ ddlmZ  ed      Z	dZ
dZdd	Ze
fdd
ZddZy)u  Read-only web project discovery and classification.

We classify a directory by the presence of marker files only. We NEVER read the
contents of wp-config.php, .env, composer.json secrets, etc. — only that the
files exist. SECURITY: no .env values, no credentials, no private keys.
    )annotations)Path)Any)
get_loggerzdiscovery.projects)z/var/wwwz/srv/wwwz/srv   c                :   | dz  j                         rdt        |       ddS | dz  j                         r"| dz  j                         rdt        |       ddS | dz  j                         rd	t        |       d	dS | d
z  j                         rdt        |       ddS y)zEClassify a single directory. Returns None if it isn't a project root.zwp-config.php	wordpressphp)typepathruntimeartisanzcomposer.jsonlaravelzpackage.jsonnodez
index.htmlstaticN)existsstr)r   s    L/var/www/downloads.wolfpanel.net/public_html/agent/src/discovery/projects.pyclassifyr      s    &&(#SY5IIy  "(>'F'F'H!3t9GG~%%'D	fEE|##% #d)II    c                   g }t               }| D ]z  }t        |      }|j                         st        |t              D ]I  }t        |      |v rt        |      }|s|j                  t        |             |j                  |       K | |S )zDScan common web roots and classify each immediate project directory.)	setr   is_dir_candidate_dirs
_MAX_DEPTHr   r   addappend)rootsprojectsseenrootbase	candidateresults          r   find_projectsr%   "   s    %'HUD 
(Dz{{}(z: 	(I9~%i(FY('	(	
( Or   c              #     K   |  t        d|dz         D ]C  }dj                  dg|z        }	 | j                  |      D ]  }|j                         s|  E y# t        $ r Y Rw xY ww)z?Yield directories up to max_depth below base (and base itself).   /*N)rangejoinglobr   OSError)r"   	max_depthdepthpatternr   s        r   r   r   4   sw     
Jq)a-( ((C55=)			'* ;;=J  		s.   ,A,$AAA,	A)&A,(A))A,N)r   r   returnzdict[str, Any] | None)r   ztuple[str, ...]r1   zlist[dict[str, Any]])r"   r   r.   int)__doc__
__future__r   pathlibr   typingr   loggerr   log
_WEB_ROOTSr   r   r%   r    r   r   <module>r;      sA    #   %&-


 ,6 $
r   