§
    øžyjª+  ã                  ó@  — d Z ddlmZ ddlZddlZddlZddlmZ d!d	„Z	d"d„Z
d#d„Zd„ Zd$d„Zd"d„Zd"d„Zed%d„¦   «         Zed%d„¦   «         Zed%d„¦   «         Zed%d„¦   «         Zed%d„¦   «         Zd"d„Zed%d„¦   «         Zed%d„¦   «         Zed%d„¦   «         Zd&d „ZdS )'u  ``hermes project`` CLI â€” manage first-class, multi-folder Projects.

A Project is a human-named workspace spanning one or more folders, with one
designated primary repo. Projects anchor desktop session grouping and (when
bound to a kanban board) give kanban tasks a deterministic worktree + branch
convention. State lives in the per-profile ``$HERMES_HOME/projects.db`` store
(see :mod:`hermes_cli.projects_db`).

This is a footprint-ladder rung-2 capability: a CLI command + gateway RPC,
with zero model-tool schema cost.
é    )ÚannotationsN)Úprojects_dbÚparent_subparsersúargparse._SubParsersActionÚreturnúargparse.ArgumentParserc                óT  — |                       ddd¬¦  «        }|                     d¬¦  «        }|                      dd¬	¦  «        }|                     d
d¬	¦  «         |                     ddd¬¦  «         |                     ddd¬¦  «         |                     dddd¬¦  «         |                     dd¬¦  «         |                     dd¬¦  «         |                     dd¬¦  «         |                     dddd¬¦  «         |                     dd d!¬"¦  «         |                      d#d$gd%¬&¦  «        }|                     d'd d(d)¬*¦  «         |                      d+d,¬	¦  «        }|                     dd-¬	¦  «         |                      d.d/¬	¦  «        }|                     dd-¬	¦  «         |                     d0d1¬	¦  «         |                     d2d¬¦  «         |                     dd d3¬"¦  «         |                      d4d5¬	¦  «        }|                     dd-¬	¦  «         |                     d0d1¬	¦  «         |                      d6d7¬	¦  «        }|                     dd-¬	¦  «         |                     d
d8¬	¦  «         |                      d9d:¬	¦  «        }	|	                     dd-¬	¦  «         |	                     d0d;¬	¦  «         |                      d<d=¬	¦  «        }
|
                     dd>dd?¬@¦  «         |                      dAdB¬	¦  «        }|                     dd-¬	¦  «         |                      dCdD¬	¦  «        }|                     dd-¬	¦  «         |                      dEdF¬	¦  «        }|                     dd-¬	¦  «         |                     dGd>dHdI¬@¦  «         |                     |¬J¦  «         |S )Kz?Attach the ``project`` subcommand tree. Returns the top parser.Úprojectz0Manage projects (named, multi-folder workspaces)zâProjects are human-named workspaces that can span multiple folders / repos. They anchor desktop session grouping and, when bound to a kanban board, give tasks a deterministic worktree + branch convention. State is per-profile.)ÚhelpÚdescriptionÚproject_action)ÚdestÚcreatezCreate a new project)r   ÚnamezHuman name, e.g. 'Hermes Agent'ÚfoldersÚ*z)Folder paths to include (first = primary))Únargsr   z--slugNzExplicit slug override)Údefaultr   z	--primaryÚPATHzPrimary repo path)r   Úmetavarr   z--description)r   z--iconz--colorz--boardÚSLUGzBind a kanban boardz--useÚ
