Ë
    Bp±j‹Š  ã                  ó:  — 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ZddlZddlmZmZ ddlmZmZ ddlmZ ddlmZ  ee«      j1                  «       j2                  d   Zed	z  Zd
ZdddœZg d¢Zg d¢Z G d„ de «      Z! ed¬«       G d„ d«      «       Z" ed¬«       G d„ d«      «       Z# ed¬«       G d„ d«      «       Z$ ed¬«       G d„ d«      «       Z%d>d„Z&d?d„Z'd@d„Z(dAd„Z)dBd „Z*dCd!„Z+dDd"„Z,dEd#„Z-dFd$„Z.dGd%„Z/dHd&„Z0	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dId'„Z1dJd(„Z2dKd)„Z3	 	 dL	 	 	 	 	 	 	 	 	 	 	 dMd*„Z4dNd+„Z5dOd,„Z6dPd-„Z7dQd.„Z8dRd/„Z9dNd0„Z:dNd1„Z;dNd2„Z<dNd3„Z=dNd4„Z>dSd5„Z?dNd6„Z@dTd7„ZAdUd8„ZBdNd9„ZCdNd:„ZDdVd;„ZEdWdXd<„ZFeGd=k(  r eH eF«       «      ‚y)Ya&  Prepare and optionally assist TradingView Pine updates.

This tool is intentionally human-in-the-loop. It validates local Pine source,
copies the exact script text for paste, records an update manifest, and can open
TradingView in a normal visible browser session when Playwright is installed.
é    )ÚannotationsN)ÚasdictÚ	dataclass)ÚdatetimeÚtimezone)ÚPath)ÚAnyé   z.tradingview_e2ez"https://www.tradingview.com/chart/i   éè  )ÚwidthÚheight)zCannot compilezCompilation errorzError atzMismatched inputzSyntax errorzUndeclared identifierz-Could not find function or function reference)zsign inzlog inzsign upzjoin for freec                  ó   — e Zd ZdZy)ÚPineParseErrorz7Raised when a Pine script declaration cannot be parsed.N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    úi/Users/jameslopez/projects/TradingBot25/.worktrees/mlp-comparable-measurement/tools/tradingview_update.pyr   r   +   s   „ ÚAr   r   T)Úfrozenc                  óT   — e Zd ZU ded<   ded<   ded<   ded<   ded<   ded	<   ded
<   y)ÚPineScriptInfoÚstrÚpathÚkindÚtitlez
int | NoneÚversionÚsha256ÚintÚ
line_countÚ
char_countN©r   r   r   Ú__annotations__r   r   r   r   r   /   s&   … à
ƒIØ
ƒIØƒJØÓØƒKØƒOØ„Or   r   c                  óH   — e Zd ZU ded<   ded<   ded<   ded<   ed
d„«       Zy	)ÚCheckResultú	list[str]Úcommandr    Ú
returncoder   ÚstdoutÚstderrc                ó    — | j                   dk(  S )Nr   )r)   )Úselfs    r   ÚokzCheckResult.okA   s   € à�‰ !Ñ#Ð#r   N)ÚreturnÚbool)r   r   r   r$   Úpropertyr.   r   r   r   r&   r&   :   s)   … àÓØƒOØƒKØƒKàò$ó ñ$r   r&   c                  ó@   — e Zd ZU ded<   ded<   ded<   ded<   ded	<   y
)ÚPreparedUpdater   Úinfoúlist[CheckResult]Úchecksr   Úsource_copyÚmanifestr0   Ú	clipboardNr#   r   r   r   r3   r3   F   s   … à
ÓØÓØÓØƒNØ„Or   r3   c                  ó,   — e Zd ZU ded<   ded<   ded<   y)ÚDoctorCheckr   Únamer0   r.   ÚdetailNr#   r   r   r   r;   r;   O   s   … à
ƒIØƒHØ„Kr   r;   c                óÂ   — t        | «      } 	 t        | j                  «       j                  t        «      «      S # t
        $ r t        | j                  «       «      cY S w xY w©N)r   r   ÚresolveÚrelative_toÚREPOÚ
ValueError©r   s    r   Úrepo_relativerE   V   sL   € Ü�‹:€Dð#Ü�4—<‘<“>×-Ñ-¬dÓ3Ó4Ð4øÜò #Ü�4—<‘<“>Ó"Ò"ð#ús   �+9 ¹"AÁAc                ó&   — | j                  d¬«      S ©Núutf-8©Úencoding)Ú	read_textrD   s    r   rK   rK   ^   s   € Ø�>‰> 7ˆ>Ó+Ð+r   c                óR  — t        j                  d|› d�| «      }|sy |j                  «       dz
  }d}d}d}t        |t	        | «      «      D ]Y  }| |   }|r|rd}n|dk(  rd}n|dk(  rd}Œ|dk(  rd}Œ'|d	k(  r|dz  }Œ2|d
k(  sŒ8|dz  }|dk(  sŒC| |j                  «       |dz    c S  y )Nz\bz\s*\(r
   r   FÚ\TÚ"Ú(Ú))ÚreÚsearchÚendÚrangeÚlenÚstart)	ÚsourceÚ	call_nameÚmatchrV   ÚdepthÚ	in_stringÚescapedÚidxÚchs	            r   Ú_extract_callr_   b   sÒ   € Ü�I‰I˜˜I˜; eÐ,¨fÓ5€EÙØà�I‰I‹K˜!‰O€EØ€EØ€IØ€GÜ�UœC ›KÖ(ˆØ�C‰[ˆÙÙØ‘Ø�t’Ø‘Ø�s’Ø!�	ØØ�Š9Ø‰IØ�3ŠYØ�Q‰J‰EØ�3‹YØ�Q‰JˆEØ˜‹zØ˜eŸk™k›m¨S°1©WÐ5Ò5ð# )ð$ r   c                óø   — t        j                  d| t         j                  «      }|r|j                  d«      S t        j                  d| t         j                  «      }|r|j                  d«      S t	        d«      ‚)Nz\btitle\s*=\s*"([^"]+)"r
   z\(\s*"([^"]+)"z$Pine declaration has no string title)rQ   rR   ÚDOTALLÚgroupr   )ÚcallÚnamedÚ
positionals      r   Ú_extract_titlerf   €   sa   € Ü�I‰IÐ0°$¼¿	¹	ÓB€EÙØ�{‰{˜1‹~Ðä—‘Ð,¨d´B·I±IÓ>€JÙØ×Ñ Ó"Ð"ä
Ð?Ó
@Ð@r   c                óä  — t        | «      }t        |«      }t        j                  d|t        j                  «      }|rt        |j                  d«      «      nd }dD ]  }t        ||«      }|sŒt        |«      } n t        d«      ‚t        t        |«      |||t        j                  |j                  d«      «      j                  «       t!        |j#                  «       «      t!        |«      ¬«      S )Nz^\s*//@version\s*=\s*(\d+)\s*$r
   )ÚstrategyÚ	indicatorz@Expected a top-level strategy(...) or indicator(...) declarationrH   )r   r   r   r   r   r!   r"   )r   rK   rQ   rR   Ú	MULTILINEr    rb   r_   rf   r   r   rE   Úhashlibr   ÚencodeÚ	hexdigestrU   Ú
splitlines)r   Ú	pine_pathrW   Úversion_matchr   r   rc   r   s           r   Ú
parse_pinerq   Œ   sÍ   € Ü�T“
€IÜ�yÓ!€FÜ—I‘IÐ?ÀÌÏÉÓV€MÙ-:Œc�-×%Ñ% aÓ(Ô)À€Gã)ˆÜ˜V TÓ*ˆÚÜ" 4Ó(ˆEÙð	 *ô Ð_Ó`Ð`äÜ˜9Ó%ØØØÜ�~‰~˜fŸm™m¨GÓ4Ó5×?Ñ?ÓAÜ�v×(Ñ(Ó*Ó+Ü�v“;ôð r   c                ó˜   — t        j                  | t        ddd¬«      }t        | |j                  |j
                  |j                  ¬«      S )NTF)ÚcwdÚcapture_outputÚtextÚcheck)r(   r)   r*   r+   )Ú
