
    1j[U                        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m	Z	m
Z
mZ ddlmZ  ed      Z ed      Ze	 G d d	             Zd
ZddZddZ ed      ZddZddZddZddZddZedk(  r ej6                   e              yy)u  aria-taxonomist — Write-Time Filing Helper für den Aria-Brain-Vault.

Gibt anhand von Titel + Inhalt eine Empfehlung für:
  - Folder (z.B. 02-Wissen)
  - frontmatter type
  - Rationale

Heuristik-basiert (deterministisch, v1). Kein LLM-Call by default.
Mit --llm wird ein optionaler Claude-API-Call ausgeführt.

Usage:
    aria-taxonomist.py --title "Meeting-Notes BMW" --content "Heute besprochen..."
    aria-taxonomist.py --title "Goose Audit" --content-file /tmp/draft.md
    aria-taxonomist.py --file /root/aria/brain/00-Inbox/foo.md
    aria-taxonomist.py --title "Kurztitel" --content "..." --llm

Exit: 0 immer (ist ein Empfehlungs-Tool, kein Blocker).
    )annotationsN)	dataclassfieldasdict)Pathz/root/aria/brainz!/root/aria/brain/schema-pack.yamlc                  `    e Zd ZU ded<   ded<   ded<   ded<   dZded<    ee	      Zd
ed<   y)
Suggestionstrtypefolderfloat
confidence	rationale filename_hint)default_factory	list[str]signalsN)__name__
__module____qualname____annotations__r   r   listr        %/root/aria/scripts/aria-taxonomist.pyr	   r	   #   s0    
IKNM3t4GY4r   r	   r   c                L    | j                         t        fd|D              S )uP   True wenn mindestens eines der Wörter im Text enthalten ist (case-insensitive).c              3  B   K   | ]  }|j                         v   y w)N)lower).0wts     r   	<genexpr>z_kw.<locals>.<genexpr>7   s     -!qwwyA~-s   )r   any)textwordsr"   s     @r   _kwr'   4   s    

A-u---r   c                   | j                         }|r|j                         nd}|dz   |z   }g }d }|rt        |      j                         }dD ]:  }	|	j                         |j                         v s$|	}|j                  d|	         n |s't	        j
                  d|t        j                        rd}t        t	        j
                  d|             }
t        |ddd	d
dddddddd      }|
r[|s|dk(  rT|j                  d       t	        j
                  d|       }t        dddd|r|j                  d       d|      S d|      S |dk(  r!|j                  d       t        dddd|      S t        |dddd d!      }|s|d"k(  r!|j                  d#       t        dd"d$d%|      S t        |d&d'd(d)d*d+d,d-	      }|r!|j                  d.       t        d&d/dd0|      S t        |d1d2d3d4d5d6d7d8	      }|r!|j                  d9       t        d1d:d;d<|      S t        |d=d>d?d@dAdB      }|r!|j                  dC       t        d=dDddE|      S t        |dFdGdHdIdJdKdLdMdN
      }t        |dFdGdO      }t        |dPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_      }t        |d`dadb      }t        |dcdddedfdgdhdidjdkdl      }t        |dmdndodpdqdrdsdtdudvdwdx      }t        |dydzd{dpd|d}d~      }|xs |xr | }|r3|j                  d       t        |dddz      rdnd:}t        dn|dd|      S |r!|j                  d       t        dFd:dd|      S |r'|j                  d       |rdnd:}t        dQ|dd|      S |r1|j                  d       t        |di      rdnd/}t        d|dd|      S |r3|j                  d       t        |dddz      rdnd:}t        dn|dd|      S t        |ddddddddddddddddd      }|r!|j                  d       t        ddDdd|      S t        |ddddddddddddddddd      }|r!|j                  d       t        dd:dd|      S |j                  d       t        dd"dd|      S )Nr    )00-Inbox01-Projekte	02-Wissen03-Recherchen04-Feedback05-Referenzen06-Dailyu   Quelle-Pfad → r0   z\d{4}-\d{2}-\d{2}dailyz	tages-logzsession-startzwrap-upzmorgen-routinezabend-routinejournaltagebuchz	daily logheutezsession endezwrap upzDatum im Titel + Daily-Keywordsgq=
