§
    qÜ¾jžQ  ã                  óè  — d Z ddlmZ ddlZddl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mZ  ee	j        d¦  «        re	j                             d¬¦  «          ee¦  «                             ¦   «         j        j        j        Z ee¦  «        e	j        vr$e	j                             d ee¦  «        ¦  «         dd	lmZmZmZmZmZmZmZmZ  G d
„ d¦  «        Z dd„Z!e"dk    r e!¦   «          dS dS )a:  
FreeExile Design Pipeline Manager & Cross-Department Autonomous Dispatcher.
Enforces the 2026 Autonomous Game Studio Directives for the Art & UI/UX Department.
Manages the end-to-end lifecycle of Design Requests (DRQ):
  Inbox -> In-Progress -> Pending Review -> 2-Stage Approval (QA + CEO) -> Approved/Rejected.
é    )ÚannotationsN)ÚPath)ÚAnyÚreconfigureúutf-8©Úencoding)ÚApprovalVerdictÚAssetCategoryÚAssetDeliverableÚAuditReportÚDesignRequestÚPriorityÚRequestStatusÚis_power_of_twoc                  ó’   — e Zd ZdZd=d>d„Zd?d„Zd@d„Z	 dAdBd„ZdCd „Zd=dDd"„Z	dEd$„Z
	 	 	 	 	 dFdGd2„Zd3ej        d4dfdHd9„ZdId;„ZdJd<„ZdS )KÚDesignPipelineManagerz@Core autonomous workflow engine for FreeExile Design Department.NÚworkspace_rootúPath | str | NoneÚreturnÚNonec                óh  — |€;t          t          ¦  «                             ¦   «         j        j        j        | _        n&t          |¦  «                             ¦   «         | _        | j        dz  | _        | j        dz  | _        | j        dz  | _        | j        dz  | _        | j        dz  | _	        | j        dz  | _
        | j        dz  | _        | j        dz  | _        | j        d	z  | _        | j        dz  | _        | j        dz  | _        | j        d
z  dz  d	z  | _        |                      ¦   «          d S )NÚdocsÚdesign_requestsÚ	templatesÚinboxÚin_progressÚpending_reviewÚapprovedÚrejectedÚassetsÚclientÚwebapp)r   Ú__file__ÚresolveÚparentr   Údocs_dirÚdesign_requests_dirÚtemplates_dirÚ	inbox_dirÚin_progress_dirÚpending_review_dirÚapproved_dirÚrejected_dirÚassets_rootÚassets_pendingÚassets_approvedÚclient_webapp_assetsÚ_ensure_directories)Úselfr   s     úEC:\Projects\FreeExile\tools\asset_pipeline\design_pipeline_manager.pyÚ__init__zDesignPipelineManager.__init__*   s-  € ØÐ!å"&¥x¡.¤.×"8Ò"8Ñ":Ô":Ô"AÔ"HÔ"OˆDÔÐå"& ~Ñ"6Ô"6×">Ò">Ñ"@Ô"@ˆDÔàÔ+¨fÑ4ˆŒØ#'¤=Ð3DÑ#DˆÔ Ø!Ô5¸ÑCˆÔØÔ1°GÑ;ˆŒØ#Ô7¸-ÑGˆÔØ"&Ô":Ð=MÑ"MˆÔØ Ô4°zÑAˆÔØ Ô4°zÑAˆÔàÔ.°Ñ9ˆÔØ"Ô.Ð1AÑAˆÔØ#Ô/°*Ñ<ˆÔØ$(Ô$7¸(Ñ$BÀXÑ$MÐPXÑ$XˆÔ!à× Ò Ñ"Ô"Ð"Ð"Ð"ó    c                ó¢   — | j         | j        | j        | j        | j        | j        | j        | j        f}|D ]}|                     dd¬¦  «         ŒdS )z5Creates all necessary directory pipelines if missing.T©ÚparentsÚexist_okN)	r)   r*   r+   r,   r-   r.   r0   r1   Úmkdir)r4   ÚdirsÚds      r5   r3   z)DesignPipelineManager._ensure_directoriesA   sh   € ð Ô ¤°Ô0DÀdÔF]ØÔ˜tÔ0°$Ô2EÀtÔG[ð
ˆð ð 	1ð 	1ˆAØ�GŠG˜D¨4ˆGÑ0Ô0Ð0Ð0ð	1ð 	1r7   Ú	file_pathr   r   c                óø  — |                      d¬¦  «        }|j        j        }	 t          |¦  «        }n# t          $ r t          j        }Y nw xY wt          j        d|¦  «        }|r|                     d¦  «        n|j	        }t          j        d|¦  «        }|r'|                     d¦  «         
                    ¦   «         n|j	        }t          j        d|¦  «        }	|	r'|	                     d¦  «         
                    ¦   «         nd}
t          j        d|¦  «        }|r'|                     d¦  «         
                    ¦   «         nd	}t          j        d
|¦  «        }|r'|                     d¦  «                             ¦   «         nd}	 t          |¦  «        }n# t          $ r t          j        }Y nw xY wt          j        d|¦  «        }|r'|                     d¦  «                             ¦   «         nd}	 t          |¦  «        }n# t          $ r t          j        }Y nw xY wt          j        d|¦  «        }|r'|                     d¦  «         
                    ¦   «         nd}t          j        d|¦  «        }|r'|                     d¦  «         
                    ¦   «         nd}t          j        d|¦  «        }|r'|                     d¦  «         
                    ¦   «         nd}t!          ||||