subprocessÚrunrB   r&   r)   r*   r+   )r(   Úresults     r   Úrun_commandrz   ¥   sH   € Ü�^‰^ØÜØØØô€Fô ØØ×$Ñ$Ø�}‰}Ø�}‰}ô	ð r   c                ó  — t        | «      } t        t        j                  dt	        | «      g«      g}| j                  «       t        dz  j                  «       k(  r*|j                  t        t        j                  dg«      «       |S )Nztools/check_pine_duplicates.pyz*strategies/strategy_activation_scores.pineztools/check_pine.py)r   rz   ÚsysÚ
executablerE   r@   rB   Úappend)ro   r6   s     r   Úrun_preflightr   µ   sn   € Ü�Y“€Iä”S—^‘^Ð%EÄ}ÐU^ÓG_Ð`Óað€Fð ×ÑÓœtÐ&RÑR×[Ñ[Ó]Ò]Ø�‰”k¤3§>¡>Ð3HÐ"IÓJÔKà€Mr   c                ó˜   — t        j                  d«      sy	 t        j                  dg| dd¬«       y# t        j                  $ r Y yw xY w)NÚpbcopyFT)Úinputru   rv   )ÚshutilÚwhichrw   rx   ÚCalledProcessError)ru   s    r   Úcopy_to_clipboardr†   Á   sI   € Ü�<‰<˜Ô!ØðÜ�‰˜�z¨°DÀÕEð øô ×(Ñ(ò Ùðús   ˜3 ³A	ÁA	c                ó�   — t        j                  dd|j                  «      j                  d«      xs d}| t	        «       › d|› d�z  S )Nú[^A-Za-z0-9_.-]+Ú_Úpine_scriptú.json)rQ   Úsubr   ÚstripÚ	timestamp)Úout_dirr4   Ú
safe_titles      r   Úmanifest_pathr‘   Ë   sC   € Ü—‘Ð+¨S°$·*±*Ó=×CÑCÀCÓHÒYÈM€JØœ	›�} A j \°Ð7Ñ7Ð7r   c                 óf   — t        j                  t        j                  «      j	                  d«      S )Nz%Y%m%dT%H%M%SZ)r   Únowr   ÚutcÚstrftimer   r   r   rŽ   rŽ   Ð   s!   € Ü�<‰<œŸ™Ó%×.Ñ.Ð/?Ó@Ð@r   c                óV   — t        j                  dd| «      j                  d«      xs dS )Nrˆ   r‰   Úcapture)rQ   rŒ   r�   ©Úvalues    r   Úslugifyrš   Ô   s&   € Ü�6‰6Ð% s¨EÓ2×8Ñ8¸Ó=ÒJÀÐJr   c                ó@  — | j                  dd¬«       t        j                  t        j                  «      j                  «       t        |«      t        |«      t        |j                  ddœ|D �cg c]B  }|j                  |j                  |j                  |j                  dd  |j                  dd  dœ‘ŒD c}|||dœd|j                  › d|j                  ›d	�d
dddgdœ}t!        | |«      }	|	j#                  t%        j&                  |dd¬«      dz   d¬«       |	S c c}w )NT©ÚparentsÚexist_ok)Ú	chart_urlÚtarget_nameÚhuman_review_requiredi`ðÿÿ)r(   r)   r.   Ústdout_tailÚstderr_tail)Úcopied_to_clipboardÚopened_default_browserÚopened_playwright_browserz5Open TradingView Pine Editor and select the existing z named Ú.zkPaste the clipboard contents, save/update the script, and confirm TradingView shows no Pine compile errors.zUVisually inspect the chart/strategy tester for the expected script name and behavior.zpIf the script compiles, mark the relevant local sentinel, for example: python3 tools/check_pine.py --mark-valid.zXAttach screenshots or exported trades/CSV to future parity checks when behavior changes.)Ú
created_atÚscriptr7   ÚtradingviewÚlocal_checksÚactionsÚverification_stepsé   ©ÚindentÚ	sort_keysÚ
rH   rI   )Úmkdirr   r“   r   r”   Ú	isoformatr   rE   ÚTRADINGVIEW_CHART_URLr   r(   r)   r.   r*   r+   r   r‘   Ú
write_textÚjsonÚdumps)
r�   r4   r6   r9   Úbrowser_openedÚplaywright_openedr7   rv   Úpayloadr   s
             r   Úwrite_manifestr¼   Ø   s*  € ð ‡M�M˜$¨€MÔ.ä—l‘l¤8§<¡<Ó0×:Ñ:Ó<Ü˜“,Ü$ [Ó1ä.ØŸ:™:Ø%)ñ
ñ  ó	
ñ  �ð !Ÿ=™=Ø#×.Ñ.Ø—h‘hØ$Ÿ|™|¨E¨FÐ3Ø$Ÿ|™|¨E¨FÐ3óð  ñ	
ð $-Ø&4Ø):ñ
ð DÀDÇIÁIÀ;ÈgÐVZ×V`ÑV`ÐUcÐcdÐeØyØcØ~Øfð
ñ1€Gô@ ˜ $Ó'€DØ‡O�O”D—J‘J˜w¨q¸DÔAÀDÑHÐSZ€OÔ[Ø€Kùò3	
s   Á/ADc                óZ  — 	 ddl m} | dz  }|j                  dd¬«        |«       5 }|j                  j                  t        |«      dt        ¬«      }|j                  r|j                  d   n|j                  «       }|j                  |dd	¬
«       t        d«       | dz  }|j                  dd¬«       |dt        «       › d�z  }|j                  t        |«      d¬«       t        dt        |«      › �«       |j!                  «        d d d «       y# t        $ r Y yw xY w# 1 sw Y   yxY w)Nr   ©Úsync_playwrightFúplaywright-profileTrœ   ©ÚheadlessÚviewportÚdomcontentloadedé`ê  ©Ú
wait_untilÚtimeoutzITradingView is open. Press Enter here after you finish/save the update...ÚscreenshotsÚtradingview_ú.png©r   Ú	full_pagezScreenshot saved: )Úplaywright.sync_apir¿   ÚImportErrorr³   ÚchromiumÚlaunch_persistent_contextr   ÚDEFAULT_VIEWPORTÚpagesÚnew_pageÚgotor‚   rŽ   Ú
screenshotÚprintrE   Úclose)	r�   Úurlr¿   Úprofile_dirÚpÚcontextÚpageÚscreenshot_dirÚscreenshot_paths	            r   Úopen_playwright_browserrà     s%  € ðÝ7ð Ð0Ñ0€KØ×Ñ˜d¨TÐÔ2Ù	Ô	˜aØ—*‘*×6Ñ6Ü�ÓØÜ%ð 7ó 
ˆð
 $+§=¢=ˆw�}‰}˜QÒ°g×6FÑ6FÓ6HˆØ�	‰	�#Ð"4¸fˆ	ÔEÜÐYÔZØ  =Ñ0ˆØ×Ñ T°DÐÔ9Ø(¨\¼)»+¸ÀdÐ+KÑKˆØ�‰œS Ó1¸TˆÔBÜÐ"¤=°Ó#AÐ"BÐCÔDØ�‰Œ÷ 
ð øô) ò Ùðú÷
 
