
    `gj+                       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y)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_dbc                   | j                  ddd      }|j                  d      }|j                  dd	      }|j                  d
d	       |j                  ddd       |j                  ddd       |j                  dddd       |j                  dd       |j                  dd       |j                  dd       |j                  dddd       |j                  dd d!"       |j                  d#d$gd%&      }|j                  d'd d(d)*       |j                  d+d,	      }|j                  dd-	       |j                  d.d/	      }|j                  dd-	       |j                  d0d1	       |j                  d2d       |j                  dd d3"       |j                  d4d5	      }|j                  dd-	       |j                  d0d1	       |j                  d6d7	      }|j                  dd-	       |j                  d
d8	       |j                  d9d:	      }	|	j                  dd-	       |	j                  d0d;	       |j                  d<d=	      }
|
j                  dd>dd?@       |j                  dAdB	      }|j                  dd-	       |j                  dCdD	      }|j                  dd-	       |j                  dEdF	      }|j                  dd-	       |j                  dGd>dHdI@       |j                  |J       |S )Kz?Attach the ``project`` subcommand tree. Returns the top parser.projectz0Manage projects (named, multi-folder workspaces)zProjects 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)parent_subparsersparsersubp_createp_listp_showp_addp_rmp_rename	p_primaryp_use	p_archive	p_restorep_binds                 J/root/.hermes/venv/lib/python3.12/site-packages/hermes_cli/projects_cmd.pybuild_parserr;      sz    ))?7	 * 	F 

%5

6C~~h-C~DH&'HI#N   (D7OPT68K   /48(D1)T246K   +F   ^^FTF^IF
+=(  
 ^^F)C^DF
	(<=NN<.INJE	y';<	vM2	y$/	L/E   >>/0P>QDi&:;f=1~~h-?~@H)*>?&z2}3KLI9+?@6(RSNN5'?N@E	d1  
 y/BCI9+?@y/LMI9+?@^^L/Q^RF
	(<=
sB-J   /M    c                   t        | dd      }|s<t        | dd      }||j                          yt        dt        j                         yt
        t        t        t        t        t        t        t        t        t        t        t        d}|j!                  |      }|t        d| t        j                         y	 ||       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)argsr   r-   handlershandlers        r:   projects_commandrU   l   s    T+T2F0$7  AZZ
  %+'%H ll6"G(1

C4=r<   c                r    t        j                  | |      }|t        d| t        j                         |S )Nzproject: no such project: r>   )pdbget_projectrC   rD   rE   )connidentprojs      r:   _resolver\      s2    ??4'D|*5'2DKr<   c                D     t        j                         d fd       }|S )zOpen 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.
    c                *   t        j                         5 }t        || j                        }|
	 d d d        y	  | ||      cd d d        S # t        $ r0}t        d| t        j                         Y d }~d d d        yd }~ww xY w# 1 sw Y   y xY w)Nr@   	project: r>      )rW   connect_closingr\   r   
ValueErrorrC   rD   rE   )rR   rY   r[   excfns       r:   wrapperz_with_project.<locals>.wrapper   s      " 	dD$,,/D|	 	$d+	 	  	#'cjj9	 		 	s.   B		A	BB4B	BB		BrR   zargparse.Namespacereturnint)	functoolswraps)rd   re   s   ` r:   _with_projectrk      s'     __R	 	 Nr<   c                b   | 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                  rht        d	       | j                  D ]M  }|j                  rd
nd}|j                  rd|j                   dnd}t        d| d|j                   |        O y y )N (archived)r&     []z  name:    z  about:   z  board:   z  primary: z
  folders:z *z   ()z    )archivedrC   slugidr   r   
board_slugprimary_pathr   
is_primarylabelr   )r[   flagsfmarkry   s        r:   _print_projectr}      s   !]]ME	TYYKs477)1UG
,-	K		{
#$D,,-./DOO,-.D--./0||l 	0A<<4TD'(wwb	OBECvQqvvhug./	0 r<   c                   	 t        j                         5 }t        j                  || j                  | j                  | j
                  | j                  | j                  | j                  | j                  | j                  	      }| j                  rt        j                  ||       t        j                  ||      }d d d        t        dt         j"                         yt        d|j                   d d       t%        |       y	# 1 sw Y   OxY w# t        $ r(}t        d| t         j"                         Y d }~yd }~ww xY w)
