
    mVj                        d Z ddlZddlZddlZddlZddlmZ ej                  j                  d e	 ee
      j                               ddlmZmZ  ed      Z ej                   d      Zh dZded	eee	ee	   f   ee	   f   fd
Zde	d	e	fdZde	dee	ee	   f   dee	   d	efdZd	efdZedk(  r ej<                   e              yy)uQ  Aria-Brain Wikilink-Integritaets-Validator.

Prueft ob alle `[[Wikilinks]]` einer Note auf eine existierende Brain-Note
zeigen (Obsidian-Graph-Health, siehe HEARTBEAT „Dangling Links proaktiv
abarbeiten"). Dangling Links = Graph-Bruch → Aria findet die verlinkte
Begruendung spaeter nicht mehr.

Aufloesung (Obsidian-Konvention):
- `[[Note Title]]`            → irgendeine Datei `Note Title.md` im Vault
- `[[01-Projekte/Aria/Foo]]`  → pfad-relativ ab Vault-Root
- `[[Note#Heading]]`          → `#Heading` wird gestrippt
- `[[Note|Anzeigetext]]`      → `|Anzeigetext` wird gestrippt
- `![[bild.png]]`             → Asset-Embed, kein .md → uebersprungen

Usage:
    markdown_wikilinks.py --input /root/aria/brain/02-Wissen/foo.md
    cat foo.md | markdown_wikilinks.py --input - --source-path /abs/foo.md

Exit-Codes: 0 pass, 2 fail.
    N)Path)emit_report
read_inputz/home/aria/brainz!?\[\[([^\]]+?)\]\]>   .gif.jpg.mov.mp3.mp4.pdf.png.svg.jpeg.webp.canvas.excalidrawrootreturnc                    i }t               }t        j                  |       D ]  \  }}}|D cg c]  }|j                  d      r| c}|dd |D ]  }|j	                  d      st        |      |z  }|j                  |       j                         }	|dd }
|j                  |
j                         g       j                  |	       |j                  |	dd j                                  ||fS c c}w )zAstem(lower) -> [relpaths], und set der relpaths-ohne-.md (lower)..N.md)setoswalk
startswithendswithr   relative_toas_posix
setdefaultlowerappendadd)r   by_stem
by_relpathdirpathdirnames	filenamesdfnfullrelstems              9/home/aria/.claude/hooks/validators/markdown_wikilinks.pybuild_indexr.   &   s    $&G5J(* 	-$9"*DQ!,,s2CqD 	-B;;u%=2%D""4(113Ccr7Dtzz|R077<NN3s8>>+,	-	- J Es   C0C0rawc                     | j                         }|j                  dd      d   }|j                  dd      d   }|j                         S )N#   r   |)stripsplit)r/   ts     r-   normalize_targetr7   7   sA    		A	QA	QA779    targetr#   r$   c                 j    | }|j                  d      r|d d }|j                         }d|v r||v S ||v S )Nr   r   /)r   r    )r9   r#   r$   r6   keys        r-   resolver=   >   sE    Azz%crF
'')C
axj  '>r8   c            	         t        j                         } | j                  dd       | j                  dd d       | j                         }t	        |j
                        }|j                  xs |j
                  dk7  r|j
                  nd }t        j                         st        ddg d	d
i      S t        t              \  }}g }t               }t        j                  |      D ]  }|j                  d      j                  d      }	t!        |j                  d            }
|
s@t"        j$                  j'                  |
      d   j)                         }|	s|t*        v r{|
|v r|j-                  |
       t/        |
||      r|j1                  |
        |r2|D cg c]  }d| d
 }}t        dd||xs dt3        |      d      S t        ddg |xs dt3        |      d      S c c}w )Nz--input-)defaultz--source-pathz8Echter Pfad wenn via stdin gepiped (fuer Self-Link-Skip))r@   helpmarkdown_wikilinksTskippedzvault-root fehlt)detailsr   !r2   z*Dangling-Wikilink (kein Vault-Treffer): [[z]]F)inputdangling_count)rF   links_checked)argparseArgumentParseradd_argument
parse_argsr   rF   source_path
VAULT_ROOTexistsr   r.   r   WIKILINK_REfinditergroupr   r7   r   pathsplitextr    
ASSET_EXTSr"   r=   r!   len)apargscontentsrcr#   r$   danglingseenmis_embedr9   extr(   errorss                 r-   mainra   H   s   		 	 	"BOOIsO+OOOTS  U==?D$G



ITZZ3->tzzDC/r$-/A#BD 	D &j1GZHUD!!'* $771:((-!!''!*-ggv&q)//1sj(T>vw
3OOF#$ NVW>qcDWW/-0ZC3x=#Y[ 	[ +T2),c$iPR R	 Xs   G)__main__)__doc__rI   r   resyspathlibr   rS   insertstr__file__parent_libr   r   rN   compilerP   rU   tupledictlistr   r.   r7   boolr=   intra   __name__exit r8   r-   <module>ru      s  (  	 	 
  3tH~,,- . ( $%
bjj/0H
d uT#tCy.%93s8%CD "# # C $sDI~"6 CH QU &Rc &RR zCHHTV r8   