|||||||¬¦  «        S )zIParses Markdown Design Request file into structured DesignRequest object.r   r   u>   \*\*MÃ£ YÃªu Cáº§u \(Request ID\)\*\*:\s*`?([A-Za-z0-9_\-]+)`?é   u)   \*\*TÃªn YÃªu Cáº§u \(Title\)\*\*:\s*(.+)u;   \*\*PhÃ²ng Ban Khá»Ÿi Táº¡o \(Requesting Dept\)\*\*:\s*(.+)ÚDocumentationuA   \*\*TÃ i Liá»‡u Nguá»“n CÄƒn Cá»© \(Source Document\)\*\*:\s*(.+)Ú uK   \*\*PhÃ¢n Loáº¡i TÃ i NguyÃªn \(Asset Category\)\*\*:\s*`?([A-Za-z0-9_]+)`?ÚconceptuA   \*\*Má»©c Ä�á»™ Æ¯u TiÃªn \(Priority\)\*\*:\s*`?([A-Za-z0-9_]+)`?ÚmediumuZ   \*\*Sub-Agent Tiáº¿p Nháº­n Chá»‰ Ä�á»‹nh \(Assigned Subagent\)\*\*:\s*`?([A-Za-z0-9_]+)`?Úart_ui_directoru=   \*\*NgÃ y Khá»Ÿi Táº¡o \(Created Date\)\*\*:\s*`?([0-9\-]+)`?z
2026-09-29uA   \*\*Háº¡n Ä�á»‹nh Má»¥c TiÃªu \(Target SLA\)\*\*:\s*`?([^`\n]+)`?Ú48h)Ú
request_idÚtitleÚ
source_docÚrequesting_deptÚcategoryÚpriorityÚassigned_agentÚstatusÚ
created_atÚ
target_slar?   )Ú	read_textr&   Únamer   Ú
ValueErrorÚINBOXÚreÚsearchÚgroupÚstemÚstripÚlowerr   ÚCONCEPTr   ÚMEDIUMr   )r4   r?   ÚcontentÚparent_namerO   Úreq_id_matchrH   Útitle_matchrI   Ú
dept_matchrK   Úsource_matchrJ   Ú	cat_matchÚcat_strrL   Ú
prio_matchÚprio_strrM   Úagent_matchrN   Ú
date_matchrP   Ú	sla_matchrQ   s                            r5   Úparse_request_filez(DesignPipelineManager.parse_request_fileJ   s-  € à×%Ò%¨wÐ%Ñ7Ô7ˆð  Ô&Ô+ˆð	)Ý" ;Ñ/Ô/ˆFˆFøÝð 	)ð 	)ð 	)Ý"Ô(ˆFˆFˆFð	)øøøõ ”yÐ!bÐdkÑlÔlˆØ.:ÐN�\×'Ò'¨Ñ*Ô*Ð*À	Äˆ
å”iÐ LÈgÑVÔVˆØ0;ÐO�×!Ò! !Ñ$Ô$×*Ò*Ñ,Ô,Ð,ÀÄˆå”YÐ]Ð_fÑgÔgˆ
Ø9CÐX˜*×*Ò*¨1Ñ-Ô-×3Ò3Ñ5Ô5Ð5Èˆå”yÐ!eÐgnÑoÔoˆØ6BÐJ�\×'Ò'¨Ñ*Ô*×0Ò0Ñ2Ô2Ð2Èˆ
å”IÐlÐnuÑvÔvˆ	Ø09ÐH�)—/’/ !Ñ$Ô$×*Ò*Ñ,Ô,Ð,¸yˆð	-Ý$ WÑ-Ô-ˆHˆHøÝð 	-ð 	-ð 	-Ý$Ô,ˆHˆHˆHð	-øøøõ ”YÐcÐelÑmÔmˆ
Ø2<ÐJ�:×#Ò# AÑ&Ô&×,Ò,Ñ.Ô.Ð.À(ˆð	'Ý Ñ)Ô)ˆHˆHøÝð 	'ð 	'ð 	'Ý”ˆHˆHˆHð	'øøøõ ”iÐ }ð  @Gñ  Hô  HˆØ9DÐ[˜×*Ò*¨1Ñ-Ô-×3Ò3Ñ5Ô5Ð5ÐJ[ˆå”YÐ_ÐahÑiÔiˆ
Ø4>ÐP�Z×%Ò% aÑ(Ô(×.Ò.Ñ0Ô0Ð0ÀLˆ
å”IÐbÐdkÑlÔlˆ	Ø3<ÐG�Y—_’_ QÑ'Ô'×-Ò-Ñ/Ô/Ð/À%ˆ
åØ!ØØ!Ø+ØØØ)ØØ!Ø!Øð
ñ 
ô 
ð 	
s3   ¤4 ´AÁAÆ	F ÆF2Æ1F2Ç6H ÈHÈHrG   rH   ÚstrrI   rJ   rK   rL   r   rM   r   rN   Úlore_contextÚ
specs_dictúdict[str, str]Údeliverablesú	list[str]rQ   c                ó¾  — | j         |› d�z  }d                     d„ |	                     ¦   «         D ¦   «         ¦  «        }d                     d„ |
D ¦   «         ¦  «        }d|› d|› d|› d|› d	|› d
|j                             ¦   «         › d|j                             ¦   «         › d|› d|› d|› d|› d|› d�}|                     |d¬¦  «         |                      |¦  «        S )z9Creates a standardized design request markdown in inbox/.ú.mdú
c              3  ó.   K  — | ]\  }}d |› d|› d�V — ŒdS )z| **z** | z |N© )Ú.0ÚkÚvs      r5   ú	<genexpr>z7DesignPipelineManager.create_request.<locals>.<genexpr>˜   s:   è è € ÐSÐS¹¸¸1Ð3 aÐ3Ð3¨aÐ3Ð3Ð3ÐSÐSÐSÐSÐSÐSr7   c              3  ó"   K  — | ]
}d |› d�V — ŒdS )ú- [ ] `ú`Nrv   )rw   r>   s     r5   rz   z7DesignPipelineManager.create_request.<locals>.<genexpr>™   s*   è è € Ð*PÐ*P¸a¨>°Q¨>¨>¨>Ð*PÐ*PÐ*PÐ*PÐ*PÐ*Pr7   z# FREEEXILE DESIGN REQUEST: uN   

## 1. THÃ”NG TIN YÃŠU Cáº¦U (METADATA)

- **MÃ£ YÃªu Cáº§u (Request ID)**: `u!   `
- **TÃªn YÃªu Cáº§u (Title)**: u2   
- **PhÃ²ng Ban Khá»Ÿi Táº¡o (Requesting Dept)**: u8   
- **TÃ i Liá»‡u Nguá»“n CÄƒn Cá»© (Source Document)**: u4   
- **PhÃ¢n Loáº¡i TÃ i NguyÃªn (Asset Category)**: `u+   `
- **Má»©c Ä�á»™ Æ¯u TiÃªn (Priority)**: `uD   `
- **Sub-Agent Tiáº¿p Nháº­n Chá»‰ Ä�á»‹nh (Assigned Subagent)**: `ue   `
- **NgÃ y Khá»Ÿi Táº¡o (Created Date)**: 2026-09-29
- **Háº¡n Ä�á»‹nh Má»¥c TiÃªu (Target SLA)**: `uz   `

---

## 2. Bá»�I Cáº¢NH NGHIá»†P Vá»¤ & Cá»�T TRUYá»†N (CONTEXT & LORE)

### 2.1. Bá»‘i Cáº£nh VÃµ Há»�c & TÃ­nh NÄƒng
u‘   

---

## 3. THÃ”NG Sá»� Ká»¸ THUáº¬T CHI TIáº¾T (TECHNICAL SPECIFICATIONS)

| TiÃªu ChÃ­ Ká»¹ Thuáº­t | YÃªu Cáº§u Chi Tiáº¿t |
| :--- | :--- |
uK   

---

## 4. DANH Má»¤C Sáº¢N PHáº¨M Ä�áº¦U RA MONG Ä�á»¢I (DELIVERABLES)

uK  

---

## 5. BIÃŠN Báº¢N NGHIá»†M THU 2 Cáº¤P (TWO-STAGE APPROVAL GATE)

### Cáº¥p 1: Tháº©m Ä�á»‹nh Ká»¹ Thuáº­t & Hiá»‡u NÄƒng (QA Technical Audit)
*NgÆ°á»�i thá»±c hiá»‡n: `qa_stress_tester`*
- [ ] KÃ­ch thÆ°á»›c tá»‡p tá»‘i Æ°u.
- [ ] KÃ­ch thÆ°á»›c áº£nh chuáº©n lÅ©y thá»«a 2 ($2^n$).
- [ ] KhÃ´ng gÃ¢y drop frame (< 8.33ms/frame 120Hz).
- [ ] Normal map chuáº©n Tangent-Space.
- **Káº¿t Quáº£ Cáº¥p 1**: `PENDING`
- **Ghi ChÃº Ká»¹ Thuáº­t**: ChÆ°a nghiá»‡m thu

### Cáº¥p 2: Nghiá»‡m Thu Tháº©m Má»¹ & Cá»‘t Truyá»‡n (CEO & Art Director Audit)
*NgÆ°á»�i thá»±c hiá»‡n: `studio_producer` & `art_ui_director`*
- [ ] Ä�Ãºng phong cÃ¡ch Cá»• VÃµ Háº¯c Ã�m 2.5D.
- [ ] Ä�Ãºng tinh tháº§n VLTK1 hiá»‡n Ä‘áº¡i hÃ³a.
- [ ] 100% NguyÃªn báº£n (Original IP).
- **Káº¿t Quáº£ Cáº¥p 2**: `PENDING`
- **Ã� Kiáº¿n PhÃª Duyá»‡t**: ChÆ°a phÃª duyá»‡t
r   r   )r*   ÚjoinÚitemsÚvalueÚupperÚ
write_textrk   )r4   rH   rI   rJ   rK   rL   rM   rN   rm   rn   rp   rQ   Útarget_fileÚ
specs_rowsÚdeliverables_checklistÚmarkdown_bodys                   r5   Úcreate_requestz$DesignPipelineManager.create_request‡   su  € ð ”n¨*Ð'9Ð'9Ð'9Ñ9ˆà—Y’YÐSÐSÀ
×@PÒ@PÑ@RÔ@RÐSÑSÔSÑSÔSˆ
Ø!%§¢Ð*PÐ*PÀ<Ð*PÑ*PÔ*PÑ!PÔ!PÐð7¸ð 7ð 7ð &0ð	7ð 7ð
 !&ð7ð 7ð 3Bð7ð 7ð 9Cð7ð 7ð 5=´N×4HÒ4HÑ4JÔ4Jð7ð 7ð +3¬.×*>Ò*>Ñ*@Ô*@ð7ð 7ð DRð7ð 7ð 1;ð7ð 7ð& ð'7ð 7ð6 ð77ð 7ðB ðC7ð 7ð 7ˆðp 	×Ò˜}°wÐÑ?Ô?Ð?Ø×&Ò& {Ñ3Ô3Ð3r7   úlist[DesignRequest]c                óB  — g }| j                              d¦  «        D ]j}	 |                      |¦  «        }|                     |¦  «         Œ.# t          $ r0}t          d|j        › d|› �t          j        ¬¦  «         Y d}~Œcd}~ww xY w| 	                    d„ ¬¦  «         |S )zcScans the inbox folder and returns requests sorted by priority (CRITICAL -> HIGH -> MEDIUM -> LOW).ú*.mdz$[WARN] Failed to parse request file ú: )ÚfileNc                ó   — | j         j        S ©N)rM   Úrank)Úrs    r5   ú<lambda>z2DesignPipelineManager.scan_inbox.<locals>.<lambda>á   s
   €  A¤J¤O€ r7   )Úkey)
r*   Úglobrk   ÚappendÚ	ExceptionÚprintrS   ÚsysÚstderrÚsort)r4   ÚrequestsrŒ   ÚreqÚes        r5   Ú
scan_inboxz DesignPipelineManager.scan_inboxÖ   sÑ   € à(*ˆØ”N×'Ò'¨Ñ/Ô/ð 	`ð 	`ˆDð`Ø×-Ò-¨dÑ3Ô3�Ø—’ Ñ$Ô$Ð$Ð$øÝð `ð `ð `ÝÐM¸T¼YÐMÐMÈ!ÐMÐMÕTWÔT^Ð_Ñ_Ô_Ð_Ð_Ð_Ð_Ð_Ð_øøøøð`øøøð 	�ŠÐ3Ð3ˆÑ4Ô4Ð4Øˆs    *AÁ
BÁ&B Â Bú
str | Nonec                ó  — | j         |› d�z  }|                     ¦   «         sL| j        |› d�z  }|                     ¦   «         r|                      |¦  «        S t	          d|› d|› d�¦  «        ‚| j        |› d�z  }|                     d¬¦  «        }|rt          j        dd|› d	�|¦  «        }|                     |d¬¦  «         | 	                    ¦   «          | j
        |z  }|                     d
