
    Qi[%                        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lZddlmZm	Z	m
Z
mZmZ ddZddZddZdd	Zdd
ZddZddZddZddZedk(  r e        yy)u   todo.json CRUD 관리 스크립트.

모든 todo.json 조작은 이 스크립트를 통해서만 수행한다.
issue-040 유실 사고 (JSON 구조 오류) 방지용.

Usage:
    python3 todo-manager.py list [--project NAME] [--status STATUS]
    python3 todo-manager.py show ISSUE_ID
    python3 todo-manager.py add --project NAME --title TITLE [OPTIONS]
    python3 todo-manager.py update ISSUE_ID [--status STATUS] [--priority PRIO] [--title TITLE]
    python3 todo-manager.py remove ISSUE_ID [--force]
    python3 todo-manager.py sub-add ISSUE_ID --title TITLE
    python3 todo-manager.py sub-done ISSUE_ID --index IDX --task-id TASK_ID
    python3 todo-manager.py sub-done ISSUE_ID --match TEXT --task-id TASK_ID
    python3 todo-manager.py link ISSUE_ID TASK_ID
    )annotationsN)datetime)
find_issueget_next_id	load_todo
print_json	save_todoc           
     >   t               }|j                  dg       }| j                  r.|D cg c]#  }|j                  d      | j                  k(  s"|% }}| j                  r.|D cg c]#  }|j                  d      | j                  k(  s"|% }}g }|D ]d  }|j	                  |j                  d      |j                  d      |j                  d      |j                  d      |j                  d      d       f t        || j                          y	c c}w c c}w )
u   이슈 목록 조회.issuesprojectstatusidtitlepriority)r   r   r   r   r   prettyN)r   getr   r   appendr   json)argsdatar   iresults        D/home/jay/workspace/.worktrees/task-2117-dev1/memory/todo-manager.pycmd_listr      s    ;DXXh#F ||#HquuY'74<<'G!HH{{#FquuX$++'E!FFF 	
eeDk55+w%%/EE*-	
	
 v$))m,! IFs   #DD'#DDc                    t               }t        || j                        }|s>t        d| j                   dt        j
                         t	        j                  d       t        || j                          y)u   이슈 상세 조회.Error: Issue '' not foundfile   r   N)	r   r   issue_idprintsysstderrexitr   r   )r   r   issues      r   cmd_showr(   8   sR    ;DtT]]+Et}}o[9

Ku]+    c                z   t               }t        |      | j                  | j                  | j                  xs d| j
                  xs d| j                  xs dt        j                         j                         dg g d
}|d   j                  |       t        |       t        d|d   d	| j                   
       y)u   이슈 추가. mediumpendingN)
r   r   r   descriptionr   r   
created_atcompleted_atlinked_tasks	sub_itemsr   Tr   )successr   r   )r   r   r   r   r.   r   r   r   now	isoformatr   r	   r   r   )r   r   	new_issues      r   cmd_addr7   D   s    ;D $<<''-2MM-X++*lln..0I 	N)$dO4y7DIINr)   c                   t               }t        || j                        }|s>t        d| j                   dt        j
                         t	        j                  d       g }| j                  rT| j                  |d<   |j                  d       | j                  dk(  r%t        j                         j                         |d<   | j                  r | j                  |d<   |j                  d       | j                  r | j                  |d	<   |j                  d	       t        |       t        d
|d| j                           y)u   이슈 수정.r   r   r   r!   r   doner0   r   r   T)r3   updatedr   N)r   r   r"   r#   r$   r%   r&   r   r   r   r4   r5   r   r   r	   r   r   )r   r   r'   r:   s       r   
cmd_updater;   [   s    ;DtT]]+Et}}o[9

KG{{++hx ;;& $,LLN$<$<$>E.!}} MMjz"zzgwdO4G4]Kr)   c                   t               }t        || j                        }|s>t        d| j                   dt        j
                         t	        j                  d       | j                  sct        d| j                   d|j                  d       d       t        d	      j                         j                         }|d
k7  rt        d       ydg d}t        j                  j                         rGt        t        j                  t        j                         5 }t#        j$                  |      }ddd       t'        j(                         j+                         |d<   |d   j-                  |       t        t        j                  dt        j                         5 }t#        j.                  ||dd       ddd       |d   D cg c]#  }|j                  d      | j                  k7  s"|% c}|d<   t1        |       t3        d| j                  d| j"                          y# 1 sw Y   xY w# 1 sw Y   {xY wc c}w )u   이슈 삭제.r   r   r   r!   zRemove issue 'z': r   ?zConfirm [y/N]: yAbortedNz1.0)versionremoved)encoding
removed_atrA   wF   )ensure_asciiindentr   r   T)r3   rA   r   )r   r   r"   r#   r$   r%   r&   forcer   inputstriplower
todo_utilsREMOVED_FILEexistsopenENCODINGr   loadr   r4   r5   r   dumpr	   r   )r   r   r'   respremoved_datafr   s          r   
cmd_removerV   u   s   ;DtT]]+Et}}o[9

K ::t}}oS71C0DAFG&'--/5573;) &+r:L%%'*))J4G4GH 	(A99Q<L	(",,.224E,""5)	j%%sZ5H5H	I AQ		,a@A "&hPA155;$--3OaPDNdO4DMM:tyy=Q	( 	(A A Qs$   H%H1#H=*H=%H.1H:c                   t               }t        || j                        }|s>t        d| j                   dt        j
                         t	        j                  d       | j                  ddd}|j                  dg       j                  |       t        |       t        d	t        |d         dz
  d
| j                          y)u   sub_item 추가.r   r   r   r!   FN)r   r9   task_idr2   Tr3   indexr   )r   r   r"   r#   r$   r%   r&   r   
setdefaultr   r	   r   lenr   )r   r   r'   sub_items       r   cmd_sub_addr^      s    ;DtT]]+Et}}o[9