store_truezSet as the active project)Úactionr   ÚlistÚlszList projects)Úaliasesr   z--allÚinclude_archivedzInclude archived projects)r   r   r   ÚshowzShow a project's detailszProject id or slugú
add-folderzAdd a folder to a projectÚpathzFolder pathz--labelzMark as primary repoúremove-folderzRemove a folder from a projectÚrenamezRename a projectzNew nameúset-primaryzSet the primary folderz(Folder path (must already be in project)ÚusezSet the active projectú?z"Project id or slug (omit to clear))r   r   r   ÚarchivezArchive a projectÚrestorezRestore an archived projectú
bind-boardz Bind a kanban board to a projectÚboardÚ zBoard slug (omit to unbind))Ú_project_parser)Ú
add_parserÚadd_subparsersÚadd_argumentÚset_defaults)r   ÚparserÚsubÚp_createÚp_listÚp_showÚp_addÚp_rmÚp_renameÚ	p_primaryÚp_useÚ	p_archiveÚ	p_restoreÚp_binds                 ú=/home/ragecks/.hermes/hermes-agent/hermes_cli/projects_cmd.pyÚbuild_parserr>      se  € ð ×)Ò)ØØ?ð7ð	 *ñ 	ô 	€Fð ×
Ò
Ð%5Ð
Ñ
6Ô
6€Cà�~Š~˜hÐ-Cˆ~ÑDÔD€HØ×Ò˜&Ð'HÐÑIÔIÐIØ×ÒØ˜Ð#Nð ñ ô ð ð ×Ò˜(¨DÐ7OÐÑPÔPÐPØ×ÒØ˜T¨6Ð8Kð ñ ô ð ð ×Ò˜/°4ÐÑ8Ô8Ð8Ø×Ò˜(¨DÐÑ1Ô1Ð1Ø×Ò˜)¨TÐÑ2Ô2Ð2Ø×ÒØ˜4¨Ð6Kð ñ ô ð ð ×ÒØ˜Ð+Fð ñ ô ð ð �^Š^˜F¨T¨F¸ˆ^ÑIÔI€FØ
×ÒØ˜Ð+=Ø(ð ñ ô ð ð
 �^Š^˜FÐ)Cˆ^ÑDÔD€FØ
×Ò˜	Ð(<ÐÑ=Ô=Ð=à�NŠN˜<Ð.IˆNÑJÔJ€EØ	×Ò�yÐ';ÐÑ<Ô<Ð<Ø	×Ò�v MÐÑ2Ô2Ð2Ø	×Ò�y¨$ÐÑ/Ô/Ð/Ø	×ÒØ˜LÐ/Eð ñ ô ð ð �>Š>˜/Ð0Pˆ>ÑQÔQ€DØ×Ò�iÐ&:ÐÑ;Ô;Ð;Ø×Ò�f =ÐÑ1Ô1Ð1à�~Š~˜hÐ-?ˆ~Ñ@Ô@€HØ×Ò˜)Ð*>ÐÑ?Ô?Ð?Ø×Ò˜& zÐÑ2Ô2Ð2à—’˜}Ð3K�ÑLÔL€IØ×Ò˜9Ð+?ÐÑ@Ô@Ð@Ø×Ò˜6Ð(RÐÑSÔSÐSà�NŠN˜5Ð'?ˆNÑ@Ô@€EØ	×ÒØ˜ dØ1ð ñ ô ð ð
 —’˜yÐ/B�ÑCÔC€IØ×Ò˜9Ð+?ÐÑ@Ô@Ð@à—’˜yÐ/L�ÑMÔM€IØ×Ò˜9Ð+?ÐÑ@Ô@Ð@à�^Š^˜LÐ/Qˆ^ÑRÔR€FØ
×Ò˜	Ð(<ÐÑ=Ô=Ð=Ø
×ÒØ�s BÐ-Jð ñ ô ð ð ×Ò¨ÐÑ/Ô/Ð/Ø€Mó    Úargsúargparse.NamespaceÚintc                óÌ  — t          | dd¦  «        }|sEt          | dd¦  «        }|�|                     ¦   «          nt          dt          j        ¬¦  «         dS t
          t          t          t          t          t          t          t          t          t          t          t          dœ}|                     |¦  «        }|€ t          d|› �t          j        ¬¦  «         d	S  || ¦  «        S )