ףp?z*Datum im Titel + Daily-Log-Muster erkannt.r   z.md)r   r   r   r   r   r   zDatei aus 06-Dailyg333333?u&   Datei liegt in 06-Daily → Daily-Typ.r   r   r   r   r   inbox
unsortierttriagevorsortierungpendingr*   zInbox-Keyword oder Pfadg?u3   Inbox-Keyword erkannt — noch nicht klassifiziert.identitysoulpersonawerteu
   identitätzaria identityzuser profilezkais profilzIdentity-Keywordsrootu:   Identity/Persona-Keywords gefunden → root identity-File.schema
konventionzschema-packzvault-schemaz	claude.mdfrontmatterztyping systemz	page typezSchema-Keywordsr,   g)\(?u=   Schema/Konventions-Keywords → Vault-Meta-File in 02-Wissen.templatevorlageboilerplatemusterzprompt-vorlageznote-templatezTemplate-Keywordsr/   u,   Template/Vorlage-Keywords → 05-Referenzen.auditreviewsicherheitscheckzsecurity reviewzcode reviewzprompt injection scanz
tool auditz
repo auditzanalyse-berichtanalyseprojektprojectroadmapsprint	milestonedeliverablezkar-zkadi-v2feature
initiativeepiczstatus-updateplanplanungzimplementation planspecaktivlaufendzin progresslearningzlrn-	korrektur
correction
erkenntnislessonsfeedbackzstanding orderz
lern-regelzpattern erkannt	rechercheresearchfindingstudiepaperz	deep divez	deep-dive	benchmark
comparison	vergleichsurveyinvestigationquellensource	literaturzcross-reportsynthesezkey findingzResearch im Titel (hohe Prio)tiefedeepr-   uA   'Research/Finding/Studie/...' explizit im Titel → research-Typ.zAudit-Keywordsgףp=
?u8   Audit/Review/Analyse-Keywords → 02-Wissen, type audit.zProjekt-Keywordsr+   g(\?uS   Projekt-Keywords erkannt. Bei aktivem Deliverable → 01-Projekte, sonst 02-Wissen.zLearnings-Keywordsr.   	learningsg=
ףp=?u.   Learnings/Feedback-Keywords → learnings-Typ.zResearch-Keywords im Inhaltg      ?u7   Recherche/Research-Keywords im Inhalt → research-Typ.referenz	reference
cheatsheetzcheat sheetconfigkonfiguration	anleitungguidehowtozhow-tosnapshotbackupz	log-dateisubscriptionrsskanalchannelzReference-KeywordsuE   Referenz/Config/Anleitung-Keywords → 05-Referenzen, type reference.systemdinfrastackservicecronhook
deploymentdockerserverinfrastrukturmcphealth
monitoringzapi-key
credentialz
tech stackzsystem designzSystem/Infra-KeywordssystemgRQ?u:   System/Infra-Keywords erkannt → system-Typ in 02-Wissen.u(   Keine klaren Keywords → Fallback inboxg?uD   Kein eindeutiger Typ erkennbar — vorerst Inbox, manuell sortieren.)r   r   as_posixappendresearch
IGNORECASEboolr'   r	   group)titlecontentsource_pathr"   ccombinedr   folder_hintrelfolder_prefixdate_in_titledaily_kwfnameinbox_kwidentity_kw	schema_kwtemplate_kwaudit_kwaudit_in_title
project_kwproject_is_activelearnings_kwresearch_in_titleresearch_in_contentresearch_kwr   ref_kw	system_kws                               r   	_classifyr   :   s   A"A3w{HG #K;((*K 	M""$		3+!1-AB	 ryyc2==I$K #7?@M8Wk?I#_iDH (kZ&?89		.6B49U[[^,C0	
 	
 @B	
 	
 j +,>
 	
 8WlHoyYH;*,01K
 	
 h
FIw&GK*+FR	
 	
 Hhm^NI()+U	
 	
 h
I}h&9K*+OD	
 	
 8Wh0B$m5L/@BH GXy9NXy)Y -I!6?FI*F4J Hgy-HxV[,#Y
<L#%68L A{J	8#[+{(+xR aHk8,j-I#O(;(NJK 67$''68$LR]FY	
 	
 '(P	
 	
 )*"36k	
 	
 +,"%h
