
    2i              	          d Z ddlZej                  j                  d       ddlZddlmZmZ ddlm	Z	 e	 G d d             Z
ded	ed
ee
   fdZded
ee
   fdZedk(  rldZ ed        ed        ed        ede d        ee      Z ed ee       d       eD  cg c]"  } | j&                  j)                         dk(  s!| $ c} ZeD  cg c]"  } | j&                  j)                         dk(  s!| $ c} Z ed        ed ee               ed ee               ed ee       d       i ZeD ]6  Zej2                  evrdeej2                  <   eej2                  xx   dz  cc<   8  ed        eej7                               D ]  \  ZZ ede de d          e         ed!        eedd" d      D ]  \  ZZ ede d#ej>                   dej@                           ed$ej2                           ed%ej&                           ed&ejB                           ed' eejD                         d(        ed)ejF                  d*         e$d+ eD              Z%ere% ee      z  ndZ& edd         ed,        ed        ed-e%d*        ed.e&d/        ed0e%d1z  d2        ed       yyc c} w c c} w )3zK
Test script to verify SWARM_MISSIONS.md parsing without making API calls.
    Nz/mnt/e/genesis-system)ListOptional)	dataclassc                       e Zd ZU dZeed<   eed<   eed<   eed<   eed<   ee   ed<   eed<   eed	<   eed
<   eed<   eed<   y)Storyz2Represents an atomic story from SWARM_MISSIONS.md.story_idtitleroleneedbenefitacceptance_criteriablack_box_testswhite_box_testsestimated_tokensmodelprd_nameN)__name__
__module____qualname____doc__str__annotations__r   int     2/mnt/e/genesis-system/scripts/test_swarm_parser.pyr   r      sD    <MJ
I
ILc"JMr   r   
story_textr   returnc                 |   	 t        j                  d|       }|sy|j                  d      }|j                  d      j                         }t        j                  d|       }t        j                  d|       }t        j                  d|       }|r|r|sy|j                  d      j                         }|j                  d      j                         }	|j                  d      j                         }
t        j                  d| t         j                        }g }|rk|j                  d      }|j                  d	      D ]F  }|j                         }|j                  d
      s%|j                  |dd j                                H t        j                  d| t         j                        }t        j                  d| t         j                        }|r|j                  d      j                         nd}|r|j                  d      j                         nd}t        j                  d|       }|r*t        |j                  d      j                  dd            nd}t        j                  d|       }|r|j                  d      nd}t        ||||	|
||||||      S # t        $ r}t        d|        Y d}~yd}~ww xY w)zParse a single story from text.z####\s+([\w-]+):\s+(.+)N      z\*\*As a\*\*\s+(.+?),z)\*\*I need\*\*\s+(.+?),\s+\*\*so that\*\*z\*\*so that\*\*\s+(.+?)\.z;\*\*Acceptance Criteria\*\*:\n(.*?)\*\*Black Box Tests\*\*:
-z:\*\*Black Box Tests\*\*:\s+(.+?)\n\*\*White Box Tests\*\*:z;\*\*White Box Tests\*\*:\s+(.+?)\n\*\*Estimated Tokens\*\*: z$\*\*Estimated Tokens\*\*:\s+([\d,]+),i  z\*\*Model\*\*:\s+(\w+)Kimi)r   r	   r
   r   r   r   r   r   r   r   r   z WARNING: Failed to parse story: )researchgroupstripDOTALLsplit
startswithappendr   replacer   	Exceptionprint)r   r   title_matchr   r	   
role_match
need_matchbenefit_matchr
   r   r   criteria_matchr   criteria_textlineblack_box_matchwhite_box_matchr   r   tokens_matchr   model_matchr   es                           r   parse_single_storyr>      s~   ?ii :JG$$Q'!!!$**, YY7D
YYKZX
		">
Kzm"((*"((*%%a(..0 #acmoqoxoxy *003M%++D1 Azz|??3''..tABx~~/?@A ))$acmoqoxoxy))$bdnprpypyz>M///288:SU>M///288:SU yy!H*UJV3|11!4<<S"EF\` ii 9:F(3!!!$ 3++-
 	
  045s+   J A8J CJ !D8J 	J;#J66J;	file_pathc                    g }t        | dd      5 }|j                         }ddd       t        j                  dt        j                        }d}j                  d      }g }d}t        |      D ]	  \  }	}
|j                  |
      }|r|j                  d	      }|
j                  d
      r:|r2|r0dj                  |      }t        ||      }|r|j                  |       |
g}d}v|sy|j                  |
       |
j                         j                  d      s|	dkD  s||	d	z
     j                         j                  d      sdj                  |      }t        ||      }|r|j                  |       g }d} |r2|r0dj                  |      }t        ||      }|r|j                  |       |S # 1 sw Y   xY w)z7Parse SWARM_MISSIONS.md and extract all atomic stories.rzutf-8)encodingNz^# PRD \d+:\s+([^\(]+)zUnknown PRDr"   Fr    z####Tz---r   z
**Model**:)openreadr'   compile	MULTILINEr,   	enumeratematchr)   r-   joinr>   r.   r*   )r?   storiesfcontentprd_patterncurrent_prdlinescurrent_story_textin_storyir8   	prd_matchr   parsed_storys                 r   parse_missions_filerU   b   s   G	iw	/ 1&&(
 **6EK  KMM$EHU# !4%%d+	#//!,K ??6".!YY'9:
1*kJNN<0 #'H%%d+ zz|&&u-!a%E!A#J<L<L<N<Y<YZf<g!YY'9:
1*kJNN<0%'" 9!> &YY12
)*kBNN<(Ne s   F33F=__main__z,/mnt/e/genesis-system/hive/SWARM_MISSIONS.mdzP================================================================================zSWARM MISSIONS PARSER TESTz	Parsing: r"   u   ✅ Successfully parsed z	 stories
kimiminimaxzModel breakdown:z  Kimi: z  MiniMax: z	  Total: r    zPRD breakdown:z  z: z storieszFirst 5 stories:   z. z   PRD: z
   Model: z	   Role: z   Acceptance Criteria: z itemsz   Estimated Tokens: r%   c              #   4   K   | ]  }|j                     y w)N)r   ).0ss     r   	<genexpr>r]      s     ;aq));s   zTOKEN ESTIMATESzTotal estimated tokens: zAverage per story: z,.0fzEstimated cost @ $1/MTok: $i@B z.2f)'r   syspathr.   r'   typingr   r   dataclassesr   r   r   r>   rU   r   missions_filer1   rJ   lenr   lowerkimi_storiesminimax_storiesprd_breakdownstoryr   sorteditemscountrG   rR   r   r	   r
   r   r   sumtotal_tokens
avg_tokens)r\   s   0r   <module>ro      sD    ' ( 
 ! !
  A3 A# A(5/ AH63 64; 6r zBM	(O	
&'	(O	Im_B
'(!-0G	$S\N*
=>  'D!!''--/V*CADL")JQQWW]]_	-IqJO		HS&'
()	KO,-
./	Ic'l^2
&' M +>>.,-M%..)enn%*%+
 

!-"5"5"78 0%8*BugX./0	G 

gbqk1- B51#R'r%++78()*
5;;-()	%**&'(U-F-F)G(HOP%e&<&<Q%?@AB ;7;;L07G,QJ	Bxj/	
	(O	$\!$4
56	
40
12	'y(@'E
FG	(Ok  EJs   %"KK"K6K