d
¬¦  «         |                      |¦  «        S )zVMoves a request from inbox/ to in_progress/ and updates assigned subagent if provided.rs   úRequest z not found in inbox (ú)r   r   uZ   (\*\*Sub-Agent Tiáº¿p Nháº­n Chá»‰ Ä�á»‹nh \(Assigned Subagent\)\*\*:\s*)`?[A-Za-z0-9_]+`?z\g<1>`r}   Tr9   )r*   Úexistsr+   rk   ÚFileNotFoundErrorrR   rV   Úsubr‚   Úunlinkr0   r<   )r4   rH   rN   Úsrc_fileÚ	prog_fileÚdst_filer^   Úreq_asset_dirs           r5   Údispatch_requestz&DesignPipelineManager.dispatch_requestä   sK  € à”> zÐ$6Ð$6Ð$6Ñ6ˆØ�ŠÑ Ô ð 	]àÔ,°*Ð/AÐ/AÐ/AÑAˆIØ×ÒÑ!Ô!ð :Ø×.Ò.¨yÑ9Ô9Ð9Ý#Ð$[¨zÐ$[Ð$[ÐPXÐ$[Ð$[Ð$[Ñ\Ô\Ð\àÔ'¨ZÐ*<Ð*<Ð*<Ñ<ˆà×$Ò$¨gÐ$Ñ6Ô6ˆØð 	Ý”fØmØ+˜.Ð+Ð+Ð+Øñô ˆGð 	×Ò˜G¨gÐÑ6Ô6Ð6Ø�ŠÑÔÐð Ô+¨jÑ8ˆØ×Ò D°4ÐÑ8Ô8Ð8à×&Ò& xÑ0Ô0Ð0r7   úlist[str | Path]c                óÜ  — | j         |› d�z  }|                     ¦   «         st          d|› d|› d�¦  «        ‚| j        |› d�z  }|                     d¬¦  «        }|D ]P}t          |¦  «        j        }|                     d|› d�d	|› d�¦  «        }|                     d
|› �d|› �¦  «        }ŒQ|                     |d¬¦  «         | 	                    ¦   «          |  
                    |¦  «        S )zPMoves request from in_progress/ to pending_review/ and records submitted assets.rs   r    z not found in in_progress (r¡   r   r   r|   r}   z- [x] `z- [ ] z- [x] )r+   r¢   r£   r,   rR   r   rS   Úreplacer‚   r¥   rk   )r4   rH   rp   r¦   r¨   r^   ÚitemÚ	item_names           r5   Úsubmit_for_reviewz'DesignPipelineManager.submit_for_review  s)  € àÔ'¨ZÐ*<Ð*<Ð*<Ñ<ˆØ�ŠÑ Ô ð 	cÝ#Ð$a¨zÐ$aÐ$aÐV^Ð$aÐ$aÐ$aÑbÔbÐbàÔ*°