ð ús   ‚D §C"D!Ä	DÄDÄ!D*c                ó  — | dz  }|j                  dd¬«       |t        «       › dt        |j                  «      › d�z  }|j	                  |d¬«       |dt        |j                  «      › d�z  }|j	                  |d¬«       |S )	NrW   Trœ   r‰   z.pinerH   rI   Úlatest_)r³   rŽ   rš   r   r¶   )r�   r4   rW   Ú
source_dirÚsource_pathÚlatest_paths         r   Úwrite_source_copyræ   !  s‹   € Ø˜8Ñ#€JØ×Ñ˜T¨DÐÔ1Ø¤)£+ ¨a´¸¿
¹
Ó0CÐ/DÀEÐJÑJ€KØ×Ñ˜6¨GÐÔ4à ¬°·±Ó)<Ð(=¸UÐCÑC€KØ×Ñ˜6¨GÐÔ4ØÐr   c           	     ó4  — t        | «      j                  «       st        | z  j                  «       n
t        | «      }t	        |«      }t        |«      }t        |«      }d}	|st        |«      }	t        |||«      }
t        ||||	|||
«      }t        |||
||	¬«      S )NF)r4   r6   r7   r8   r9   )r   Úis_absoluterB   r@   rq   r   rK   r†   ræ   r¼   r3   )Úpiner�   Úno_clipboardr¹   rº   ro   r4   r6   rW   r9   r7   r8   s               r   Ústage_updaterë   ,  sž   € ô 04°D«z×/EÑ/EÔ/G”˜‘×%Ñ%Ô'ÌTÐRVËZ€IÜ�iÓ €DÜ˜9Ó%€FÜ�yÓ!€Fà€IÙÜ% fÓ-ˆ	ä# G¨T°6Ó:€KÜ˜g t¨V°YÀÐPaÐcnÓo€HÜØØØØØôð r   c                ór  — 	 ddl m} t	        | j
                  «      }|dz  }|j                  dd¬«       |dt        «       › d	�z  } |«       5 }|j                  j                  d¬
«      }|j                  t        ¬«      }|j                  dd¬«       |j                  «       }|j                  t        |«      d¬«       |j!                  «        d d d «       dk(  |t#        |«      dœ}	t        t%        j&                  |	dd¬«      «       |	d   rdS dS # t        $ r t        d«       Y yw xY w# 1 sw Y   Œ_xY w)Nr   r¾   úIPython Playwright is not installed. See docs/tradingview_e2e_workflow.md.r
   rÉ   Trœ   Úsmoke_rË   ©rÂ   ©rÃ   z^data:text/html,<title>tradingview-e2e-smoke</title><body><h1>TradingView E2E smoke</h1></body>rÄ   )rÇ   rÌ   ztradingview-e2e-smoke)r.   r   rÖ   r®   r¯   r.   )rÎ   r¿   rÏ   r×   Úresolve_out_dirr�   r³   rŽ   rÐ   ÚlaunchrÔ   rÒ   rÕ   r   rÖ   r   rØ   rE   r·   r¸   )
Úargsr¿   r�   rÞ   rß   rÛ   ÚbrowserrÝ   r   r»   s
             r   Úplaywright_smokerõ   G  s3  € ðÝ7ô
 ˜dŸl™lÓ+€GØ˜}Ñ,€NØ×Ñ °ÐÔ5Ø$¨´	³¨}¸DÐ'AÑA€Oá	Ô	˜aØ—*‘*×#Ñ#¨TÐ#Ó2ˆØ×ÑÔ)9ÐÓ:ˆØ�	‰	ð:à)ð 	ô 	
ð
 —
‘
“ˆØ�‰œS Ó1¸TˆÔBØ�‰Œ÷ 
ð Ð.Ñ.ØÜ# OÓ4ñ€Gô
 
Œ$�*‰*�W Q°$Ô
7Ô8Ø˜’ˆ1Ð$ 1Ð$øô7 ò ÜÐYÔZÙðú÷ 
Ð	ús   ‚D ÁBD-ÄD*Ä)D*Ä-D6c                ó>   — | j                  t        |||¬«      «       y )N)r<   r.   r=   )r~   r;   )r6   r<   r.   r=   s       r   Úadd_doctor_checkr÷   h  s   € Ø
‡M�M”+ 4¨B°vÔ>Õ?r   c                ó�   — | D �cg c]&  }|j                  «       sŒ|j                  «       sŒ%|‘Œ( }}|sy t        |d„ ¬«      S c c}w )Nc                óN   — | j                  «       j                  | j                  fS r?   )ÚstatÚst_mtimer<   rD   s    r   Ú<lambda>zlatest_file.<locals>.<lambda>p  s   € ¨4¯9©9«;×+?Ñ+?ÀÇÁÑ*Kr   )Úkey)ÚexistsÚis_fileÚmax)Úpathsr   Úexistings      r   Úlatest_filer  l  s@   € Ù!&ÓK¡˜¨$¯+©+­-¸D¿L¹L½N’ €HÐKÙØÜˆxÑKÔLÐLùò Ls   …A›A¬Ac                óH   — t        t        | j                  |«      «      «      S r?   )r  ÚlistÚglob)ÚrootÚpatterns     r   Úlatest_globr	  s  s   € Ü”t˜DŸI™I gÓ.Ó/Ó0Ð0r   c                ó†   — | sy 	 t        j                  | j                  d¬«      «      S # t         j                  $ r Y y w xY wrG   )r·   ÚloadsrK   ÚJSONDecodeErrorrD   s    r   Úload_json_filer  w  s?   € ÙØðÜ�z‰z˜$Ÿ.™.°'˜.Ó:Ó;Ð;øÜ×Ñò Ùðús   …$* ªA ¿A c                ó  — t        | j                  «      }t        |d«      xs t        |d«      }t        |d«      }t        |d«      }t        |dz  d«      }t        |dz  d«      }t        |d	z  d
«      }t        |«      }t        |«      }	t        |«      }
|
xs |	xs |}t	        |t
        «      r!t	        |j                  d«      t
        «      r|n|}|j                  «       t        |«      |rt        |«      nd |rt        |«      nd |rt        |«      nd |rt        |«      nd |rt        |«      nd |rt        |«      nd t	        |t
        «      r|j                  d«      nd t	        |t
        «      r@t	        |j                  d«      t
        «      r!|j                  di «      j                  d«      nd t	        |
t
        «      r|
j                  d«      nd dœ}t        t        j                  |dd¬«      «       |d   rdS dS )Nz*_MLPScores.jsonz*.jsonz*_capture.jsonz*_manual_update.jsonrÉ   z*.pngÚ	page_textz*.txtrW   z*.piner©   r.   r   Úverification)r.   r�   Úlatest_manifestÚlatest_captureÚlatest_manual_updateÚlatest_screenshotÚlatest_textÚlatest_sourceÚlatest_result_okÚlatest_script_titleÚmanual_update_verificationr®   Tr¯   r   r
   )rñ   r�   r	  r  Ú
isinstanceÚdictÚgetrþ   rE   r×   r·   r¸   )ró   r�   r8   r—   Úmanual_updaterÖ   ru   rW   Úmanifest_payloadÚcapture_payloadÚmanual_payloadÚlatest_payloadÚtitle_sourcer»   s                 r   Ústatusr#  €  sÖ  € Ü˜dŸl™lÓ+€GÜ˜7Ð$6Ó7ÒY¼;ÀwÐPXÓ;Y€HÜ˜'Ð#3Ó4€GÜ Ð)?Ó@€MÜ˜W }Ñ4°gÓ>€JÜ�w Ñ,¨gÓ6€DÜ˜ 8Ñ+¨XÓ6€Fä% hÓ/ÐÜ$ WÓ-€OÜ# MÓ2€NØ#ÒJ ÒJÐ:J€Nä�>¤4Ô(¬Z¸×8JÑ8JÈ8Ó8TÔVZÔ-[ñ "àð ð
 �n‰nÓÜ  Ó)Ù6>œ=¨Ô2ÀDÙ4;œ-¨Ô0ÀÙ@M¤¨mÔ <ÐSWÙ:Dœ]¨:Ô6È$Ù.2”} TÔ*¸Ù28œ vÔ.¸dÜ8BÀ>ÔSWÔ8X˜N×.Ñ.¨tÔ4Ð^bô ˜,¬Ô-´*¸\×=MÑ=MÈhÓ=WÔY]Ô2^ð ×Ñ˜X rÓ*×.Ñ.¨wÔ7àäLVÐWeÔgkÔLl n×&8Ñ&8¸Ô&HÐrvñ€Gô" 