u:   Entry point from ``hermes project â€¦`` argparse dispatch.r   Nr+   zWusage: hermes project <action> [options]
Run 'hermes project --help' for the full list.©Úfiler   )r   r   r   r   r   r!   r"   r#   r$   r&   r'   r(   zUnknown project action: é   )ÚgetattrÚ
print_helpÚprintÚsysÚstderrÚ_cmd_createÚ	_cmd_listÚ	_cmd_showÚ_cmd_add_folderÚ_cmd_remove_folderÚ_cmd_renameÚ_cmd_set_primaryÚ_cmd_useÚ_cmd_archiveÚ_cmd_restoreÚ_cmd_bind_boardÚget)r@   r   r0   ÚhandlersÚhandlers        r=   Úprojects_commandrZ   l   sí   € å�TÐ+¨TÑ2Ô2€FØð 
Ý˜Ð0°$Ñ7Ô7ˆØÐØ×ÒÑÔÐÐåðAå”Zðñ ô ð ð
 ˆqõ ÝÝÝÝ%Ý+ÝÝ'ÝÝÝÝ%ðð €Hð �lŠl˜6Ñ"Ô"€GØ€ÝÐ1¨Ð1Ð1½¼
ÐCÑCÔCÐCØˆqØˆ7�4‰=Œ=Ðr?   ÚidentÚstrc                óp   — t          j        | |¦  «        }|€t          d|› �t          j        ¬¦  «         |S )Nzproject: no such project: rD   )ÚpdbÚget_projectrI   rJ   rK   )Úconnr[   Úprojs      r=   Ú_resolverb   �   s;   € ÝŒ?˜4 Ñ'Ô'€DØ€|ÝÐ2¨5Ð2Ð2½¼ÐDÑDÔDÐDØ€Kr?   c                óH   ‡ — t          j        ‰ ¦  «        dˆ fd„¦   «         }|S )zÈOpen the DB, resolve ``args.project``, and run ``fn(args, conn, proj)``.

    Collapses the connect / resolve / not-found(1) / bad-arg(2) boilerplate every
    project-scoped subcommand repeated.
    r@   rA   r   rB   c                óF  •— t          j        ¦   «         5 }t          || j        ¦  «        }|€	 d d d ¦  «         dS 	  ‰| ||¦  «        cd d d ¦  «         S # t          $ r4}t          d|› �t          j        ¬¦  «         Y d }~d d d ¦  «         dS d }~ww xY w# 1 swxY w Y   d S )NrF   ú	project: rD   é   )r^   Úconnect_closingrb   r
   Ú
ValueErrorrI   rJ   rK   )r@   r`   ra   ÚexcÚfns       €r=   Úwrapperz_with_project.<locals>.wrapperž   s:  ø€ åÔ Ñ"Ô"ð 	 dÝ˜D $¤,Ñ/Ô/ˆDØˆ|Øð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ðØ�r˜$  dÑ+Ô+ð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	øõ ð ð ð ÝÐ' #Ð'Ð'­c¬jÐ9Ñ9Ô9Ð9Ø�q�q�qð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	øøøøðøøøð	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s4   •B¼AÁ
BÁBÁ=BÂBÂBÂBÂB©r@   rA   r   rB   )Ú	functoolsÚwraps)rj   rk   s   ` r=   Ú_with_projectro   —   s?   ø€ õ „_�RÑÔð	ð 	ð 	ð 	ð 	ñ Ôð	ð €Nr?   ÚNonec                óú  — | j         rdnd}t          | j        › d| j        › d|› �¦  «         t          d| j        › �¦  «         | j        rt          d| j        › �¦  «         | j        rt          d| j        › �¦  «         | j        rt          d| j        › �¦  «         | j        rTt          d	¦  «         | j        D ]?}|j	        rd
nd}|j
        rd|j
        › d�nd}t          d|› d|j        › |› �¦  «         Œ>d S d S )Nú (archived)r*   ú  [Ú]z  name:    z  about:   z  board:   z  primary: z
  folders:z *z  ú (ú)z   Ú )ÚarchivedrI   ÚslugÚidr   r   Ú