Ð-?Ð-?Ð-?Ñ?ˆà×$Ò$¨gÐ$Ñ6Ô6ˆð !ð 	Rð 	RˆDÝ˜T™
œ
œˆIØ—o’oÐ&<°	Ð&<Ð&<Ð&<Ð>TÈ	Ð>TÐ>TÐ>TÑUÔUˆGØ—o’oÐ&:¨yÐ&:Ð&:Ð<PÀYÐ<PÐ<PÑQÔQˆGˆGà×Ò˜G¨gÐÑ6Ô6Ð6Ø�ŠÑÔÐà×&Ò& xÑ0Ô0Ð0r7   Úqa_stress_testeré   TrC   ÚauditorÚmax_file_size_kbÚintÚrequire_power_of_twoÚboolÚoverride_verdictúApprovalVerdict | NoneÚnotesú(tuple[bool, str, list[AssetDeliverable]]c                ó  — | j         |› d�z  }|                     ¦   «         st          d|› d|› d�¦  «        ‚| j        |z  }g }	g }
|                     ¦   «         r!t	          |                     ¦   «         ¦  «        s|
                     d|› �¦  «         d}d}|                     ¦   «         �rÑ|                     d¦  «        D �]º}|                     ¦   «         �r¢| 	                    ¦   «         j
        dz  }d	\  }}d
}|j                             ¦   «         dv }|r¾d
}	 ddlm} |                     |¦  «        5 }|j        \  }}ddd¦  «         n# 1 swxY w Y   |rDt#          |¦  «        rt#          |¦  «        s&d}|
                     d|j        › d|› d|› d�¦  «         n7# t&          $ r*}|
                     d|j        › d|› �¦  «         Y d}~nd}~ww xY wd|j                             ¦   «         v rd
}||k    r%|
                     d|j        › d|d›d|› d�¦  «         |	                     t)          |j        | 	                    ¦   «         j
        |||j                             ¦   «         ||¬¦  «        ¦  «         �Œ¼|�|t*          j        k    }nt/          |