KUtDH	["%,,X6dO4#eK.@*AA*EFSWS\S\}]r)   c                h   t               }t        || j                        }|s>t        d| j                   dt        j
                         t	        j                  d       |j                  dg       }d}| j                  | j                  dk  s| j                  t        |      k\  r>t        d	| j                   d
t        j
                         t	        j                  d       d|| j                     d<   | j                  || j                     d<   | j                  }n| j                  rd}t        |      D ]_  \  }}| j                  j                         |j                  dd      j                         v sAd||   d<   | j                  ||   d<   |}d} n |sot        d| j                   dt        j
                         t	        j                  d       n0t        dt        j
                         t	        j                  d       t        |       t        d|d| j                           y)u   sub_item 완료 처리.r   r   r   r!   r2   Nr   zError: Index z out of rangeTr9   rX   Fr   r+   zError: No sub_item matching ''z&Error: Must specify --index or --matchrY   r   )r   r   r"   r#   r$   r%   r&   r   rZ   r\   rX   match	enumeraterK   r	   r   r   )r   r   r'   r2   idxfoundr   items           r   cmd_sub_donerg      s   ;DtT]]+Et}}o[9

K		+r*ICzz::>TZZ3y>9M$**];#**MHHQK(,	$**f%+/<<	$**i(jj	 + 	GAtzz!TXXgr%:%@%@%BB'+	!V$*.,,	!Y'	 1$**Q?cjjQHHQK6SZZHdO4#.499}Er)   c                   t               }t        || j                        }|s>t        d| j                   dt        j
                         t	        j                  d       |j                  dg       }| j                  |vr|j                  | j                         t        |       t        d|d| j                          y	)
u   linked_tasks 추가.r   r   r   r!   r1   T)r3   r1   r   N)r   r   r"   r#   r$   r%   r&   r[   rX   r   r	   r   r   )r   r   r'   linkeds       r   cmd_linkrj      s    ;DtT]]+Et}}o[9

Knb1F||6!dll#dO48TYYOr)   c                    t        j                  d      } | j                  ddd       | j                  dd	      }|j	                  d
d      }|j                  dd       |j                  dd       |j                  t               |j	                  dd      }|j                  dd       |j                  t               |j	                  dd      }|j                  ddd       |j                  ddd       |j                  dg d       |j                  dg d       |j                  d d!       |j                  t               |j	                  d"d#      }|j                  d       |j                  dg d       |j                  dg d       |j                  d       |j                  t               |j	                  d$d%      }|j                  d       |j                  d&d'dd(       |j                  t               |j	                  d)d*      }|j                  d       |j                  dd+       |j                  t               |j	                  d,d-      }|j                  d       |j                  d.t        d/0       |j                  d1d2       |j                  d3dd4       |j                  t               |j	                  d5d6      }	|	j                  d       |	j                  d7       |	j                  t               | j                         }
|
j!                  |
       y )8Nu   todo.json CRUD 관리)r.   z--json
store_trueu   JSON 한 줄 출력)actionhelpcommandT)destrequiredlistu   이슈 목록)rn   z	--projectu   프로젝트 필터z--statusu   상태 필터)funcshowu   이슈 상세r"   u   이슈 ID (예: issue-040)addu   이슈 추가u   프로젝트명)rq   rn   z--titleu   제목z
--priority)highr,   lownormal)choices)r-   in_progressr9   z--descriptionu   설명updateu   이슈 수정removeu   이슈 삭제z--forcez-fu   확인 생략zsub-addu   sub_item 추가)rq   zsub-doneu   sub_item 완료z--indexu   인덱스 (0부터))typern   z--matchu   제목 매칭 텍스트z	--task-idu   연결된 task IDlinku   linked_tasks 추가rX   )argparseArgumentParseradd_argumentadd_subparsers
add_parserset_defaultsr   r(   r7   r;   rV   r^   intrg   rj   
parse_argsrs   )parser
subparsersp_listp_showp_addp_updp_rmp_sap_sdp_linkr   s              r   mainr      s/   $$1HIF
<QR&&I&EJ ""6"@F
*?@

9
X& ""6"@F

)EF
X& !!%o!>E	{T8IJ	y4h?	|-PQ	z+MN	X6	G$ !!(!AE	z"	z+MN	|-PQ	y!	J'    @Dj!ilQ:&   1B CDj!i$/;'   2C DDj!ic0EFi&?@kD7JK<( ""60E"FF

#
	"
X&DIIdOr)   __main__)r   zargparse.NamespacereturnNone)r   r   )__doc__
__future__r   r   r   r$   r   rL   r   r   r   r   r	   r   r(   r7   r;   rV   r^   rg   rj   r   __name__ r)   r   <module>r      sn   " #   
   P P-4	,O.L4RD^ &FRP"<~ zF r)   