N)r   rt   r   rw   r   iconcolorrv   r_   r>   r`   zproject: vanished after createzCreated project rp   rq   r   )rW   ra   create_projectr   rt   r   primaryr   r   r   r%   r    
set_activerX   rb   rC   rD   rE   r}   )rR   rY   pidr[   rc   s        r:   rF   rF      s     " 	.d$$YYYY!\\ ,,YYjj::
C xxtS)??4-D	.$ |.SZZ@	TYYKr#a
014/	. 	.  	#cjj1s/   D B'D=D DD 	E EEc                   t        j                         5 }t        j                  |      }t        j                  |t	        | dd            }d d d        st        d       y|D ]h  }|j                  k(  rdnd}|j                  rdnd	}t        |j                        }t        | d|j                  d
d|j                   | d| d	       j y# 1 sw Y   xY w)Nr   F)r   z@No projects yet. Create one with `hermes project create <name>`.r   r   rr   rm   r&   z<24rn   z folder(s)])rW   ra   get_active_idlist_projectsrA   rC   ru   rs   lenr   rt   r   )rR   rY   activeprojspmarkerrz   nfolderss           r:   rG   rG      s    				 
$""4(!!741CU#K


 PQ PC!"qyy>!&&QqvvhugS
+NO	P
 
 
s   8CCc                    t        |       y)Nr   )r}   rR   rY   r[   s      r:   rH   rH      s    4r<   c                    t        j                  ||j                  | j                  | j                  | j
                        }t        d| d|j                          y)N)ry   rx   zAdded z to r   )rW   
add_folderru   r   ry   r   rC   rt   )rR   rY   r[   r   s       r:   rI   rI      sG    >>$$**QUQ]Q]^D	F4&TYYK
()r<   c                    t        j                  ||j                  | j                        s)t	        d| j                   t
        j                         yt	        d| j                   d|j                          y)Nz project: folder not in project: r>   r@   zRemoved z from r   )rW   remove_folderru   r   rC   rD   rE   rt   r   s      r:   rJ   rJ      sY    T477DII60<3::N	HTYYKvdii[
12r<   c                    t        j                  ||j                  | j                         t	        d|j
                   d| j                          y)N)r   zRenamed  -> r   )rW   update_projectru   r   rC   rt   r   s      r:   rK   rK     s<    tTWW4995	HTYYKtDII;
/0r<   c                   t        j                  ||j                  | j                        s7t	        d| j                   d|j
                   dt        j                         yt	        d|j
                   d| j                          y)	Nz
project: 'z' is not a folder of z0; add it first with `hermes project add-folder`.r>   r@   zSet primary of r   r   )rW   set_primaryru   r   rC   rt   rD   rE   r   s      r:   rL   rL   	  so    ??4$))4#8 D= >	

 	ODII;d499+
67r<   c                x   t        j                         5 }| j                  s+t        j                  |d        t	        d       	 d d d        yt        || j                        }|
	 d d d        yt        j                  ||j                         d d d        t	        dj                          y# 1 sw Y   "xY w)NzCleared active projectr   r@   zActive project: )rW   ra   r   r   rC   r\   ru   rt   r   s      r:   rM   rM     s    				 &$||NN4&*+	& &
 dll+<& & 	tTWW%& 
TYYK
()& &s   /B0B0/ B00B9c                t    t        j                  ||j                         t        d|j                          y)Nz	Archived r   )rW   archive_projectru   rC   rt   r   s      r:   rN   rN   $  ,    dgg&	Idii[
!"r<   c                t    t        j                  ||j                         t        d|j                          y)Nz	Restored r   )rW   restore_projectru   rC   rt   r   s      r:   rO   rO   +  r   r<   c                8   t        j                  ||j                  | j                         | j                  j	                         r<t        d|j                   d| j                          t        || j                         yt        d|j                          y)N)rv   zBound z
 -> board zUnbound board from r   )rW   r   ru   r%   striprC   rt   _sync_board_default_workdirr   s      r:   rP   rP   2  su    tTWW<zztyykDJJ<89#D$**5  	#DII;/0r<   c                    | j                   sy	 ddlm} |j                  |      }|sy||j                  k7  r|j                  |      sy|j                  || j                          y# t        $ r Y y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)rw   
hermes_clir   _normalize_board_slugDEFAULT_BOARDboard_existswrite_board_metadata	Exception)r[   rv   kbrt   s       r:   r   r   =  su     
.''
32###BOOD,A
d6G6GH s   A(  A( 
A( (	A43A4)r,   zargparse._SubParsersActionrg   zargparse.ArgumentParserrf   )rZ   str)rg   None)rg   rh   )rv   r   rg   r   )__doc__
__future__r   argparseri   rD   r   r   rW   r;   rU   r\   rk   r}   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   r    r<   r:   <module>r      s   
 #   
 )S1SSl!H,0$8"  
       	 	      r<   