Œ$�*‰*�W Q°$Ô
7Ô8Ø˜’ˆ1Ð$ 1Ð$r   c                ó  — g }t        | j                  «      j                  «       st        | j                  z  nt        | j                  «      }t	        |dt        j                  «       t        t        «      «       t	        |dt        dz  j                  «       d«       t	        |ddt        dz  j                  d¬«      v d«       	 t        |«      }t	        |d	d
|j                  › d|j                  ›�«       |j                  «       rQt        |«      }|D �cg c]  }|j                  rŒ|‘Œ }}t	        |d| |sdndj                  d„ |D «       «      «       nt	        |dddt        |«      › �«       	 t         j"                  j%                  d«      }t	        |dd
|«       	 ddlm}	 t	        |dd
d«       t/        | j0                  «      }
d }d }d }|	�rI| j2                  s| j4                  �r0|
dz  }|
dz  }|j7                  d
d
¬«       |j7                  d
d
¬«       	  |	«       5 }| j2                  rª|dt9        «       › d�z  }|j:                  j=                  d
¬«      }|j?                  t@        ¬«      }|jC                  d«       |j                  «       }|jE                  t        |«      d
¬ «       |jG                  «        t	        |d!|d"k(  t        |«      «       | j4                  �r,t9        «       }|d#|› d�z  }|d#|› d$�z  }|j:                  j=                  d
¬«      }|j?                  t@        ¬«      }|jC                  tH        d%| jJ                  ¬&«       | jL                  r|jO                  | jL                  «       |jQ                  d'«      jS                  d(¬)«      }|jE                  t        |«      d
¬ «       |jG                  «        |jU                  |d¬«       d*|v xr
 d+|v xs d,|v }t	        |d-|t        |«      › dt        |«      › �«       d d d «       tW        d/„ |D «       «      |rtY        |«      nd |D �cg c]  }tY        |«      ‘Œ c}|rt        |«      nd |rt        |«      nd |rt        |«      nd d0œ}t[        t]        j^                  |d1d