¦  «        dk    }|rdnd}|p)|sd                     |
¦  «        ndt/          |	¦  «        › d�}|                     d ¬!¦  «        }d"|v r4t5          j        d#d$|› d%�|¦  «        }t5          j        d&d'|› �|¦  «        }n|d(|› d)|› d*�z  }|s9| j        |› d�z  }|                     |d ¬!¦  «         |                     ¦   «          n|                     |d ¬!¦  «         |||	fS )+zÏ
        Stage 1 Gate: QA performs technical verification on submitted assets in assets/pending_review/{request_id}/.
        Checks: file sizes, power-of-two image resolutions, normal map presence.
        rs   r    ú not found in pending_review (r¡   zNo asset files found in FÚ*g      �@)r   r   T)z.pngz.webpz.jpgz.jpegr   )ÚImageNzFile z dimensions (Úxz) are not power of 2.zCould not read image r‹   Únormalz size (z.1fzKB) exceeds limit of zKB.)Úrelative_pathÚfile_size_bytesÚwidthÚheightÚformatr   Úhas_normal_mapÚPASSÚFAILz; zChecked z files, all passed specs.r   r   u   - **Káº¿t Quáº£ Cáº¥p 1**:u,   - \*\*Káº¿t Quáº£ Cáº¥p 1\*\*:\s*`?[^`\n]+`?u   - **Káº¿t Quáº£ Cáº¥p 1**: `r}   u%   - \*\*Ghi ChÃº Ká»¹ Thuáº­t\*\*:\s*.+u   - **Ghi ChÃº Ká»¹ Thuáº­t**: u   
- **Káº¿t Quáº£ Cáº¥p 1**: `u   `
- **Ghi ChÃº Ká»¹ Thuáº­t**: rt   )r,   r¢   r£   r0   ÚanyÚiterdirr”   r“   Úis_fileÚstatÚst_sizeÚsuffixr[   ÚPILr¿   ÚopenÚsizer   rS   r•   r   r
   rÈ   Úlenr~   rR   rV   r¤   r.   r‚   r¥   )r4   rH   r³   r´   r¶   r¸   rº   Úreq_fileÚreq_assets_dirrp   ÚerrorsÚ	has_imageÚ