";VF	
 	
 45$''68$LR]FO	
 	
 :{L-?K':xn,F +,_]	
 	
 Hi'9fL(Ho8\9l /3I ./+R	
 	
 NN=>ZX	 r   z%/root/aria/brain/youtube/.config.yamlc                    t         j                  j                  d      } | r| S 	 ddl}|j	                  t
        j                  d            }|j                  di       j                  d      }|r|S 	 y# t        $ r Y yw xY w)	u   Liest das Modell aus ARIA_TAXONOMIST_MODEL env, dann .config.yaml models.taxonomist_model,
    dann fällt zurück auf claude-sonnet-4-5.ARIA_TAXONOMIST_MODELr   Nutf-8encodingmodelstaxonomist_modelzclaude-sonnet-4-5)osenvirongetyaml	safe_load_ARIA_CONFIG_PATH	read_text	Exception)env_val_yamlcfgmodels       r   _get_taxonomist_modelr   
  s     jjnn45Goo/9979KL"%))*<=L    s   AA5 5	B Bc           
        	 ddl }|j                         }t               }dj                  d |D              }d}d|  d|dd	  d
| d}	 |j                  j                  |dd|ddidgd|dg      }	|	j                  d   j                  j                         }
t        j                  d|
t        j                         }|r~t#        j$                  |j'                  d            }t)        |j+                  dd      |j+                  dd      t-        |j+                  dd            |j+                  dd      dg      S 	 t        | |d      S # t        $ r/ t        j                  j	                  d       t        | |d      cY S w xY w# t.        $ r-}t        j                  j	                  d| d       Y d}~yd}~ww xY w)uA   Fragt Claude API für bessere Klassifikation. Nur mit --llm Flag.r   Nz7anthropic SDK nicht installiert: pip install anthropic

c              3  &   K   | ]	  }d |   yw)z- Nr   )r    r"   s     r   r#   z$classify_with_llm.<locals>.<genexpr>&  s     :qBqc(:s   zLDu bist ein Aria-Brain Filing-Assistent. Antworte NUR mit einem JSON-Objekt.z"Klassifiziere diese Note:

Titel: z

Inhalt (Auszug):
i  z

Erlaubte Types:
u   

Antworte NUR mit einem JSON-Objekt:
{
  "type": "<type>",
  "folder": "<z.B. 02-Wissen>",
  "confidence": <0.0-1.0>,
  "rationale": "<1-2 Sätze>"
}   r%   r   	ephemeral)r   r%   cache_controluser)roler   )r   
max_tokensr   messagesz\{.*\}r6   r   r*   r   g      ?r   zLLM-Klassifikationzllm-classificationr5   zLLM-Fehler: )	anthropicImportErrorsysstderrwriter   	Anthropicr   joinr   creater   r%   stripr   r   DOTALLjsonloadsr   r	   r   r   r   )r   r   allowed_typesr   clientr   	type_listsystem_promptuser_promptmsgrawmdataes                 r   classify_with_llmr     s   /
   "F!#E		:M::IbMw  	#   K$/oo$$ #)&,k%:  &+>? % 
 kk!n!!'')IIibii0::aggaj)DXXfg.xx*5 ,!<=((;0DE-.   UGT**o  /

ST../h  /

<s"-../s*   E 
C5F	 5FF		F?#F::F?c                 $   t         j                         st        g d      S 	 dd l} | j	                  t         j                  d            }t        |t              r d|v rt        |d   j                               S g dS # t        $ r Y g dS w xY w)N)rL   rq   r`   r1   r;   r   ro   rC   r6   rG   r@   r   r   r   
page_types)
SCHEMA_PACK_PATHexistsr   r   r   r   
isinstancedictkeysr   )r   packs     r   load_allowed_typesr   [  s    ""$ U V 	V~~.88'8JKdD!ld&:\*//122K K  K Ks   AB   	BBc                \    dd|  d|j                    dd| ddg}dj                  |      S )N---ztitle: ztype: ztags: []zdate: zstatus: draftr   )r   r   )r   
suggestiondateliness       r   generate_frontmatterr   l  sH    
%
!"


E 99Ur   c                 	   t        j                  d      } | j                         }|j                  dt        d       |j                  dt
        d       | j                  dt
        d	d
       | j                  dt        d       | j                  ddd       | j                  ddd       | j                  ddd       | j                         }	 dd l}|j                  xs d	}d	}d }|j                  r.t        |j                        }	 |j                  j                  dd      }|j!                  dd      }	t#        |	      d k\  r|	d   j%                         sz|	d   }