¬2«      «       |d   rdS d3S # t        $ r$}d }t	        |d	dt        |«      «       Y d }~�ŒÛd }~ww xY wc c}w # t         j"                  j&                  $ r t	        |ddd«       Y �Œmw xY w# t,        $ r$}t	        |ddt        |«      «       d }	Y d }~�Œ„d }~ww xY w# 1 sw Y   �Œ/xY w# t        $ r"}t	        |d.dt        |«      «       Y d }~�ŒXd }~ww xY wc c}w )4NÚrepozrequirements-e2ezrequirements-e2e.txtzgitignore-artifactsz.tradingview_e2e/z
.gitignorerH   rI   z
pine-parseTÚ Fzpine-preflightr.   z; c              3  óp   K  — | ].  }d j                  |j                  «      › d|j                  › �–— Œ0 y­w)r&  ú -> N)Újoinr(   r)   ©Ú.0rv   s     r   Ú	<genexpr>zdoctor.<locals>.<genexpr>¼  s4   è ø€ Ð-uÑntÐej°·±¸%¿-¹-Ó1HÐ0IÈÈe×N^ÑN^ÐM_Ô.`Ñntùs   ‚46zmissing Ú
playwrightzplaywright-pythonznot installedr   r¾   zplaywright-importrÉ   r  rœ   Údoctor_browser_rË   rï   rð   z6data:text/html,<title>doctor</title><h1>doctor ok</h1>rÌ   zbrowser-launchÚdoctorÚdoctor_tradingview_ú.txtrÄ   rÆ   Úbodyéˆ  ©rÈ   Ú
IndicatorsÚ	WatchlistúPine Editorztradingview-renderzbrowser-runtimec              3  ó4   K  — | ]  }|j                   –— Œ y ­wr?   ©r.   r*  s     r   r,  zdoctor.<locals>.<genexpr>ü  s   è ø€ Ð/©˜u�%—(•(©ùs   ‚)r.   ré   r6   Úbrowser_screenshotÚtradingview_screenshotÚtradingview_textr®   r¯   r
   )0r   ré   rè   rB   r÷   rþ   r   rK   rq   r   r   Ú	Exceptionr   r.   r)  rE   Ú	importlibÚmetadatar   ÚPackageNotFoundErrorrÎ   r¿   rÏ   rñ   r�   rô   rª   r³   rŽ   rÐ   rò   rÔ   rÒ   rÕ   rÖ   rØ   rµ   Ú
timeout_msÚwait_msÚwait_for_timeoutÚlocatorÚ
inner_textr¶   Úallr   r×   r·   r¸   )ró   r6   ro   r4   ÚexcÚ	preflightrv   Úfailedr   r¿   r�   r:  r;  r<  rÞ   Útext_dirrÛ   rô   rÝ   r   Ústampru   Úrenderedr»   s                           r   r/  r/  ¦  s)  € Ø "€FÜ(,¨T¯Y©Y«×(CÑ(CÔ(E”�t—y‘yÒ Ì4ÐPT×PYÑPYË?€Iä�V˜V¤T§[¡[£]´C¼³IÔ>Ü�VÐ/´$Ð9OÑ2O×1WÑ1WÓ1YÐ[qÔrÜ�VÐ2Ð4GÌDÐS_ÑL_×KjÑKjÐt{ÐKjÓK|Ð4|ð  Rô  Sð@Ü˜)Ó$ˆÜ˜ ¨t¸¿	¹	°{À!ÀDÇJÁJÀ>Ð5RÔSð
 ×ÑÔÜ! )Ó,ˆ	Ù%.Ó?¡Y˜E°e·h³h’% YˆÐ?ÜØØØˆJÙ‰D D§I¡IÑ-uÑntÓ-uÓ$uõ		
ô 	˜Ð!1°5¸HÄ]ÐS\ÓE]ÐD^Ð:_Ô`ðNÜ×$Ñ$×,Ñ,¨\Ó:ˆÜ˜Ð!4°d¸GÔDðBÝ7ô
 	˜Ð!4°d¸DÔAä˜dŸl™lÓ+€GØÐØ!ÐØÐÚ˜DŸLšL¨D×,<Ó,<Ø  =Ñ0ˆØ˜[Ñ(ˆØ×Ñ T°DÐÔ9Ø�‰˜t¨dˆÔ3ð!	IÙ Ô" aØ—<’<Ø)7¸OÌIËKÈ=ÐX\Ð:]Ñ)]Ð&ØŸj™j×/Ñ/¸Ð/Ó>�GØ"×+Ñ+Ô5EÐ+ÓF�DØ—I‘IÐVÔWØ ŸJ™J›L�EØ—O‘O¬Ð-?Ó)@ÈD�OÔQØ—M‘M”OÜ$ VÐ-=¸uÈÑ?PÔR_Ð`rÓRsÔtà×#Ó#Ü%›K�EØ-;Ð@SÐTYÐSZÐZ^Ð>_Ñ-_Ð*Ø'/Ð4GÈÀwÈdÐ2SÑ'SÐ$ØŸj™j×/Ñ/¸Ð/Ó>�GØ"×+Ñ+Ô5EÐ+ÓF�DØ—I‘IÔ3Ð@RÐ\`×\kÑ\k�IÔlØ—|’|Ø×-Ñ-¨d¯l©lÔ;ØŸ<™<¨Ó/×:Ñ:À4Ð:ÓH�DØ—O‘O¬Ð-CÓ)DÐPT�OÔUØ—M‘M”OØ$×/Ñ/°¸wÐ/ÔGØ+¨tÐ3Òf¸ÈÐ9LÒ9eÐP]ÐaeÐPe�HÜ$ØØ,Ø Ü(Ð)?Ó@ÐAÀÄMÐRbÓDcÐCdÐeô	÷3 #ôF Ñ/©Ó/Ó/Ù $”�t”¨$Ù.4Ó5©f U”6˜%•=¨fÑ5ÙCUœmÐ,>Ô?Ð[_ÙKa¤-Ð0FÔ"GÐgkÙ?OœMÐ*:Ô;ÐUYñ€Gô 
Œ$�*‰*�W Q°$Ô
7Ô8Ø˜’ˆ1Ð$ 1Ð$øôg ò @ØˆÜ˜ ¨u´c¸#³h×?Ò?ûð@üò @øô ×Ñ×2Ñ2ò NÜ˜Ð!4°e¸_×MðNûô
 ò Ü˜Ð!4°e¼SÀ»XÔFØŽûðú÷  #Ñ"ûô> ò 	IÜ˜VÐ%6¸¼sÀ3»x×HÒHûð	Iüò 6s…   Ã2R+ ÄSÄ)SÅ4-S  Æ"T ÈU È%G0UÐU Ñ U=Ò+	SÒ4SÓSÓ +TÔTÔ	T?ÔT:Ô:T?ÕUÕU Õ	U:ÕU5Õ5U:c                óJ  — 	 ddl m} t	        | j
                  «      }|dz  }|dz  }|dz  }|j                  dd¬	«       |j                  dd¬	«       t        | j                  xs | j                  «      }t        «       }||› d
|› d�z  }||› d
|› d�z  }	||› d
|› d�z  }
 |«       5 }|j                  j                  t        |«      | j                   t        ¬«      }|j                   r|j                   d   n|j#                  «       }|j%                  | j                  | j&                  | j(                  ¬«       | j*                  r|j-                  | j*                  «       |j/                  «       }| j0                  r!|j3                  d«      j5                  d¬«      nd}|j7                  t        |«      d¬«       |j9                  «        d d d «       | j0                  r|	j;                  d¬«       d| j                  t=        |«      | j0                  rt=        |	«      nd | j                  dœ}|
j;                  t?        j@                  |dd¬«      dz   d¬«       t        t?        j@                  |dd¬«      «       y# t        $ r t        d«       Y yw xY w# 1 sw Y   ŒÍxY w)Nr   r¾   rí   r
   rÀ   rÉ   r  Trœ   r‰   rË   r1  z_capture.jsonrÁ   rÆ   r2  r3  r4  Ú rÌ   rH   rI   )r.   rÙ   r   rÖ   ru   Úheadedr®   r¯   r²   )!rÎ   r¿   rÏ   r×   rñ   r�   r³   rš   ÚlabelrÙ   rŽ   rÐ   rÑ   r   rO  rÒ   rÓ   rÔ   rÕ   rÇ   rA  rB  rC  r   Ú	save_textrD  rE  rÖ   rØ   r¶   rE   r·   r¸   )ró   r¿   r�   rÚ   rÞ   rJ  rP  rK  rß   Ú	text_pathÚmetadata_pathrÛ   rÜ   rÝ   r   Úvisible_textr»   s                    r   Úcapture_urlrU    sW  € ðÝ7ô
 ˜dŸl™lÓ+€GØÐ0Ñ0€KØ˜}Ñ,€NØ˜Ñ$€HØ×Ñ °ÐÔ5Ø‡N�N˜4¨$€NÔ/ä�D—J‘JÒ* $§(¡(Ó+€EÜ‹K€EØ$¨%¨°°%°¸Ð'=Ñ=€OØ˜e˜W A e W¨DÐ1Ñ1€IØ   q¨¨¨}Ð=Ñ=€Má	Ô	˜aØ—*‘*×6Ñ6Ü�ÓØŸ™�_Ü%ð 7ó 
ˆð
 $+§=¢=ˆw�}‰}˜QÒ°g×6FÑ6FÓ6HˆØ�	‰	�$—(‘( t§¡ÀÇÁˆ	ÔPØ�<Š<Ø×!Ñ! $§,¡,Ô/Ø—
‘
“ˆØHLÏÊ�t—|‘| FÓ+×6Ñ6¸tÐ6ÔDÐ\^ˆØ�‰œS Ó1¸TˆÔBØ�‰Œ÷ 
ð ‡~‚~Ø×Ñ˜\°GÐÔ<ð Ø�x‰xØÜ# OÓ4Ø,0¯NªN”˜iÔ(ÀØ—+‘+ñ€Gð ×ÑœTŸZ™Z¨¸ÀTÔJÈTÑQÐ\cÐÔdÜ	Œ$�*‰*�W Q°$Ô
7Ô8Øøô[ ò ÜÐYÔZÙðú÷" 
Ð	ús   ‚I? Â'D&JÉ?JÊJÊJ"c                ó˜  — 	 ddl m} t	        | j
                  «      }|dz  }|dz  }|dz  }|j                  dd¬	«       |j                  dd¬	«       t        «       }|d
|› d�z  }|d
|› d�z  }|d
|› d�z  }	 |«       5 }
|
j                  j                  t        |«      | j                   t        ¬«      }|j                  r|j                  d   n|j                  «       }|j                  | j                   | j"                  | j$                  ¬«       | j&                  rt)        d«       | j*                  r|j-                  | j*                  «       |j/                  «       }|j1                  d«      j3                  d¬«      }|j5                  t        |«      d¬«       |j7                  «        d d d «       |j9                  d¬«       |j;                  «       }t<        D �cg c]	  }||v sŒ|‘Œ }}dD �cg c]	  }||v sŒ|‘Œ }}d| j                   t?        |«      t?        |«      t?        |«      tA        |«      ||tA        |«      xr | dœ
}|	j9                  tC        jD                  |dd¬«      dz   d¬«       t        tC        jD                  |dd¬«      «       y# t        $ r t        d«       Y yw xY w# 1 sw Y   �Œ
xY wc c}w c c}w )Nr   r¾   rí   r
   rÀ   rÉ   r  Trœ   Úprofile_status_rË   r1  r‹   rÁ   rÆ   z`Use the visible browser to sign in or inspect TradingView, then press Enter to capture status...r2  r3  r4  rÌ   rH   rI   )r5  r7  ÚSaveÚPublish)
r.   rÙ   r   rÚ   rÖ   ru   Úlogin_prompt_detectedÚlogin_promptsÚcontrols_seenÚprofile_ready_hintr®   r¯   r²   )#rÎ   r¿   rÏ   r×   rñ   r�   r³   rŽ   rÐ   rÑ   r   rO  rÒ   rÓ   rÔ   rÕ   rÙ   rÇ   rA  Úwait_for_userr‚   rB  rC  r   rD  rE  rÖ   rØ   r¶   ÚlowerÚLOGIN_PROMPT_PATTERNSrE   r0   r·   r¸   )ró   r¿   r�   rÚ   rÞ   rJ  rK  rß   rR  rS  rÛ   rÜ   rÝ   r   rT  Ú
lower_textr  r[  Úitemr\  r»   s                        r   Úprofile_statusrc  :  sž  € ðÝ7ô
 ˜dŸl™lÓ+€GØÐ0Ñ0€KØ˜}Ñ,€NØ˜Ñ$€HØ×Ñ °ÐÔ5Ø‡N�N˜4¨$€NÔ/ä‹K€EØ$¨¸¸¸tÐ'DÑD€OØ˜_¨U¨G°4Ð8Ñ8€IØ °¨w°eÐ<Ñ<€Má	Ô	˜aØ—*‘*×6Ñ6Ü�ÓØŸ™�_Ü%ð 7ó 