has_normalÚfÚsize_kbrÄ   rÅ   Úis_potÚis_imgr¿   Úimgrœ   ÚpassedÚverdict_strÚ
audit_noter^   Úrej_files                              r5   Úqa_technical_auditz(DesignPipelineManager.qa_technical_audit  s¢  € ð Ô*°
Ð-?Ð-?Ð-?Ñ?ˆØ�ŠÑ Ô ð 	fÝ#Ð$d¨zÐ$dÐ$dÐYaÐ$dÐ$dÐ$dÑeÔeÐeàÔ,¨zÑ9ˆØ/1ˆØˆà×$Ò$Ñ&Ô&ð 	G­c°.×2HÒ2HÑ2JÔ2JÑ.KÔ.Kð 	GØ�MŠMÐE°^ÐEÐEÑFÔFÐFàˆ	Øˆ
à× Ò Ñ"Ô"ñ %	Ø#×(Ò(¨Ñ-Ô-ð $ñ $�Ø—9’9‘;”;ñ #ØŸfšf™hœhÔ.°Ñ7�GØ$(‘M�E˜6Ø!�FØœXŸ^š^Ñ-Ô-Ð1SÐS�Fàð QØ$(˜	ð	QØ1Ð1Ð1Ð1Ð1Ð1Ø!&§¢¨A¡¤ð 9°#Ø03´¡  vð9ð 9ð 9ñ 9ô 9ð 9ð 9ð 9ð 9ð 9ð 9øøøð 9ð 9ð 9ð 9à3ð vÝ(7¸Ñ(>Ô(>ð !vÅ?ÐSYÑCZÔCZð !vØ-2 FØ$*§M¢MÐ2t¸!¼&Ð2tÐ2tÈuÐ2tÐ2tÐW]Ð2tÐ2tÐ2tÑ$uÔ$uÐ$uøøÝ(ð Qð Qð QØ"ŸMšMÐ*OÀ!Ä&Ð*OÐ*OÈAÐ*OÐ*OÑPÔPÐPÐPÐPÐPÐPÐPøøøøðQøøøð   1¤6§<¢<¡>¤>Ð1Ð1Ø%)˜
àÐ!1Ò1Ð1ØŸšÐ&t¨a¬fÐ&tÐ&t¸WÐ&tÐ&tÐ&tÐ_oÐ&tÐ&tÐ&tÑuÔuÐuà ×'Ò'Ý(Ø*+¬&Ø,-¯FªF©H¬HÔ,<Ø"'Ø#)Ø#$¤8§>¢>Ñ#3Ô#3Ø,2Ø+5ðñ ô ñ
ô 
ð 
ùð Ð'Ø%­Ô)=Ò=ˆFˆFå˜‘[”[ AÒ%ˆFà &Ð2�f�f¨FˆØÐ|¸Ð{˜tŸyšy¨Ñ0Ô0Ð0ÐD{ÍsÐS_ÑO`ÔO`ÐD{ÐD{ÐD{ˆ
ð ×$Ò$¨gÐ$Ñ6Ô6ˆØ'¨7Ð2Ð2Ý”fÐLÐN{ÐmxÐN{ÐN{ÐN{ð  ~Eñ  Fô  FˆGÝ”fÐEÐGsÐgqÐGsÐGsÐu|Ñ}Ô}ˆGˆGàÐs¸ÐsÐsÐeoÐsÐsÐsÑsˆGàð 	;àÔ(¨jÐ+=Ð+=Ð+=Ñ=ˆHØ×Ò °'ÐÑ:Ô:Ð:Ø�OŠOÑÔÐÐà×Ò °'ÐÑ:Ô:Ð:à�z <Ð/Ð/s=   ÄF Ä7EÅF ÅE	ÅF ÅE	ÅA	F Æ 
GÆ* GÇGÚstudio_produceru`   Approved - Tháº©m má»¹ Cá»• VÃµ Háº¯c Ã�m xuáº¥t sáº¯c, chuáº©n phong cÃ¡ch VLTK1 hiá»‡n Ä‘áº¡i.ÚapproverÚverdictr
   Úsync_to_client_subfolderc                ól  — | j         |› d�z  }|                     ¦   «         st          d|› d|› d�¦  «        ‚|                     d¬¦  «        }d|vrt	          d|› d�¦  «        ‚|t
          j        k    rd	nd
}d|v r7t          j        dd|› d�|¦  «        }t          j        dd|› d|› �|¦  «        }n|d|› d|› d|› d�z  }|t
          j        k    �r| j	        |› d�z  }	|	 
                    |d¬¦  «         |                     ¦   «          | j        |z  }
| j        |z  }|                     dd¬¦  «         |
                     ¦   «         r‰|
                     d¦  «        D ]s}|                     ¦   «         r]t#          j        |||j        z  ¦  «         |r>| j        |z  }|                     dd¬¦  «         t#          j        |||j        z  ¦  «         Œt|                      |	¦  «        S | j        |› d�z  }	|	 
                    |d¬¦  «         |                     ¦   «          |                      |	¦  «        S )a  
        Stage 2 Gate: CEO & Art Director perform final aesthetic, lore and IP audit.
        If APPROVED: Moves to approved/ and synchronizes assets to assets/approved/ and client/webapp/assets.
        If REJECTED: Moves to rejected/ with reviewer feedback.
        rs   r    r½   r¡   r   r   u!   - **Káº¿t Quáº£ Cáº¥p 1**: `PASS`z; cannot be reviewed by CEO because Stage 1 QA did not PASS.ÚAPPROVEDÚREJECTEDu   - **Káº¿t Quáº£ Cáº¥p 2**:u,   - \*\*Káº¿t Quáº£ Cáº¥p 2\*\*:\s*`?[^`\n]+`?u   - **Káº¿t Quáº£ Cáº¥p 2**: `r}   u&   - \*\*Ã� Kiáº¿n PhÃª Duyá»‡t\*\*:\s*.+u   - **Ã� Kiáº¿n PhÃª Duyá»‡t**: (z) u   
- **Káº¿t Quáº£ Cáº¥p 2**: `u!   `
- **Ã� Kiáº¿n PhÃª Duyá»‡t**: (rt   Tr9   r¾   )r,   r¢   r£   rR   rT   r
   ÚAPPROVErV   r¤   r-   r‚   r¥   r0   r1   r<   r“   rÌ   ÚshutilÚcopy2rS   r2   rk   r.   )r4   rH   rä   rå   rº   ræ   rÔ   r^   rß   r¨   Ú
src_assetsÚ
dst_assetsrÙ   Ú
client_dirs                 r5   Úceo_aesthetic_auditz)DesignPipelineManager.ceo_aesthetic_audits  sÇ  € ð Ô*°
Ð-?Ð-?Ð-?Ñ?ˆØ�ŠÑ Ô ð 	fÝ#Ð$d¨zÐ$dÐ$dÐYaÐ$dÐ$dÐ$dÑeÔeÐeà×$Ò$¨gÐ$Ñ6Ô6ˆð /°gÐ=Ð=ÝÐo¨
ÐoÐoÐoÑpÔpÐpà$+­Ô/FÒ$FÐ$F�j�jÈJˆà'¨7Ð2Ð2Ý”fÐLÐN{ÐmxÐN{ÐN{ÐN{ð  ~Eñ  Fô  FˆGÝ”fÐFÐH}ÐjrÐH}ÐH}Ðv{ÐH}ÐH}ð  @Gñ  Hô  HˆGˆGàÐ|¸Ð|Ð|ÐgoÐ|Ð|ÐsxÐ|Ð|Ð|Ñ|ˆGà•oÔ-Ò-Ñ-ØÔ(¨jÐ+=Ð+=Ð+=Ñ=ˆHØ×Ò °'ÐÑ:Ô:Ð:Ø�OŠOÑÔÐð Ô,¨zÑ9ˆJØÔ-°
Ñ:ˆJØ×Ò T°DÐÑ9Ô9Ð9à× Ò Ñ"Ô"ð 	AØ#Ÿš¨Ñ-Ô-ð Að A�AØ—y’y‘{”{ð AÝœ Q¨
°Q´VÑ(;Ñ<Ô<Ð<ð 4ð AØ)-Ô)BÐE]Ñ)]˜JØ&×,Ò,°TÀDÐ,ÑIÔIÐIÝ"œL¨¨J¸¼Ñ,?Ñ@Ô@Ð@øà×*Ò*¨8Ñ4Ô4Ð4àÔ(¨jÐ+=Ð+=Ð+=Ñ=ˆHØ×Ò °'ÐÑ:Ô:Ð:Ø�OŠOÑÔÐØ×*Ò*¨8Ñ4Ô4Ð4r7   údict[str, int]c                ó  — t          t          | j                             d¦  «        ¦  «        ¦  «        t          t          | j                             d¦  «        ¦  «        ¦  «        t          t          | j                             d¦  «        ¦  «        ¦  «        t          t          | j                             d¦  «        ¦  «        ¦  «        t          t          | j                             d¦  «        ¦  «        ¦  «        dœS )z0Returns the count of requests across each stage.rŠ   )r   r   r   r   r    )rÓ   Úlistr*   r“   r+   r,   r-   r.   )r4   s    r5   Úget_pipeline_summaryz*DesignPipelineManager.get_pipeline_summary®  sÆ   € õ �˜dœn×1Ò1°&Ñ9Ô9Ñ:Ô:Ñ;Ô;Ý�t DÔ$8×$=Ò$=¸fÑ$EÔ$EÑFÔFÑGÔGÝ!¥$ tÔ'>×'CÒ'CÀFÑ'KÔ'KÑ"LÔ"LÑMÔMÝ�D Ô!2×!7Ò!7¸Ñ!?Ô!?Ñ@Ô@ÑAÔAÝ�D Ô!2×!7Ò!7¸Ñ!?Ô!?Ñ@Ô@ÑAÔAð
ð 
ð 	
r7   c                óì  — |                       ¦   «         }ddt          |                     ¦   «         ¦  «        › d�ddd|d         › d�d	|d
         › d�d|d         › d�d|d         › d�d|d         › d�ddg}d| j        fd| j        fd| j        fd| j        fd| j        fg}|D �]<\  }}|                     d|› dt          t          |                     d¦  «        ¦  «        ¦  «        › d�¦  «         t          |                     d¦  «        ¦  «        }|s|                     d¦  «         Œ‰|D ]›}	 |                      |¦  «        }|                     d|j        › d|j        › d|j        j                             ¦   «         › d|j        › d |j        › d�¦  «         Œn# t(          $ r! |                     d!|j        › d"�¦  «         Y Œ˜w xY w|                     d¦  «         �Œ>d#                     |¦  «        S )$zHGenerates a comprehensive markdown report of the entire design pipeline.z)# FREEEXILE DESIGN PIPELINE STATUS REPORTz.*Generated At: 2026-09-29* | *Total Requests: r¾   rC   u/   ## 1. THá»�NG KÃŠ Tá»”NG QUAN THEO GIAI Ä�Oáº Nu!   - **Inbox (YÃªu cáº§u má»›i)**: `r   r}   u*   - **In Progress (Ä�ang thá»±c hiá»‡n)**: `r   u4   - **Pending Review (Chá»� nghiá»‡m thu 2 cáº¥p)**: `r   u3   - **Approved (Ä�Ã£ nghiá»‡m thu chÃ­nh thá»©c)**: `r   u5   - **Rejected (Tá»« chá»‘i / Cáº§n chá»‰nh sá»­a)**: `r    u4   ## 2. DANH SÃ�CH CHI TIáº¾T THEO Tá»ªNG GIAI Ä�Oáº NÚInboxzIn ProgresszPending ReviewÚApprovedÚRejectedz### z (rŠ   r¡   u6   _KhÃ´ng cÃ³ yÃªu cáº§u nÃ o trong giai Ä‘oáº¡n nÃ y._
z- **`z`**: z | Priority: `z` | Assigned: `z` | Dept: `z- **z**: (Parse error)rt   )rô   ÚsumÚvaluesr*   r+   r,   r-   r.   r”   rÓ   ró   r“   rk   rH   rI   rM   r€   r�   rN   rK   r•   rY   r~   )	r4   ÚsummaryÚlinesÚstagesÚ
stage_nameÚfolderÚfilesrÙ   r›   s	            r5   Úgenerate_status_reportz,DesignPipelineManager.generate_status_report¸  s™  € à×+Ò+Ñ-Ô-ˆà7ØU½SÀÇÂÑAQÔAQÑ=RÔ=RÐUÐUÐUØØ=ØC°¸Ô0@ÐCÐCÐCØR¸ÀÔ9OÐRÐRÐRØ_À7ÐK[ÔC\Ð_Ð_Ð_ØXÀ'È*ÔBUÐXÐXÐXØZÀGÈJÔDWÐZÐZÐZØØBð
ˆð �d”nÐ%Ø˜DÔ0Ð1Ø˜tÔ6Ð7Ø˜Ô*Ð+Ø˜Ô*Ð+ð
ˆð #)ð 	ñ 	ÑˆJ˜Ø�LŠLÐO 
ÐOÐO­cµ$°v·{²{À6Ñ7JÔ7JÑ2KÔ2KÑ.LÔ.LÐOÐOÐOÑPÔPÐPÝ˜Ÿš VÑ,Ô,Ñ-Ô-ˆEØð Ø—’ÐVÑWÔWÐWØàð Cð C�ðCØ×1Ò1°!Ñ4Ô4�CØ—L’Lð\ ¤ð \ð \°S´Yð \ð \ÈcÌlÔN`×NfÒNfÑNhÔNhð \ð \Ø&)Ô&8ð\ð \ØEHÔEXð\ð \ð \ñô ð ð øõ !ð Cð Cð CØ—L’LÐ!A¨¬Ð!AÐ!AÐ!AÑBÔBÐBÐBÐBðCøøøà�LŠL˜ÑÔÐÑà�yŠy˜ÑÔÐs   Ä1A*FÆ(GÇGrŽ   )r   r   r   r   ©r   r   )r?   r   r   r   )rG   )rH   rl   rI   rl   rJ   rl   rK   rl   rL   r   rM   r   rN   rl   rm   rl   rn   ro   rp   rq   rQ   rl   r   r   )r   rˆ   )rH   rl   rN   rž   r   r   )rH   rl   rp   r«   r   r   )r±   r²   TNrC   )rH   rl   r³   rl   r´   rµ   r¶   r·   r¸   r¹   rº   rl   r   r»   )rH   rl   rä   rl   rå   r
   rº   rl   ræ   rž   r   r   )r   rñ   )r   rl   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r6   r3   rk   r‡   r�   rª   r°   râ   r
   rê   rð   rô   r  rv   r7   r5   r   r   '   sD  € € € € € ØJÐJð#ð #ð #ð #ð #ð.1ð 1ð 1ð 1ð;
