
    (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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)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)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/rurouni/.hermes/hermes-agent/hermes_cli/projects_cmd.pybuild_parserr>      se    ))?7	 * 	 	F 

%5

6
6C~~h-C~DDH&'HIII#N     (D7OPPPT68K     /4888(D111)T22246K     +F     ^^FTF^IIF
+=(    
 ^^F)C^DDF
	(<===NN<.INJJE	y';<<<	vM222	y$///	L/E     >>/0P>QQDi&:;;;f=111~~h-?~@@H)*>???&z222}3KLLI9+?@@@6(RSSSNN5'?N@@E	d1    
 y/BCCI9+?@@@y/LMMI9+?@@@^^L/Q^RRF
	(<===
sB-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2F 
0$77AZ   
 q %+'% H ll6""G111
CCCCq74==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|2522DDDDKr?   c                H     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.
    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++	 	 	 	 	 	 	 	    '#''cj9999qqq	 	 	 	 	 	 	 		 	 	 	 	 	 	 	 	 	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   !]2MME	TY
,
,47
,
,U
,
,---	
#	
#
#$$$ 0.D,../// /-DO--... 1/D-//000| 0l 	0 	0A<144TD'(w6OOOOOBE...qv.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 *tS)))?4--D	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.    #cj1111qqqqq |.SZ@@@@q	
0TY
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((!741CU#K#K
 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 

  PQQQq P PC!"3qy>>NN!&NNNqvNu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    >$$*QUQ]^^^D	
(4
(
(TY
(
()))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    T47DI66 <<<3:NNNNq	
1TY
1
1di
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    tTW495555	
/TY
/
/DI
/
/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	
6DI
6
649
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   				 &$| 	N4&&&*+++	& & & & & & & &
 dl++<& & & & & & & & 	tTW%%%& & & & & & & & & & & & & & & 

(TY
(
()))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    dg&&&	
!di
!
!"""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    tTW<<<<z 18ty88DJ88999#D$*5555/DI//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###BOOD,A,A#F
d6G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?   