ˆð
 $+§=¢=ˆw�}‰}˜QÒ°g×6FÑ6FÓ6HˆØ�	‰	�$—(‘( t§¡ÀÇÁˆ	ÔPØ×ÒÜÐtÔuØ�<Š<Ø×!Ñ! $§,¡,Ô/Ø—
‘
“ˆØ—|‘| FÓ+×6Ñ6¸tÐ6ÓDˆØ�‰œS Ó1¸TˆÔBØ�‰Œ÷ 
ð" ×Ñ˜°ÐÔ8Ø×#Ñ#Ó%€JÝ,AÓ[Ñ,A ÀWÐPZÒEZ’WÐ,A€MÐ[Ù&VÓoÑ&V˜dÐZ^ÐbnÒZn’TÐ&V€MÐoàØ�x‰xØÜ$ [Ó1Ü# OÓ4Ü˜iÓ(Ü!% mÓ!4Ø&Ø&Ü" =Ó1ÒG¸-Ð6Gñ€Gð ×ÑœTŸZ™Z¨¸ÀTÔJÈTÑQÐ\cÐÔdÜ	Œ$�*‰*�W Q°$Ô
7Ô8Øøôg ò ÜÐYÔZÙðú÷  
Ñ	üò& \ùÚos6   ‚J Á>D/J5Ç 	KÇ*KÇ4	KÇ>KÊJ2Ê1J2Ê5J?c                óR  — 	 ddl m} t	        | j
                  «      }t        | j                  || j                  «      }t        |j                  |j                  |j                  |j                  «       t        dt        |j                  «      › �«       t!        d„ |j                  D «       «      ry|dz  }|dz  }|d	z  }|j#                  d
d
¬«       |j#                  d
d
¬«       t%        | j&                  xs d|j                  j(                  › �«      }t+        «       }||› d|› d�z  }	||› d|› d�z  }
||› d|› d�z  }| j,                  xs |j                  j(                  g}| j.                  xs t0        }t        «        t        d«       t        d|j                  j2                  › d|j                  j(                  › �«       t        dt        |j                  «      › �«       t        d«       t        d«        |«       5 }|j4                  j7                  t9        |«      dt:        ¬«      }|j<                  r|j<                  d   n|j?                  «       }|jA                  | jB                  | jD                  | jF                  ¬«       tI        d«       | jJ                  r|jM                  | jJ                  «       |j)                  «       }|jO                  d«      jQ                  d¬«      }|jS                  t9        |	«      d
¬«       |jU                  «        d d d «       |
jW                  d¬ «       tY        |||«      }|d!   | jB                  t[        |j                  «      t        |j                  «      t        |j                  «      t        |	«      t        |
«      |||d"œ}|jW                  t]        j^                  |d#d
¬$«      d%z   d¬ «       t        t]        j^                  |d#d
¬$«      «       |d!   rdS dS # t        $ r t        d«       Y yw xY w# 1 sw Y   ŒÿxY w)&Nr   r¾   rí   r
   ú  Source copy: c              3  ó6   K  — | ]  }|j                    –— Œ y ­wr?   r9  r*  s     r   r,  z guided_update.<locals>.<genexpr>  ó   è ø€ Ð
5¡_˜Eˆu�x‰xŒ<¡_ùó   ‚rÀ   rÉ   r  Trœ   zmanual-update-r‰   rË   r1  z_manual_update.jsonz,A visible browser will open. In TradingView:z.  1. Open Pine Editor and select the existing z: z*  2. Paste from clipboard, or paste from: zM  3. Save/update the script and confirm the editor reports no compile errors.zDReturn here and press Enter after the save/compile step is complete.FrÁ   rÆ   z/Press Enter to capture verification evidence...r2  r3  r4  rÌ   rH   rI   r.   )r.   rÙ   Ú
page_titler©   r8   r7   rÖ   ru   r  ÚexpectedÚrejectedr®   r¯   r²   )0rÎ   r¿   rÏ   r×   rñ   r�   rë   ré   rê   Úprint_summaryr4   r6   r8   r9   rE   r7   Úanyr³   rš   rP  r   rŽ   ÚexpectÚrejectÚDEFAULT_REJECT_PATTERNSr   rÐ   rÑ   r   rÒ   rÓ   rÔ   rÕ   rÙ   rÇ   rA  r‚   rB  rC  rD  rE  rÖ   rØ   r¶   Úverify_text_contentr   r·   r¸   )ró   r¿   r�   ÚpreparedrÚ   rÞ   rJ  rP  rK  rß   rR  rS  rj  rk  rÛ   rÜ   rÝ   r   rT  r  r»   s                        r   Úguided_updaters  s  s›  € ðÝ7ô
 ˜dŸl™lÓ+€GÜ˜DŸI™I w°×0AÑ0AÓB€HÜ�(—-‘- §¡°(×2CÑ2CÀX×EWÑEWÔXÜ	ˆOœM¨(×*>Ñ*>Ó?Ð@Ð
AÔBä
Ñ
5 X§_¢_Ó
5Ô5ØàÐ0Ñ0€KØ˜}Ñ,€NØ˜Ñ$€HØ×Ñ °ÐÔ5Ø‡N�N˜4¨$€NÔ/ä�D—J‘JÒH N°8·=±=×3FÑ3FÐ2GÐ"HÓI€EÜ‹K€EØ$¨%¨°°%°¸Ð'=Ñ=€OØ˜e˜W A e W¨DÐ1Ñ1€IØ   q¨¨Ð/BÐCÑC€MØ�{‰{Ò3˜xŸ}™}×2Ñ2Ð3€HØ�{‰{Ò5Ô5€Hä	„GÜ	Ð
8Ô9Ü	Ð:¸8¿=¹=×;MÑ;MÐ:NÈbÐQY×Q^ÑQ^×QdÑQdÐPeÐ
fÔgÜ	Ð6´}ÀX×EYÑEYÓ7ZÐ6[Ð
\Ô]Ü	Ð
YÔZÜ	Ð
PÔQá	Ô	˜aØ—*‘*×6Ñ6Ü�ÓØÜ%ð 7ó 
ˆð
 $+§=¢=ˆw�}‰}˜QÒ°g×6FÑ6FÓ6HˆØ�	‰	�$—(‘( t§¡ÀÇÁˆ	ÔPÜÐ?Ô@Ø�<Š<Ø×!Ñ! $§,¡,Ô/Ø—
‘
“ˆØ—|‘| FÓ+×6Ñ6¸tÐ6ÓDˆØ�‰œS Ó1¸TˆÔBØ�‰Œ÷ 
ð  ×Ñ˜°ÐÔ8Ü& |°X¸xÓH€Là˜4Ñ Ø�x‰xØÜ˜Ÿ™Ó'Ü! (×"3Ñ"3Ó4Ü$ X×%9Ñ%9Ó:Ü# OÓ4Ü˜iÓ(Ø$ØØñ€Gð ×ÑœTŸZ™Z¨¸ÀTÔJÈTÑQÐ\cÐÔdÜ	Œ$�*‰*�W Q°$Ô
7Ô8Ø˜TÒ"ˆ1Ð)¨Ð)øôE ò ÜÐYÔZÙðú÷B 
Ð	ús   ‚P ÈDPÐPÐPÐP&c                óŠ   — |D �cg c]  }|sŒ|| vsŒ|‘Œ }}|D �cg c]  }|sŒ|| v sŒ|‘Œ }}| xr | ||dœS c c}w c c}w )N)r.   Úmissing_expectedÚfound_rejectedr   )ru   rj  rk  rb  ru  rv  s         r   rq  rq  »  sc   € Ù)1ÓO© ²T¸dÈ$Ò>Nš¨ÐÐOÙ'/ÓI¡x˜t²4¸DÀDºL’d x€NÐIà"Ð"Ò9¨>Ð'9Ø,Ø(ñð ùò PùÚIs   …;�;’;œA ¤A ©A c                óf  — t        | j                  «      }|j                  «       s	t        |z  }|j	                  d¬«      }| j
                  xs t        }t        || j                  |«      }i |¥t        |«      | j                  |dœ¥}t        t        j                  |dd¬«      «       |d   rdS d	S )
NrH   rI   )ru   rj  rk  r®   Tr¯   r.   r   r
   )r   ru   rè   rB   rK   ro  rp  rq  rn  rE   r×   r·   r¸   )ró   rR  ru   rk  ry   r»   s         r   Úverify_textrx  Å  s§   € Ü�T—Y‘Y“€IØ× Ñ Ô"Ü˜9Ñ$ˆ	Ø×Ñ¨ÐÓ0€DØ�{‰{Ò5Ô5€HÜ   t§{¡{°HÓ=€FðØ