ð ;
ð ;
ð ;
ðR  ðM4ð M4ð M4ð M4ð M4ð^ð ð ð ð1ð 1ð 1ð 1ð 1ð:1ð 1ð 1ð 1ð0 *Ø $Ø%)Ø37Øð[0ð [0ð [0ð [0ð [0ð@ *Ø#2Ô#:ØwØ/3ð95ð 95ð 95ð 95ð 95ðv
ð 
ð 
ð 
ð+ ð + ð + ð + ð + ð + r7   r   r   r   c                 ó&   — ddl m}   | ¦   «          d S )Nr   )Úmain)Ú(tools.asset_pipeline.design_pipeline_clir  )Úcli_mains    r5   r  r  ê  s#   € ØIÐIÐIÐIÐIÐIØ€H�J„J€J€J€Jr7   Ú__main__r  )#r  Ú
__future__r   ÚjsonÚosÚpathlibr   rV   rë   r—   ÚtimeÚtypingr   ÚhasattrÚstdoutr   r$   r%   r&   Ú
_REPO_ROOTrl   ÚpathÚinsertÚ*tools.asset_pipeline.design_pipeline_typesr
   r   r   r   r   r   r   r   r   r  r  rv   r7   r5   ú<module>r     sÐ  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø Ð Ð Ð Ð Ð Ø 	€	€	€	Ø €€€Ø 
€
€
€
Ø €€€Ø Ð Ð Ð Ð Ð à
€7ˆ3Œ:�}Ñ%Ô%ð -Ø„J×Ò GÐÑ,Ô,Ð,ð ˆT�(‰^Œ^×#Ò#Ñ%Ô%Ô,Ô3Ô:€
Ø€3€z�?„?˜#œ(Ð"Ð"Ø„H‡O‚O�A�s�s˜:‘”Ñ'Ô'Ð'ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð| ð | ð | ð | ð | ñ | ô | ð | ðFð ð ð ð
 ˆzÒÐØ€D�F„F€F€F€Fð Ðr7   