
    8#j                        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m	Z	  ej                  e      Z	 	 	 	 	 	 	 	 d
dZddZddZed	k(  rddlZ ej"                   e              yy)u   taskctl_start — lock 파일 갱신 helper.

worktree_manager.cmd_create() 등 워크트리 생성 진입점에서 호출하여
.tasks/locks/<task_id>.lock 파일에 lock_sha 필드를 additive하게 기록한다.

task-2575: lock_sha schema fix
    )annotationsN)Path)Optionalc                   t        |       }|dz  dz  }|| dz  }t        |t              r t        |      dk(  rt	        d |D              sdt        |      ddd	S |j                  d
d
       i }d}|j                         r:	 t        j                  |j                  d            }t        |t              r|}d}|j                  d|       ||d<   |j!                  |j"                  dz         }
|
j%                  t        j&                  |dd      d       |
j)                  |       |t        |      |dS # t        j                  t        f$ r$}	t        j                  d|	       i }d}Y d}	~	d}	~	ww xY w)u	  `.tasks/locks/<task_id>.lock` 파일에 lock_sha 필드를 additive로 기록.

    파일이 이미 존재하면 기존 키를 보존하면서 lock_sha만 갱신/추가.
    파일이 없으면 minimal lock 파일을 생성 (lock_sha + task_id만).

    Args:
        workspace_root: workspace 루트 디렉토리 경로.
        task_id: 태스크 ID (예: "task-2575").
        lock_sha: 기록할 SHA40 문자열.

    Returns:
        {"status": "updated"|"created"|"skipped", "lock_path": str, "lock_sha": str}
    z.taskslocksz.lock(   c              3  $   K   | ]  }|d v  
 yw0123456789abcdefN .0cs     H/home/jay/workspace/.worktrees/task-2729+7-dev1/scripts/taskctl_start.py	<genexpr>z"record_lock_sha.<locals>.<genexpr>*   s     EpbcaK]F]Ep   skipped invalid_sha)status	lock_pathlock_shareasonT)parentsexist_okcreatedzutf-8)encodingupdatedu/   lock 파일 파싱 실패 — 새로 생성: %sNtask_idr   z.tmp   F)indentensure_ascii)r   r   r   )r   
isinstancestrlenallmkdirexistsjsonloads	read_textdictJSONDecodeErrorOSErrorloggerwarning
setdefaultwith_suffixsuffix
write_textdumpsreplace)workspace_rootr   r   	workspace	locks_dirr   existingr   parsedexctmp_paths              r   record_lock_shar>      sq   $ ^$IH$w.Iwiu--I x%#h-2*=#EpgoEpBp##i.b\ijjOOD4O0HF	ZZ	 3 3W 3 EFF&$'!F 	7+#HZ $$Y%5%5%>?H

8AEJU\]Y3y>xPP $$g. 	NNLcRHF	s   9D; ;E8E33E8c                `   	 t        j                  g dt        |       dddd      }|j                  j	                         }t        |      dk(  rt        d |D              r|S y# t         j                  t         j                  t        f$ r }t        j                  d|       Y d}~yd}~ww xY w)	u   worktree 디렉토리에서 `git rev-parse HEAD`로 lock_sha 추출.

    Args:
        worktree_path: worktree 디렉토리 경로.

    Returns:
        SHA40 문자열 또는 None (실패 시).
    )gitz	rev-parseHEADT
   )cwdcheckcapture_outputtexttimeoutr   c              3  $   K   | ]  }|d v  
 ywr
   r   r   s     r   r   z#resolve_lock_sha.<locals>.<genexpr>[   s     !Ga!'9"9!Gr   u   lock_sha 추출 실패: %sN)
subprocessrunr$   stdoutstripr%   r&   CalledProcessErrorTimeoutExpiredr.   r/   r0   )worktree_pathresultshar<   s       r   resolve_lock_sharR   H   s    :(M"
 mm!!#s8r>c!G3!GGJ  )):+D+DgN :3S99:s   A!A% %(B-B((B-c                 (   ddl } | j                  d      }|j                  dd      }|j                  dd	
      }|j	                  dd
       |j	                  dd
       |j	                  dd
       |j                         }|j                  dk(  r~t        |j                        }|s$t        t        j                  dddd             yt        |j                  |j                  |      }t        t        j                  |dd             yy)u   CLI 진입점: `python3 taskctl_start.py record <workspace_root> <task_id> <worktree_path>`

    Returns:
        exit code (0 성공, 1 실패).
    r   Nztaskctl_start.py)progcommandT)destrequiredrecordu   lock_sha 기록)helpr7   u   workspace 루트 경로r   u   태스크 IDrO   u(   worktree 경로 (HEAD SHA 추출 대상)erroru   lock_sha 추출 실패)r   messageF)r"      r    )r"   r!   )argparseArgumentParseradd_subparsers
add_parseradd_argument
parse_argsrU   rR   rO   printr)   r5   r>   r7   r   )r]   parsersubp_recordargsrQ   rP   s          r   _clirh   b   s     $$*<$=F


Y

>C~~h->~?H*1JK).9/0Z[D||xt112$**<TUdijk !4!4dllCHdjjeA>?    __main__)r7   
str | Pathr   r$   r   r$   returnr,   )rO   rk   rl   zOptional[str])rl   int)__doc__
__future__r   r)   loggingrI   pathlibr   typingr   	getLogger__name__r/   r>   rR   rh   sysexitr   ri   r   <module>rw      s    #     			8	$2Q2Q2Q 2Q 
	2Qj4< zCHHTV ri   