ðä˜iÓ(Ø—K‘KØò	€Gô 
Œ$�*‰*�W Q°$Ô
7Ô8Ø�t’ˆ1Ð# !Ð#r   c                óx   — t        | «      j                  «       st        | z  j                  «       S t        | «      S r?   )r   rè   rB   r@   r˜   s    r   rñ   rñ   Ö  s-   € Ü+/°«;×+BÑ+BÔ+DŒD�5‰L×!Ñ!Ó#ÐUÌ$ÈuË+ÐUr   c                ó®  — |D �cg c]  }|j                   rŒ|‘Œ }}t        d| j                  › d| j                  ›�«       t        d| j                  › �«       t        d| j
                  › �«       t        dt        |«      › �«       t        d|rdnd› �«       t        «        |rRt        d	«       |D ]6  }t        d
dj                  |j                  «      › d|j                  › �«       Œ8 t        d«       y t        d«       t        d
| j                  › �«       t        «        t        d«       t        t        j                  dd¬«      «       y c c}w )Nz Prepared TradingView update for r&  z  Source:   z  SHA-256:  z  Manifest: z  Clipboard: Úupdatedznot availablezPreflight failed:z  r(  z*Fix these before pasting into TradingView.z=Preflight passed. Use the exact same TradingView script name:zNext human-in-the-loop step:z Open TradingView, select the existing script with that name in Pine Editor, paste from the clipboard, save it, and visually confirm there are no compile errors.éX   )r   )r.   r×   r   r   r   r   rE   r)  r(   r)   ÚtextwrapÚfill)r4   r6   r8   r9   rv   rI  s         r   rl  rl  Ú  s"  € Ù!'Ó8¡˜¨u¯x«xŠe €FÐ8Ü	Ð,¨T¯Y©Y¨K°q¸¿¹¸Ð
GÔHÜ	ˆL˜Ÿ™˜Ð
$Ô%Ü	ˆL˜Ÿ™˜Ð
&Ô'Ü	ˆLœ xÓ0Ð1Ð
2Ô3Ü	ˆM¡y™)°oÐFÐ
GÔHÜ	„GÙÜÐ!Ô"ÛˆEÜ�B�s—x‘x §¡Ó.Ð/¨t°E×4DÑ4DÐ3EÐFÕGð äÐ:Õ;äÐMÔNÜ��4—:‘:�,ÐÔ ÜŒÜÐ,Ô-ÜŒh�m‰mðcàô
õ 	ùò# 9s
   …E—Ec                ód  — t        | j                  «      }t        | j                  || j                  | j
                  | j                  «      }t        |j                  |j                  |j                  |j                  «       t        dt        |j                  «      › �«       t        d„ |j                  D «       «      ryd}| j
                  rt!        j
                  t"        «      }d}| j                  rt%        |t"        «      }|st        d«       | j
                  r|sy| j                  r|syy)Nre  c              3  ó6   K  — | ]  }|j                    –— Œ y ­wr?   r9  r*  s     r   r,  zprepare.<locals>.<genexpr>ù  rg  rh  r
   Frí   r   )rñ   r�   rë   ré   rê   ÚopenÚplaywright_openrl  r4   r6   r8   r9   r×   rE   r7   rm  Ú