board_slugÚprimary_pathr   Ú
is_primaryÚlabelr    )ra   ÚflagsÚfÚmarkr~   s        r=   Ú_print_projectr‚   ­   sP  € Ø!œ]Ð2ˆMˆM°€EÝ	ˆTŒYÐ
,Ð
,˜4œ7Ð
,Ð
, UÐ
,Ð
,Ñ-Ô-Ð-Ý	Ð
#˜œ	Ð
#Ð
#Ñ$Ô$Ð$ØÔð 0ÝÐ.˜DÔ,Ð.Ð.Ñ/Ô/Ð/Ø„ð /ÝÐ-˜DœOÐ-Ð-Ñ.Ô.Ð.ØÔð 1ÝÐ/˜DÔ-Ð/Ð/Ñ0Ô0Ð0Ø„|ð 0ÝˆlÑÔÐØ”ð 	0ð 	0ˆAØœ<Ð1�4�4¨TˆDØ'(¤wÐ6�O˜œ�O�O�O�O°BˆEÝÐ.˜Ð.Ð.˜qœvÐ. uÐ.Ð.Ñ/Ô/Ð/Ð/ð0ð 0ð	0ð 	0r?   c                óJ  — 	 t          j        ¦   «         5 }t          j        || j        | j        | j        | j        | j        | j        | j	        | j
        ¬¦	  «	        }| j        rt          j        ||¦  «         t          j        ||¦  «        }d d d ¦  «         n# 1 swxY w Y   n6# t          $ r)}t          d|› �t           j        ¬¦  «         Y d }~dS d }~ww xY w|€t          dt           j        ¬¦  «         dS t          d|j        › d|› d�¦  «         t%          |¦  «         d	S )
N)r   ry   r   r|   r   ÚiconÚcolorr{   re   rD   rf   zproject: vanished after createzCreated project ru   rv   r   )r^   rg   Úcreate_projectr   ry   r   Úprimaryr   r„   r…   r)   r$   Ú
set_activer_   rh   rI   rJ   rK   r‚   )r@   r`   Úpidra   ri   s        r=   rL   rL   ¿   s€  € ðÝÔ Ñ"Ô"ð 	. dÝÔ$ØØ”YØ”YØœØ!œ\Ø Ô,Ø”YØ”jØœ:ð
ñ 
ô 
ˆCð Œxð *Ý”˜t SÑ)Ô)Ð)Ý”? 4¨Ñ-Ô-ˆDð	.ð 	.ð 	.ñ 	.ô 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.øøøð 	.ð 	.ð 	.ð 	.øøõ ð ð ð ÝÐ˜#ÐÐ¥c¤jÐ1Ñ1Ô1Ð1Øˆqˆqˆqˆqˆqøøøøðøøøð €|ÝÐ.µS´ZÐ@Ñ@Ô@Ð@ØˆqÝ	Ð
0˜TœYÐ
0Ð
0¨#Ð
0Ð
0Ð
0Ñ1Ô1Ð1Ý�4ÑÔÐØˆ1s;   ‚B$ •A7BÂB$ ÂBÂB$ ÂBÂ B$ Â$
CÂ.CÃCc                óª  — t          j        ¦   «         5 }t          j        |¦  «        }t          j        |t	          | dd¦  «        ¬¦  «        }d d d ¦  «         n# 1 swxY w Y   |st          d¦  «         dS |D ]X}|j        |k    rdnd}|j        rdnd	}t          |j	        ¦  «        }t          |› d|j
        d
›d|j        › |› d|› d�	¦  «         ŒYdS )Nr   F)r   z@No projects yet. Create one with `hermes project create <name>`.r   r   rw   rr   r*   z<24rs   z folder(s)])r^   rg   Úget_active_idÚlist_projectsrG   rI   rz   rx   Úlenr   ry   r   )r@   r`   ÚactiveÚprojsÚpÚmarkerr   Únfolderss           r=   rM   rM   Û   s>  € Ý	Ô	Ñ	Ô	ð 
 $ÝÔ" 4Ñ(Ô(ˆÝÔ!Ø¥7¨4Ð1CÀUÑ#KÔ#Kð
