ó
    ŸUAj¦  ã                  ót   • S r SSKJr  SSKJr  SSKJr  SSKJr  \" S5      r	Sr
SrSS	 jr\
4SS
 jjrSS jrg)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                ól  • U S-  R                  5       (       a  S[        U 5      SS.$ U S-  R                  5       (       a'  U S-  R                  5       (       a  S[        U 5      SS.$ U S-  R                  5       (       a  S	[        U 5      S	S.$ U S
-  R                  5       (       a  S[        U 5      SS.$ g)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    Ú<D:\Programs\laragon\www\wolf\agent\src\discovery\projects.pyÚclassifyr      s¬   € àˆÑ×&Ñ&×(Ñ(Ø#¬S°«YÀ5ÑIÐIØˆyÑ× Ñ ×"Ñ"¨¨Ñ(>×'FÑ'F×'HÑ'HØ!¬3¨t«9ÀÑGÐGØˆ~Ñ×%Ñ%×'Ñ'Ø¬¨D«	¸fÑEÐEØˆ|Ñ×#Ñ#×%Ñ%Ø ¬#¨d«)ÀÑIÐIØó    c                óB  • / n[        5       nU  HŒ  n[        U5      nUR                  5       (       d  M%  [        U[        5       HS  n[        U5      U;   a  M  [        U5      nU(       d  M(  UR                  [        U5      5        UR                  U5        MU     MŽ     U$ )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Ü“U€DÛˆÜ�D‹zˆØ�{‰{�}‰}ÙÜ(¨¬zÖ:ˆIÜ�9‹~ Ó%ÙÜ˜iÓ(ˆFßˆvØ—‘œ˜Y›Ô(Ø—‘ Ö'ó ;ñ	 ð €Or   c              #  óô   #   • U v •  [        SUS-   5       HL  nSR                  S/U-  5      n U R                  U5       H  nUR                  5       (       d  M  Uv •  M      MN     g! [         a     M^  f = f7f)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   sn   é € à
‚JÜ�q˜) a™-Ö(ˆØ—(‘(˜C˜5 5™=Ó)ˆð	ØŸ	™	 'Ö*�Ø—;‘;—=“=Ø”Jó +ò )øô ó 	Úð	üs.   ‚,A8¯'A'ÁA'Á"A8Á'
A5Á1A8Á4A5Á5A8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   