webbrowserrµ   rà   )ró   r�   rr  r¹   rº   s        r   Úpreparer„  ó  sê   € Ü˜dŸl™lÓ+€GÜ˜DŸI™I w°×0AÑ0AÀ4Ç9Á9Èd×NbÑNbÓc€HÜ�(—-‘- §¡°(×2CÑ2CÀX×EWÑEWÔXÜ	ˆOœM¨(×*>Ñ*>Ó?Ð@Ð
AÔBä
Ñ
5 X§_¢_Ó
5Ô5Øà€NØ‡y‚yÜ#Ÿ™Ô)>Ó?ˆàÐØ×ÒÜ3°GÔ=RÓSÐÙ ÜÐ]Ô^à‡y‚y™ØØ×ÒÑ$5ØØr   c                ó‚   — t        | j                  «      }t        t        j                  t        |«      dd¬«      «       y)Nr®   Tr¯   r   )rq   ré   r×   r·   r¸   r   )ró   r4   s     r   Úinspectr†    s,   € Ü�d—i‘iÓ €DÜ	Œ$�*‰*”V˜D“\¨!°tÔ
<Ô=Ør   c                 óâ  — t        j                  t        ¬«      } | j                  dd¬«      }|j	                  dd¬«      }|j                  dd	¬«       |j                  t        ¬
«       |j	                  dd¬«      }|j                  dd¬«       |j                  dt        t        j                  t        «      «      ¬«       |j                  ddd¬«       |j                  ddd¬«       |j                  ddd¬«       |j                  t        ¬
«       |j	                  dd¬«      }|j                  dd¬«       |j                  dt        ¬«       |j                  dd¬«       |j                  dt        t        j                  t        «      «      ¬«       |j                  ddd¬«       |j                  dt        dd¬ «       |j                  d!t        d"¬#«       |j                  d$g d%¢d&¬'«       |j                  d(d)g d*¬+«       |j                  d,d)g d-¬+«       |j                  t        ¬
«       |j	                  d.d/¬«      }|j                  dt        t        j                  t        «      «      ¬«       |j                  t         ¬
«       |j	                  d0d1¬«      }|j                  d2d3¬«       |j                  dt        t        j                  t        «      «      ¬«       |j                  d4dd5¬«       |j                  d6dd7¬«       |j                  dt        d8¬#«       |j                  d!t        d"¬#«       |j                  t"        ¬
«       |j	                  d9d:¬«      }|j                  dt        t        j                  t        «      «      ¬«       |j                  t$        ¬
«       |j	                  d;d<¬«      }|j                  dt        ¬«       |j                  dd¬«       |j                  dt        t        j                  t        «      «      ¬«       |j                  d=dd>¬«       |j                  d?dd@¬«       |j                  dt        dAd¬ «       |j                  d!t        d"¬#«       |j                  d$g d%¢d&¬'«       |j                  t&        ¬
«       |j	                  dBdC¬«      }	|	j                  dt        ¬«       |	j                  dt        t        j                  t        «      «      ¬«       |	j                  d=ddD¬«       |	j                  dEddF¬«       |	j                  dt        d8¬#«       |	j                  d!t        d"¬#«       |	j                  d$g d%¢d&¬'«       |	j                  t(        ¬
«       |j	                  dGdH¬«      }
|
j                  dIddJ¬K«       |
j                  d(d)g dL¬+«       |
j                  d,d)g d-¬+«       |
j                  t*        ¬
«       | S )MN)Údescriptionr(   T)ÚdestÚrequiredr†  z"Print parsed Pine metadata as JSON)Úhelpré   zPath to a .pine script)Úfuncr„  z(Preflight and stage a TradingView updatez%Path to a .pine strategy or indicatorz	--out-dir)Údefaultz--no-clipboardÚ
store_truez!Do not copy Pine source to pbcopy)Úactionr‹  z--openz-Open TradingView chart in the default browserz--playwright-openzVOpen a visible persistent Playwright browser and save a screenshot after manual reviewzmanual-updatezTStage Pine, open TradingView, wait for manual save, then capture and verify evidencez--urlz--labelrN  z	--wait-msr   zExtra wait before capture)Útyper�  r‹  z--timeout-msrÅ   )r�  r�  z--wait-until)ÚcommitrÄ   ÚloadÚnetworkidlerÄ   )Úchoicesr�  z--expectr~   zHString expected in the captured text. Defaults to the Pine script title.)r�  r�  r‹  z--rejectzKString that must not appear. Defaults to common Pine compile-error phrases.Úsmokez2Verify Playwright can launch and save a screenshotr/  zCheck TradingView E2E readinessz--pinez#strategies/strategy_mlp_scores.pinez	--browserz*Launch a local headless browser smoke testz--tradingviewz)Capture TradingView chart render evidencei¸  r#  z*Summarize latest TradingView E2E artifactsr—   z3Navigate to a URL and save screenshot/text metadataz--headedz,Show the browser instead of headless capturez--save-textz-Save visible body text next to the screenshotr   zprofile-statusz9Capture persistent TradingView profile readiness evidencez#Show the persistent browser profilez--wait-for-userz&Wait for Enter before capturing statuszverify-textz5Check captured text for expected and rejected stringsz--textz&Path to captured visible-text artifact)rŠ  r‹  zHString that must appear in the captured text; repeat for multiple checks)ÚargparseÚArgumentParserr   Úadd_subparsersÚ
add_parserÚadd_argumentÚset_defaultsr†  r   ÚDEFAULT_OUT_DIRrA   rB   r„  rµ   r    rs  rõ   r/  r#  rU  rc  rx  )ÚparserÚ
subparsersÚinspect_parserÚprepare_parserÚguided_parserÚsmoke_parserÚdoctor_parserÚstatus_parserÚcapture_parserÚprofile_parserÚverify_parsers              r   Úbuild_parserr¨    sË  € Ü×$Ñ$´Ô9€FØ×&Ñ&¨IÀÐ&ÓE€Jà×*Ñ*¨9Ð;_Ð*Ó`€NØ×Ñ Ð-EÐÔFØ×Ñ¤WÐÔ-à×*Ñ*¨9Ð;eÐ*Óf€NØ×Ñ Ð-TÐÔUØ×Ñ ´S¼×9TÑ9TÔUYÓ9ZÓ5[ÐÔ\Ø×ÑÐ 0¸ÐLoÐÔpØ×Ñ °ÐDsÐÔtØ×ÑØØØeð  ô ð
 ×Ñ¤WÐÔ-à×)Ñ)ØØcð *ó €Mð ×Ñ˜vÐ,SÐÔTØ×Ñ˜wÔ0EÐÔFØ×Ñ˜y°"ÐÔ5Ø×Ñ˜{´C¼×8SÑ8SÔTXÓ8YÓ4ZÐÔ[Ø×ÑÐ/¸ÐKnÐÔoØ×Ñ˜{´¸dÐIdÐÔeØ×Ñ˜~´CÀÐÔHØ×ÑØÚEØ"ð ô ð
 ×ÑØØØØWð	 ô ð ×ÑØØØØZð	 ô ð ×Ñ¤MÐÔ2à×(Ñ(¨Ð7kÐ(Ól€LØ×Ñ˜k´3´×7RÑ7RÔSWÓ7XÓ3YÐÔZØ×ÑÔ#3ÐÔ4à×)Ñ)¨(Ð9ZÐ)Ó[€MØ×Ñ˜xÐ1VÐÔWØ×Ñ˜{´C¼×8SÑ8SÔTXÓ8YÓ4ZÐÔ[Ø×Ñ˜{°<ÐFrÐÔsØ×Ñ˜°|ÐJuÐÔvØ×Ñ˜{´¸dÐÔCØ×Ñ˜~´CÀÐÔHØ×Ñ¤FÐÔ+à×)Ñ)¨(Ð9eÐ)Óf€MØ×Ñ˜{´C¼×8SÑ8SÔTXÓ8YÓ4ZÐÔ[Ø×Ñ¤FÐÔ+à×*Ñ*¨9Ð;pÐ*Óq€NØ×Ñ Ô1FÐÔGØ×Ñ 	°2ÐÔ6Ø×Ñ ´S¼×9TÑ9TÔUYÓ9ZÓ5[ÐÔ\Ø×Ñ 
°<ÐFtÐÔuØ×Ñ °lÐIxÐÔyØ×Ñ ´#¸qÐGbÐÔcØ×Ñ ´SÀ&ÐÔIØ×ÑØÚEØ"ð  ô ð
 ×Ñ¤[ÐÔ1à×*Ñ*Ð+;ÐB}Ð*Ó~€NØ×Ñ Ô1FÐÔGØ×Ñ ´S¼×9TÑ9TÔUYÓ9ZÓ5[ÐÔ\Ø×Ñ 
°<ÐFkÐÔlØ×ÑÐ 1¸,ÐMuÐÔvØ×Ñ ´#¸tÐÔDØ×Ñ ´SÀ&ÐÔIØ×ÑØÚEØ"ð  ô ð
 ×Ñ¤^ÐÔ4à×)Ñ)¨-Ð>uÐ)Óv€MØ×Ñ˜x°$Ð=eÐÔfØ×ÑØØØØWð	 ô ð ×ÑØØØØZð	 ô ð ×Ñ¤KÐÔ0à€Mr   c                óZ   — t        «       }|j                  | «      }|j                  |«      S r?   )r¨  Ú
parse_argsrŒ  )Úargvr�  ró   s      r   Úmainr¬  †  s'   € Ü‹^€FØ×Ñ˜TÓ"€DØ�9‰9�T‹?Ðr   Ú__main__)r   ú
str | Pathr/   r   )r   r   r/   r   )rW   r   rX   r   r/   z
str | None)rc   r   r/   r   )r   r®  r/   r   )r(   r'   r/   r&   )ro   r®  r/   r5   )ru   r   r/   r0   )r�   r   r4   r   r/   r   )r/   r   )r™   r   r/   r   )r�   r   r4   r   r6   r5   r9   r0   r¹   r0   rº   r0   r7   r   r/   r   )r�   r   rÙ   r   r/   r0   )r�   r   r4   r   rW   r   r/   r   )FF)ré   r   r�   r   rê   r0   r¹   r0   rº   r0   r/   r3   )ró   zargparse.Namespacer/   r    )
r6   zlist[DoctorCheck]r<   r   r.   r0   r=   r   r/   ÚNone)r  z
list[Path]r/   úPath | None)r  r   r  r   r/   r°  )r   r°  r/   zdict[str, Any] | None)ru   r   rj  r'   rk  r'   r/   zdict[str, Any])r™   r   r/   r   )
r4   r   r6   r5   r8   r   r9   r0   r/   r¯  )r/   zargparse.ArgumentParserr?   )r«  zlist[str] | Noner/   r    )Ir   Ú
__future__r   r–  rk   Úimportlib.metadatar>  r·   rQ   rƒ   rw   r|   r}  rƒ  Údataclassesr   r   r   r   Úpathlibr   Útypingr	   Ú__file__r@   r�   rB   rœ  rµ   rÒ   rp  r`  rC   r   r   r&   r3   r;   rE   rK   r_   rf   rq   rz   r   r†   r‘   rŽ   rš   r¼   rà   ræ   rë   rõ   r÷   r  r	  r  r#  r/  rU  rc  rs  rq  rx  rñ   rl  r„  r†  r¨  r¬  r   Ú
SystemExitr   r   r   Ú<module>r¸     si  ðñõ #ã Û Û Û Û 	Û Û Û 
Û Û ß )ß 'Ý Ý ñ ˆHƒ~×ÑÓ×'Ñ'¨Ñ*€ØÐ+Ñ+€Ø<Ð Ø!¨TÑ2Ð òÐ ò JÐ ôB�Zô Bñ �$Ô÷ð ó ðñ �$Ô÷$ð $ó ð$ñ �$Ô÷ð ó ðñ �$Ô÷ð ó ðó#ó,óó<	Aóó2ó 	óó8ó
AóKð,Øð,à
ð,ð ð,ð ð	,ð
 ð,ð ð,ð ð,ð 
ó,ó^ó4ð !Ø#ðØ
ðàðð ðð ð	ð
 ðð óó6%óB@óMó1óó#%óL^%óB0óf6órE*óPó$ó"Vóó2ó4ópôfð ˆzÒÙ
‘T“VÓ
Ðð r   