ñ 
ô 
ˆð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð
 ð ÝÐPÑQÔQÐQØˆqØð Pð PˆØœ š˜��¨CˆØ!"¤Ð3��°ˆÝ�q”y‘>”>ˆÝ�ÐNÐN˜!œ&ÐNÐNÐN q¤vÐN¨uÐNÐN¸ÐNÐNÐNÑOÔOÐOÐOØˆ1s   ”:AÁAÁ!Ac                ó$   — t          |¦  «         dS )Nr   )r‚   ©r@   r`   ra   s      r=   rN   rN   ì   s   € å�4ÑÔÐØˆ1r?   c                ó”   — t          j        ||j        | j        | j        | j        ¬¦  «        }t          d|› d|j        › �¦  «         dS )N)r~   r}   zAdded z to r   )r^   Ú
add_folderrz   r    r~   r‡   rI   ry   )r@   r`   ra   r    s       r=   rO   rO   ò   sL   € åŒ>˜$ ¤¨¬¸$¼*ÐQUÔQ]Ð^Ñ^Ô^€DÝ	Ð
(�4Ð
(Ð
(˜TœYÐ
(Ð
(Ñ)Ô)Ð)Øˆ1r?   c                óÎ   — t          j        ||j        | j        ¦  «        s%t	          d| j        › �t
          j        ¬¦  «         dS t	          d| j        › d|j        › �¦  «         dS )Nz project: folder not in project: rD   rF   zRemoved z from r   )r^   Úremove_folderrz   r    rI   rJ   rK   ry   r”   s      r=   rP   rP   ù   sj   € åÔ˜T 4¤7¨D¬IÑ6Ô6ð ÝÐ<°´Ð<Ð<Å3Ä:ÐNÑNÔNÐNØˆqÝ	Ð
1�T”YÐ
1Ð
1 d¤iÐ
1Ð
1Ñ2Ô2Ð2Øˆ1r?   c                ó†   — t          j        ||j        | j        ¬¦  «         t	          d|j        › d| j        › �¦  «         dS )N)r   zRenamed ú -> r   )r^   Úupdate_projectrz   r   rI   ry   r”   s      r=   rQ   rQ     sF   € åÔ�t˜TœW¨4¬9Ð5Ñ5Ô5Ð5Ý	Ð
/�T”YÐ
/Ð
/ D¤IÐ
/Ð
/Ñ0Ô0Ð0Øˆ1r?   c                óà   — t          j        ||j        | j        ¦  «        s.t	          d| j        › d|j        › d�t          j        ¬¦  «         dS t	          d|j        › d| j        › �¦  «         dS )	Nz
project: 'z' is not a folder of z0; add it first with `hermes project add-folder`.rD   rF   zSet primary of rš   r   )r^   Úset_primaryrz   r    rI   ry   rJ   rK   r”   s      r=   rR   rR   	  s�   € åŒ?˜4 ¤¨$¬)Ñ4Ô4ð Ýð>˜œð >ð >¸¼ð >ð >ð >å”ð	
ñ 	
ô 	
ð 	
ð
 ˆqÝ	Ð
6˜DœIÐ
6Ð
6¨4¬9Ð
6Ð
6Ñ7Ô7Ð7Øˆ1r?   c                óz  — t          j        ¦   «         5 }| j        s2t          j        |d ¦  «         t	          d¦  «         	 d d d ¦  «         dS t          || j        ¦  «        }|€	 d d d ¦  «         dS t          j        ||j        ¦  «         d d d ¦  «         n# 1 swxY w Y   t	          d|j        › �¦  «         dS )NzCleared active projectr   rF   zActive project: )r^   rg   r
   rˆ   rI   rb   rz   ry   r”   s      r=   rS   rS     s2  € Ý	Ô	Ñ	Ô	ð & $ØŒ|ð 	ÝŒN˜4 Ñ&Ô&Ð&ÝÐ*Ñ+Ô+Ð+Øð	&ð &ð &ñ &ô &ð &ð &ð &õ
 ˜˜dœlÑ+Ô+ˆØˆ<Øð&ð &ð &ñ &ô &ð &ð &ð &õ 	Œ�t˜TœWÑ%Ô%Ð%ð&ð &ð &ñ &ô &ð &ð &ð &ð &ð &ð &øøøð &ð &ð &ð &õ 
Ð
(˜TœYÐ
(Ð
(Ñ)Ô)Ð)Øˆ1s   ”-BÁBÁ3BÂBÂ Bc                óh   — t          j        ||j        ¦  «         t          d|j        › �¦  «         dS )Nz	Archived r   )r^   Úarchive_projectrz   rI   ry   r”   s      r=   rT   rT   $  ó5   € åÔ˜˜dœgÑ&Ô&Ð&Ý	Ð
!�d”iÐ
!Ð
!Ñ"Ô"Ð"Øˆ1r?   c                óh   — t          j        ||j        ¦  «         t          d|j        › �¦  «         dS )Nz	Restored r   )r^   Úrestore_projectrz   rI   ry   r”   s      r=   rU   rU   +  r¡   r?   c                ó  — t          j        ||j        | j        ¬¦  «         | j                             ¦   «         r5t          d|j        › d| j        › �¦  «         t          || j        ¦  «         nt          d|j        › �¦  «         dS )N)r{   zBound z
 -> board zUnbound board from r   )r^   r›   rz   r)   ÚstriprI   ry   Ú_sync_board_default_workdirr”   s      r=   rV   rV   2  sŠ   € åÔ�t˜TœW°´Ð<Ñ<Ô<Ð<Ø„z×ÒÑÔð 1ÝÐ8�t”yÐ8Ð8¨D¬JÐ8Ð8Ñ9Ô9Ð9Ý# D¨$¬*Ñ5Ô5Ð5Ð5åÐ/ D¤IÐ/Ð/Ñ0Ô0Ð0Øˆ1r?   r{   c                óö   — | j         sdS 	 ddlm} |                     |¦  «        }|sdS ||j        k    r|                     |¦  «        sdS |                     || j         ¬¦  «         dS # t          $ r Y dS w xY w)uÙ   Best-effort: point the bound board's default_workdir at the primary repo.

    Keeps kanban task worktrees anchored to the project's repo. Failures here
    are non-fatal â€” the binding itself already succeeded.
    Nr   )Ú	kanban_db)Údefault_workdir)r|   Ú
hermes_clir¨   Ú_normalize_board_slugÚDEFAULT_BOARDÚboard_existsÚwrite_board_metadataÚ	Exception)ra   r{   Úkbry   s       r=   r¦   r¦   =  s³   € ð Ôð Øˆð
Ø.Ð.Ð.Ð.Ð.Ð.à×'Ò'¨
Ñ3Ô3ˆØð 	ØˆFØ�2Ô#Ò#Ð#¨B¯OªO¸DÑ,AÔ,AÐ#ØˆFØ
×Ò °dÔ6GÐÑHÔHÐHÐHÐHøÝð ð ð Øˆˆðøøøs   ‹A* ª A* ÁA* Á*
A8Á7A8)r   r   r   r   rl   )r[   r\   )r   rp   )r   rB   )r{   r\   r   rp   )Ú__doc__Ú
__future__r   Úargparserm   rJ   rª   r   r^   r>   rZ   rb   ro   r‚   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   r¦   © r?   r=   ú<module>rµ      s  ðð
ð 
ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ø 
€
€
€
à )Ð )Ð )Ð )Ð )Ð )ðSð Sð Sð Sðl!ð !ð !ð !ðHð ð ð ðð ð ð,0ð 0ð 0ð 0ð$ð ð ð ð8ð ð ð ð" ðð ð ñ „ðð
 ðð ð ñ „ðð ðð ð ñ „ðð ðð ð ñ „ðð ð	ð 	ð 	ñ „ð	ðð ð ð ð ðð ð ñ „ðð ðð ð ñ „ðð ðð ð ñ „ððð ð ð ð ð r?   