
    aNjb.                    *   d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z
ddlZ
ddlmZ  ed      Z ed      Z ed      Z ed      Zd	Zd
\  ZZZdddZd Zd Zd Zd Zd Zd Zd Zd Zd Ze dk(  r ejB                   e              yy)u  Aria Meta-Verify (KAR-589) — wasserdichter Self-Check ueber ALLE Regeln/Skripte/
Hooks/Timer/Standing-Orders. Findet kaputte Pfade, tote Timer, fehlende Hooks und
Regeln ohne Enforcement — damit nichts still stirbt und Kais nicht manuell erinnern muss.

Stufen:
  1. scripts   — alle scripts/*.py|*.sh auf kaputte Pfade ($HOME-literal, /projects/-root/, tote Refs)
  2. timers    — alle aria-*.timer enabled? service failed?
  3. hooks     — alle in settings.json referenzierten Hook-Files existieren + executable
  4. standing  — Standing-Order-Memories: Enforcement-Coverage (Hook vs nur-Text)
  5. services  — failed aria-services

Exit 0 = clean, Exit 2 = kritische Findings (kaputte Pfade / tote Timer / fehlende Hooks).
Aufruf: python3 aria-verify.py [--json] [--telegram]
    )annotationsN)Pathz/root/aria/scriptsz/root/.claude/projects/-/memoryz/root/.claude/settings.jsonz/root/.claude/hooks
1164395546)CRITICALWARNINFOc                    	 t        j                  | dd|      j                  S # t        $ r}d| dcY d }~S d }~ww xY w)NT)capture_outputtexttimeoutz[err ])
subprocessrunstdout	Exception)cmdr   es      !/root/aria/scripts/aria-verify.pyshr   $   s@    ~~c$T7SZZZ qc|s   "% 	>9>>c                   t         j                         sy t        t         j                  d            t        t         j                  d            z   D ]  }|j                  dk(  r	 |j                  d      }|j                  dk(  }d}t        |j                         d      D ]  \  }}|j                         }|j                  d	      r)|r,|j                  d
      dk(  s|j                  d      dk(  r| }W|rZ|rVt        j                  d|      r@t        j                  d|      }|s(| j                  t         d|j                   d| df       d|v rcd|j#                         v r)| j                  t         d|j                   d| df       n(| j                  t$        d|j                   d| df       t        j&                  d|      D ]W  }	|	j)                  d      }
t+        |
      j                         r.| j                  t$        d|j                   d| d|
 f       Y   y # t        $ r Y w xY w)Nz*.py*.shzaria-verify.pyreplaceerrorsz.pyF   #z"""z'''z["\'][^"\']*\$HOMEzFexpandvars|expanduser|\.system\(|shell\s*=\s*True|getenv|environ|popenscripts:z@ literal $HOME in Python-String ohne expandvars (expandiert nie)z/projects/-root/memoryz= Memory-Pfad /projects/-root/memory (soll /projects/-/memory)uO    /projects/-root/ cwd-abhaengig (jsonl/session) — pruefen ob cwd=/root stimmtz6["\'](/root/(?:aria|\.claude)/[^"\']+\.(?:sh|py))["\']z$ referenziert nicht-existente Datei )SCRIPTSexistssortedglobname	read_textr   suffix	enumerate
splitlinesstrip
startswithcountresearchappendCRITlowerr   finditergroupr   )findingspr   is_pyin_docnlinestrippedsafemrefs              r   check_scriptsr=   ,   s<   >>GLL()F7<<3G,HH "q66%%	;;i;0D E! !2A6 	qGAtzz|H""3'(../14u8MQR8R# #8$?yy!jlpqOOT9!  EE  7F  %G  H!T)tzz|+OOT9!  EB  7C  %D  EOOT9!  ET  7U  %V  W[[!Z\`a qggajCy'')OOT9!Dhilhm6n$opq-	q"q
  		s   (H55	IIc           	        t        g d      }t        t        t        j                  d|                  }t        t        d t        d      j                  d      D                    }t        |      |d<   |D ]  }t        dd|g      j                         }|j                  d	d
      }t        dd|g      j                         }|dvr| j                  t        d| d| df       |dk(  su| j                  t        d| df        y )N)	systemctlzlist-timersz--all--no-legendz(aria-[\w-]+\.timer)c              3  4   K   | ]  }|j                     y wN)r$   .0ts     r   	<genexpr>zcheck_timers.<locals>.<genexpr>Y   s     WaffWs   z/etc/systemd/systemzaria-*.timertimers_totalr?   z
is-enabledz.timerz.servicez	is-failed)enabledstaticzenabled-runtimetimersz ist z (beabsichtigt? sonst tot)failedz im failed-Zustand)r   r"   setr,   findallr   r#   lenr)   r   r.   r   r/   )	r3   infooutrJ   diskrE   ensvcrK   s	            r   check_timersrT   U   s    
A
BCC

#:C@ABF#Wd+@&A&F&F~&VWWXDt9D JlA./557ii*-[+s34::<==OOT8s%t;U-VWXXOOT8u4F-GHIJ    c           
     \   t         j                         s| j                  t        ddf       y t	        j
                  t         j                               }g }|j                  di       j                         D ]F  \  }}|D ]<  }|j                  dg       D ]%  }|j                  ||j                  dd      f       ' > H t        |      |d<   t               }|D ]*  \  }}	t        j                  d|	      }
|
s |j                  t        |
j                  d            j                          t        |
j                  d            }|j                         s-| j                  t        d| d|
j                  d       f       	 |j                  d	
      }t        j$                  d|      D ]U  }t        |j                  d            }|j                         r.| j                  t        d|j                    d| df       W - ddh}t&        j)                  d      D ]w  }|j                   |vs|j                   |vs!d|j                   v sd|j                   v sd|j                   v rt        nt*        }| j                  |d|j                    df       y y # t"        $ r d}Y w xY w)Nhookszsettings.json fehltcommand hooks_totalz"(/root/\.claude/hooks/[\w.-]+\.sh)r   z: Hook-Skript fehlt r   r   z#(/root/\.claude/hooks/[\w./-]+\.py)z ruft fehlende Datei z aufztelegram-log-in.shztelegram-log-out.shr   safetyguardcriticz@ existiert aber ist NICHT in settings.json gewired (toter Hook?))SETTINGSr!   r.   r/   jsonloadsr%   getitemsrN   rL   r,   r-   addr   r2   r$   r   r1   	HOOKS_DIRr#   r   )r3   rO   dcmdsevtgroupsghwiredcr;   sh_pathsh_textdepdpKNOWN_HELPERShpsevs                     r   check_hooksrt   g   sg   ??w(=>?

8%%'(ADuuWb)//1 9V 	9AUU7B' 9S!%%	2"6789	99 d)DEE iQII;Q?IId1771:&++,1771:&G>>#w3%7KAGGTUJ<0X YZ
!%//y/AG ;;'MwW iCciil+B99; w7<<.H]^`]aae8f(ghii* *+@AMnnV$ z77%BGG=$@"bgg-BGG1CxSUSZSZGZ$`dCOOS'bggY6v+wxyz ! ! G!s   JJ+*J+c                8   t         j                         sy t         j                  d      D cg c]  }| }}t        |      |d<   dt        j                  d      D ]&  }	 |j                  d      j                         z  ( t        dz  }|j                         r:|j                  d      D ]&  }	 |j                  d      j                         z  ( d	}g }|D ]  }|j                  j                  d
d      j                  dd      }	|j                  j                  d
d      }
t        j                  d|
      D cg c]  }t        |      dkD  s| c}d d }|	v xs |
v xs |xr t        fd|D              }|r|dz  }|j                  |j                          ||d<   t        |      |d<   | j                  t        dd| dt        |       dt        |       df       y c c}w # t        $ r Y w xY w# t        $ r Y bw xY wc c}w )Nzfeedback_*.mdstanding_totalrY   r   r   r   
validators*r   	feedback__-z[-_]      c              3  &   K   | ]  }|v  
 y wrB    )rD   rE   	hook_texts     r   rF   z!check_standing.<locals>.<genexpr>   s     Hf\]iHfs   r   standing_enforcedstanding_unenforcedstandingzEnforcement-Coverage: /z# Standing-Orders haben einen Hook (z sind nur-Text/Judgment))MEMORYr!   r#   rN   rd   r%   r0   r   stemr   r,   splitallr.   r   )r3   rO   r4   	feedbacksrr   vdirenforced
unenforcedfbslugslug_usrE   tokshitr   s                 @r   check_standingr      s   ==?"KK89q9I9 ^D	InnV$ 	Y7==??I |#D{{}))C. 	BR\\\;AACC		
 HJ 	'ww{B/77SA''//+r288GW5DaQ!DRaHig7i#7gD<fSHfaeHfEfMHbgg&	' !)D	"%j/D	OOT:-hZqY8H IZ))ACD EA :  		   Es5   	G2"#G75#HHH7	HH	HHc                   t        g d      }|j                         D ]e  }d|v s|j                         D cg c]	  }|dvs| }}t        d |D        |j	                               }| j                  t        dd| f       g y c c}w )N)r?   z--failedr@   aria-)u   ●rx   c              3  D   K   | ]  }|j                  d       s|  yw)r   N)r*   rC   s     r   rF   z!check_services.<locals>.<genexpr>   s     CqQ\\'-BCs     serviceszfailed service: )r   r(   r   nextr)   r.   r/   )r3   rP   r8   rE   partsunits         r   check_servicesr      s    
5
6C  Kd? $

I10HQIEICECTZZ\RDOOT:1A$/HIJ	KIs   	BBc                B    t        j                  ddt        |             S )Nz([_*\[\]()~`>#+\-=|{}.!\\])z\\\1)r,   substr)ss    r   md2r      s    2668'3q6JJrU   c                    dD ]  } t        |       }|j                         s|j                         j                         D ]  }d|v s|j	                         j                  d      r(|j                  d      \  }}}|j	                         dv sP|j	                         sa|j	                         j	                  d      j	                  d      c c S   t        j                  j                  d      S )N)z$/root/.claude/channels/telegram/.envz/root/aria/.env=r   )TG_TOKENTELEGRAM_BOT_TOKENTELEGRAM_TOKEN"'r   )
r   r!   r%   r(   r)   r*   	partitionosenvironra   )pathr4   r8   krz   vs         r   get_tg_tokenr      s    K ?J88:002 ?$;tzz|'>'>s'C"nnS1GAq!wwy$XX]^]d]d]f wwys399#>>	?? ::>>*%%rU   c                   t               }|syt        j                  j                  t        | ddd      j                         }	 t        j                  j                  t        j                  j                  d| d|d      d	
      5 }|j                  dk(  cd d d        S # 1 sw Y   y xY w# t        $ r(}t        d| t        j                         Y d }~yd }~ww xY w)NF
MarkdownV2true)chat_idr   
parse_modedisable_web_page_previewzhttps://api.telegram.org/botz/sendMessagePOST)datamethod   )r      z[verify] tg error: )file)r   urllibparse	urlencodeCHAT_IDencoderequesturlopenRequeststatusr   printsysstderr)r   tokr   rr   s        r   send_tgr      s    
.C<<!!gt"#H IIO 	H^^##FNN$:$:.se<@tTZ %; %\eg $ i 	#lm88s?	# 	# 	#  H#A3'cjj9%Hs7   AB/ 
B#	B/ #B,(B/ ,B/ /	C 8CC c                    t        j                         } | j                  dd       | j                  dd       | j                         }g }i }t	        |       t        ||       t        ||       t        ||       t        |       |D cg c]  }|d   t        k(  s| }}|D cg c]  }|d   t        k(  s| }}|D cg c]  }|d   t        k(  s| }}|j                  rRt        t        j                  |t        |      t        |      |D 	
cg c]  \  }}	}
||	|
d c}
}	}dd	             nct        d
|        ||z   |z   D ]  \  }}	}
t        d| d|	 d|
         t        dt        |       dt        |       dt        |       d       |j                   rddg}|j#                  d|j%                  dd       d|j%                  dd       d|j%                  dd       d|j%                  dd       d	       |j#                  d       |rJ|j#                  dt        |       d       |d d  D ]#  \  }}	}
|j#                  d!t'        |
              % n|j#                  d"       |r/|j#                  d       |j#                  d#t        |       d$       t)        d%j+                  |             yc c}w c c}w c c}w c c}
}	}w )&Nz--json
store_true)actionz
--telegramr   )rs   areamsg)rO   criticalwarnr3      )indentz=== aria-verify === [z] z: z

SUMMARY: z CRITICAL, z WARN, z INFOz*Aria Meta\-Verify*rY   zTimer rG   ?u
    · Hooks rZ   u    · Standing\-Orders rv   z \(enforced r   z\)u   🔴 *z CRITICAL:*   u   • u8   ✅ *0 kritische Findings* — alle Pfade/Timer/Hooks oku   🟠 z! WARN \(z\.B\. bewusst disabled\)
)argparseArgumentParseradd_argument
parse_argsr=   rT   rt   r   r   r/   r   r   r_   r   dumpsrN   telegramr.   ra   r   r   join)apargsr3   rO   fcritr   infr   ar;   Ls               r   mainr      s   		 	 	"BOOH\O2OOLO6==?DHD(4 $8T"80!1Q44<A0D00!1Q44<A0D0
/!A$$,1
/C
/yydjj$CIs4yV^&_&_71aQRq!A'F&_aijl 	m 	$TF+,d{S( 	%GAq!AaS1#Rs#$	%CI;k#d)GCH:UST}}#R(	6$((>#67z$((=Y\B]A^ _&&*hh/?&D%E]SWS[S[\opsStRuuxz 	{	HHvc$i[458 *1a4Ax)* HHOPHHRLHHuSYK'LMN		!
 A 10
/ '`s*   KK)K;KKKK__main__)   )r   z	list[str]returnr   )"__doc__
__future__r   r   r_   r   r,   r   r   urllib.parser   urllib.requestpathlibr   r    r   r^   rd   r   r/   r   r   r   r=   rT   rt   r   r   r   r   r   r   __name__exitr   rU   r   <module>r      s    #   	 	  
   
#
$	/	0-.&'	
- dD%qRJ$%zR%ERK K	&H.b zCHHTV rU   