ó
    ùÚ jh  ã                  ó†   • S r SSKJr  SSKJrJr  SSKJr  SSKJ	r	  SSK
JrJr  SSKJr  SSKJrJr   " S	 S
5      rSS jrg)zRequirement Analyst skill.é    )Úannotations)ÚListÚOptional)ÚRequirementsArtifact)Ú	JiraIssue)Ú	LLMClientÚget_llm_client©Úsanitize_text)ÚKnowledgeHitÚKnowledgeServicec                  ó:   • \ rS rSr  S     SS jjrSS jrSrg)	ÚRequirementAnalysté   Nc                ód   • U=(       d
    [        5       U l        U=(       d
    [        5       U l        g )N)r	   Úllmr   Ú	knowledge)Úselfr   r   s      Ú;/var/www/html/gaurav/packages/agents/requirement_analyst.pyÚ__init__ÚRequirementAnalyst.__init__   s#   € ð
 ×*œ.Ó*ˆŒØ"×8Ô&6Ó&8ˆ�ó    c              ƒ  óP  #   • UR                    SUR                   3nU R                  R                  USS9I S h  v•N n[	        X5      nU R
                  R                  U5      I S h  v•N nUR                  Ul        UR                   (       d  UR                   Ul         UR                  (       dn  [        UR                  5      S:¼  aU  UR                  =(       d    SS:¼  a<  UR                  (       a+  SUl	        / Ul        UR                  =(       d    SS	-   Ul        U$  Næ Nº7f)
NÚ é   )Úlimité   r   gffffffæ?TÚ z9 | Auto-cleared after human comments (non-blocking gaps).)ÚsummaryÚdescriptionr   ÚgatherÚbuild_analyst_promptr   Úanalyze_requirementsÚkeyÚjira_keyÚis_clearÚlenÚacceptance_criteriaÚ
confidenceÚcommentsÚclarification_questionsÚnotes)r   ÚissueÚqueryÚhitsÚpromptÚartifacts         r   ÚanalyzeÚRequirementAnalyst.analyze   sé   é € Ø—=‘=�/  5×#4Ñ#4Ð"5Ð6ˆØ—^‘^×*Ñ*¨5¸Ð*Ð:×:ˆÜ% eÓ2ˆØŸ™×6Ñ6°vÓ>×>ˆà!ŸI™IˆÔØ××Ø$Ÿ}™}ˆHÔð ×!×!Ü�H×0Ñ0Ó1°QÓ6Ø×$Ñ$×)¨¨cÓ1Ø——à $ˆHÔØ/1ˆHÔ,Ø&Ÿn™n×2°Ð6qÑqˆHŒNØˆñ# ;á>ùs"   ‚9D&»D"¼-D&Á)D$Á*B9D&Ä$D&)r   r   )NN)r   zOptional[LLMClient]r   zOptional[KnowledgeService]ÚreturnÚNone)r-   r   r4   r   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   r2   Ú__static_attributes__© r   r   r   r      s0   † ð $(Ø04ð9à ð9ð .ð9ð 
õ	9÷r   r   c                óÔ  • U R                   =(       d    / nSR                  S U R                  SS   5       5      nSR                  S U R                   5       5      =(       d    SnU Vs/ sH  oUR                  S:X  d  M  UPM     nnU Vs/ sH  oUR                  S:X  d  M  UPM     nnSS	 jnS
U R
                   S[        U R                  5       SU R                   SSR                  U R                  5       S[        U R                  5       SU(       a!  [        S5      R                  S U 5       5      OS SU=(       d    S SU SU" U5       SU" U5       S3$ s  snf s  snf )NÚ
c              3  ó¢   #   • U HF  nS UR                  S5       S[        [        UR                  S5      =(       d    S5      5       3v •  MH     g7f)ú- Úauthorú: Úbodyr   N)Úgetr   Ústr)Ú.0Úcs     r   Ú	<genexpr>Ú'build_analyst_prompt.<locals>.<genexpr>/   sB   é € ð ÙSgÈaˆ"ˆQ�U‰U�8‹_Ð˜R¤¬c°!·%±%¸³-×2EÀ2Ó.FÓ GÐHÕIÒSgùs   ‚AAiöÿÿÿz, c              3  ó‚   #   • U H6  oR                  S 5      =(       d    UR                  S5      =(       d    Sv •  M8     g7f)ÚfilenameÚidÚ?N)rC   ©rE   Úas     r   rG   rH   2   s.   é € Ð_ÑM^ÈŸE™E *Ó-×C°·±°t³×CÀÔCÒM^ùs   ‚=?ú(none)Ú
confluenceÚgitc                óB   • U (       d  gSR                  S U  5       5      $ )NrO   r=   c              3  óX   #   • U H!  nS UR                    SUR                   3v •  M#     g7f)r?   rA   N)ÚtitleÚsnippet)rE   Úhs     r   rG   Ú4build_analyst_prompt.<locals>.fmt.<locals>.<genexpr>9   s%   é € ÐA¹b¸˜2˜aŸg™g˜Y b¨¯©¨Õ4ºbùs   ‚(*)Újoin)Úhss    r   ÚfmtÚ!build_analyst_prompt.<locals>.fmt6   s   € ÞØØ�y‰yÑA¹bÓAÓAÐAr   uÛ  You are the Requirement Analyst for Agent Nova (Salesforce development automation).
Decide if the Jira requirement is clear enough to implement allowlisted Salesforce metadata.

Clarity rules (follow strictly):
- Set is_clear=true when the story identifies the target object, what metadata to create/change, and the expected behavior â€” OR has explicit acceptance criteria covering those.
- Prefer reasonable defaults over questions for minor scope details (which layouts, record types, profiles, naming style, docs/training).
- Only set is_clear=false for true blockers: missing object, no concrete change, no behavior/AC, or conflicting requirements.
- If Comments contain human answers, treat them as locked decisions. Do not re-ask the same or equivalent questions; set is_clear=true unless a real blocker remains.
- Never invent acceptance criteria that are not present or clearly stated in comments.
- When is_clear=true, clarification_questions MUST be an empty list.

Jira key: z

Summary: z	
Status: z	
Labels: z

Description:
z

Acceptance criteria:
é
   c              3  ó<   #   • U H  nS [        U5      -   v •  M     g7f)r?   Nr
   rM   s     r   rG   rH   O   s   é € Ð2©r¨!ˆd”] 1Ó%Ö%ªrùs   ‚u7   (none provided â€” extract from Description if present)z

Comments:
z

Attachments: z

Confluence hits:
z

Repository hits:
zÊ

v1 allowlist: custom fields, validation rules, record-triggered Flows, Apex classes/triggers, LWCs, permission sets.
Out of scope: production deploy, merge, sharing/OWD redesign, destructive deletes.
)rY   úList[KnowledgeHit]r4   rD   )r(   rX   r*   ÚattachmentsÚsourcer$   r   r   ÚstatusÚlabelsr    Úchr)	r-   r/   Úacr*   r_   rV   Ú	conf_hitsÚ	repo_hitsrZ   s	            r   r"   r"   -   s{  € Ø	×	"Ñ	"×	( b€BØ�y‰yñ ØSX×SaÑSaÐbeÐbfÑSgóó €Hð —)‘)Ñ_ÈU×M^ÒM^Ó_Ó_×kÐck€KÙ Ó=™D�q§H¡H°Ñ$<—™D€IÐ=Ù Ó6™D�q§H¡H°Ñ$5—™D€IÐ6ôBð
ð �9‰9ˆ+ð 
Ü
˜Ÿ™Ó
&Ð	'ð (	Ø	�‰ˆð 	Ø	�‰�5—<‘<Ó	 Ð!ð "ô ˆu× Ñ Ó!Ð "ð #ö 79„€Rƒ‡�Ñ2©rÓ2Ô2Ð>wÐ xð yð 
×ˆXÐ ð àˆ]ð ñ €YƒÐ ð ñ €YƒÐ ð ð?#ð #ùò >ùÚ6s   Á*E Â E ÂE%Â"E%N)r-   r   r/   r^   r4   rD   )Ú__doc__Ú
__future__r   Útypingr   r   Úpackages.artifacts.requirementsr   Úpackages.integrations.jirar   Úpackages.integrations.llmr   r	   Úpackages.integrations.sanitizer   Úpackages.knowledge.retrieversr   r   r   r"   r;   r   r   Ú<module>ro      s,   ðÙ  å "ç !å @Ý 0ß ?Ý 8ß H÷ñ õ>1r   