|	d   }	 dd l}t'        j(                  d!d" |
t&        j*                  #      }|j-                  |      }t/        |t0              r!|s|j3                  d$      rt        |d$         }n|}|d d% }|s|j                  j4                  j7                  d&d'      j7                  d(d'      j                         }nF|j8                  r"	 |j8                  j                  dd      d d% }n|j:                  r|j:                  }|s|s| j=                          yt?               }|j@                  rtC        |||      }ntE        |||      }dd l#}|jH                  jK                         jM                         }|jN                  rM|tQ        |      |d*}|jR                  rtU        |||      |d+<   tW        tO        jX                  |d,d-             ytW        d.|xs d/        tW        d0|jZ                          tW        d1|j\                   d2       |j^                  d3}tW        d4|        tW        d5|j`                          |jb                  r'tW        d6d7je                  |jb                                |jf                  rtW        d8|jf                          |jR                  r!tW        d9       tW        tU        |||             y# t        $ r# t        j                  j                  d       Y w xY w# t        $ r-}t        j                  j                  d| d       Y d }~yd }~ww xY w# t        $ r |}Y w xY w# t        $ r-}t        j                  j                  d)| d       Y d }~yd }~ww xY w):NuI   Aria Write-Time Filing Helper — empfiehlt Folder + Type für neue Notes)descriptionz--filez'Existierende Markdown-Datei analysieren)r   helpz	--contentzInhalt als direkter Stringz--titler   zTitel der Note)r   defaultr   z--content-filez$Inhalt aus Datei lesen (mit --title)z--json
store_truezJSON-Output)actionr   z--llmu0   Claude API für Klassifikation nutzen (optional)z--show-frontmatterz$Vorgeschlagenes Frontmatter ausgebenr   u<   WARN: pyyaml nicht installiert — schema-pack nicht ladbar
r   replace)r   errorszDatei nicht lesbar: r      r         z$^(\s*(?:related|tags):\s*)(\[\[.+?)$c                    | j                  d       d| j                  d      j                  t        d      t        d             dS )Nr   "r   "   '   )r   r   chr)r   s    r   <lambda>zmain.<locals>.<lambda>  s:    Aaggaj.@.@R#b'.R-SSTU r   )flagsr   i  -r)   _zcontent-file nicht lesbar: )input_titler   r   rB   F)ensure_asciiindentz
Titel   : z(nicht angegeben)z
Type    : z
Folder  : /z.0%zKonfidenz: zRationale: z
Signale : z, zDateiname: u~   
── Vorgeschlagenes Frontmatter ──────────────────────────────)4argparseArgumentParseradd_mutually_exclusive_groupadd_argumentr   r
   
parse_argsr   r   r   r   r   r   filer   r   splitlenr   r   sub	MULTILINEr   r   r   r   stemr   content_filer   
print_helpr   llmr   r   datetimer   today	isoformatr   r   show_frontmatterr   printdumpsr   r   r   r   r   r   r   )apr   argsr   r   r   r   r%   r   partsfm_rawbodyfm_raw_normfmr   r   r  r  outconf_pcts                       r   mainr'  {  s   		 	 _
B ++-E	xdE  G	{8  :OOIC)  +OO$4?  AOOH\&  (OOGLK  MOO(?  A==?DZ
 JJ"EG"Kyy$))n	99&&	&JD
 

5!$u:?58>>#31XF8D ff;U",,
 ^^K0b$' RVVG_ #BwK 0 Du+IINN**34<<S#FLLNE				''11791UV[W[\G 
,,
 '(Mxx&ug}E
ug{;
 MM!++-Eyy  ,&

   !5eZ!OCdjj5;<   	
57$789:
:??+,-
:,,-Q/0 ++C0H:&'J00123Jtyy););<=>?##K
 8 89:;    T  U&uj%@Aq  Z

XYZ  	JJ3A3b9:	&    	JJ:1#R@A	sU   P5 Q$ +A.R 5 R/ 5(Q! Q!$	R-#RRR,+R,/	S%8#S  S%__main__)r%   r
   r&   r
   returnr   )r   r
   r   r
   r   z
str | Noner)  r	   )r)  r
   )r   r
   r   r
   r   r   r)  r	   )r)  r   )r   r
   r   r	   r   r
   r)  r
   )r)  int)__doc__
__future__r   r
  r   r   r   r   dataclassesr   r   r   pathlibr   
VAULT_ROOTr   r	   	_TITLE_LCr'   r   r   r   r   r   r   r'  r   exitr   r   r   <module>r2     s   $ #   	 	 
 0 0 $%
;<  5 5 5 	.I\ @A ";+@K"
od zCHHTV r   