
    Bj$                    t   d Z ddlmZ ddlZddlZddlZddlmZ  ee      j                         j                  d   Z ee      ej                  vr"ej                  j                  d ee             ddlmZmZmZmZ dZddddddd		 dd
ZddZddZdddZedk(  r ej4                   e              yy)u_  scripts/pre_push_terminal_guard.py — Pre-push Terminal Artifact Guard (task-2779_a).

pre-push 시점에 terminal artifact 존재 여부를 확인하고 warn/envelope mode로 동작하는 가드.

역할:
  - terminal artifact(report/.done/envelope) 부재 시 canonical manifest에
    PUSH_ATTEMPT_WITHOUT_TERMINAL_MARKER 마커를 기록(surface)한다.
  - warn mode: 항상 exit code 0 반환 — push를 절대 차단하지 않는다.
  - 기존 build_manifest/surface_manifest 를 재사용한다.

★ 절대 금지 사항:
  - 실제 .git/hooks/pre-push 설치 0.
  - 실제 git push 실행 0.
  - subprocess로 git/push 호출 0.
  - callback fire/delivery 0.
  - cron/systemd 조작 0.
  - network 호출 0.
  - cokacdir 호출 0.
  - raw key/secret/ANU key literal 하드코딩 절대 0.
  - strict/blocking mode 구현 0.
  - Stop hook enforcer 0.
    )annotationsN)Path   )build_manifestsurface_manifest STATUS_TERMINAL_CALLBACK_MISSING$STATUS_PUSH_ATTEMPT_WITHOUT_TERMINALGUARD_INTERNAL_ERROR_FAIL_OPENwarn)branchhead
report_reldone_relenvelope_relmodec                  	 t        | |||||||      }	|	j                  t        k(  }
|
r<t        |	_        t        |	j                  vr|	j                  j                  t               t        |	|      }| ||	j                  t        |	j                        |
d|ddd	S # t        $ r | |t        t        gdddddd	cY S w xY w)u   pre-push terminal artifact guard 실행.

    warn/envelope mode: push를 절대 차단하지 않는다. 항상 exit_code=0 반환.

    동작:
      1. build_manifest 로 artifact 존재 여부 확인.
      2. artifact 부재(STATUS_TERMINAL_CALLBACK_MISSING) 시 push_attempt=True로 표시하고
         PUSH_ATTEMPT_WITHOUT_TERMINAL_MARKER 마커를 manifest에 실어 surface.
      3. artifact 존재 시 그대로 surface.
      4. 어떤 예외도 밖으로 던지지 않는다(fail-open).

    반환 dict 키:
      task_id, mode, status, statuses, push_attempt, blocked(항상 False),
      surfaced_index_path, exit_code(항상 0), failed_open.

    Parameters
    ----------
    task_id:
        대상 task ID.
    canonical_root:
        canonical workspace root 경로.
    worktree_root:
        worktree root 경로.
    branch:
        git branch 이름 (선택).
    head:
        git HEAD SHA (선택).
    report_rel:
        report 파일 상대경로 (선택, None이면 기본값 사용).
    done_rel:
        .done 파일 상대경로 (선택, None이면 기본값 사용).
    envelope_rel:
        callback envelope 상대경로 (선택, None이면 기본값 사용).
    mode:
        가드 모드. 현재 "warn" 고정 (blocking 미구현).
    )canonical_rootworktree_rootr   r   r   r   r   )r   Fr   )	task_idr   statusstatusespush_attemptblockedsurfaced_index_path	exit_codefailed_open T)
r   r   r   r	   r   appendr   list	Exception_GUARD_INTERNAL_ERROR_STATUS)r   r   r   r   r   r   r   r   r   manifestr   surfaceds               6/home/jay/workspace/scripts/pre_push_terminal_guard.py	run_guardr%   0   s    `5
 ")'!%	
  *JJBHO38;L;LL!!(()MN $H^L ooX../(#+ 

 
	
  
 256!#%

 
	

s   BB B=<B=c                    t        j                  dt         j                        } | j                  ddd       | j                  ddd       | j                  d	d
d       | j                  ddd       | j                  ddd       | j                  dddd       | j                  dddd       | j                  dddd       | j                  dddd        | S )!u   argparse 파서 생성.uU   Pre-push Terminal Artifact Guard CLI (task-2779_a) — warn mode, push 차단 없음.)descriptionformatter_classz	--task-idTu"   대상 task ID (예: task-2779_a).)requiredhelpz
--worktreeu+   worktree root 경로 (절대경로 권장).z--canonical-rootz/home/jay/workspaceu4   canonical root 경로 (기본: /home/jay/workspace).)defaultr*   z--branchNu   git branch 이름 (선택).z--headu   git HEAD SHA (선택).z--report-relr   u$   report 파일 상대경로 (선택).)r+   destr*   z
--done-relr   u#   .done 파일 상대경로 (선택).z--envelope-relr   u(   callback envelope 상대경로 (선택).z--json
store_trueoutput_jsonu   결과를 JSON으로 출력.)actionr,   r*   )argparseArgumentParserRawDescriptionHelpFormatteradd_argument)ps    r$   _build_parserr5      s    k <<	A NN;4XNYNN<$5bNcNN%C  
 NN:t2ONPNN8T0HNINN>4lIoNpNN<JEjNkNN#TMwNxNN+	   H    c           
         d| d    d| d    d| d    d| d   d	| d
    d| d    d| d    d| d    g}| d   r|j                  d| d           n|j                  d       dj                  |      S )uB   사람이 읽을 수 있는 가드 결과 요약 문자열 반환.z%[pre-push-guard] task_id           : r   z%[pre-push-guard] mode              : r   z%[pre-push-guard] status            : r   z%[pre-push-guard] statuses          : r   z%[pre-push-guard] push_attempt      : r   z%[pre-push-guard] blocked           : r   z%[pre-push-guard] exit_code         : r   z%[pre-push-guard] failed_open       : r   r   z%[pre-push-guard] surfaced_to       : uJ   [pre-push-guard] surfaced_to       : (surface 실패 또는 경로 없음)
)r   join)resultliness     r$   _human_summaryr<      s     0y0A/BC
/v/?@
/x0@/AB
/z0B/EF
/~0F/GH
/y0A/BC
/{0C/DE
/}0E/FG	E #$<VDY=Z<[\]ab99Ur6   c                "   t               }	 |j                  |       }	 t        |j                  |j                  |j                  |j                  |j                  |j                  |j                  |j                  d	      }|j                  r"t        t!        j"                  |dd             nt        t%        |             |d   S # t        $ r-}|j                  t	        |j                        ndcY d}~S d}~ww xY w# t&        $ r Y y	w xY w)
u   CLI 메인 진입점.

    warn mode: 어떤 경우에도 0 반환 — push를 절대 차단하지 않는다.
    argparse SystemExit는 그대로 코드 반환, 그 외에는 모든 경로에서 0 반환.
    Nr   r   )r   r   r   r   r   r   r   r   F   )ensure_asciiindentr   r   )r5   
parse_args
SystemExitcodeintr%   r   r   worktreer   r   r   r   r   r.   printjsondumpsr<   r    )argvparserargsexcr:   s        r$   mainrM      s     _F<  &
LL..--;;]]**

 $**V%BC.() k""/  < # 4s388}!;<2  s/   C	 B*D 		C?"C:4C?:C?	DD__main__)returndict)rO   zargparse.ArgumentParser)r:   rP   rO   str)N)rO   rD   )__doc__
__future__r   r0   rG   syspathlibr   __file__resolveparents
_REPO_ROOTrQ   pathinsert dispatch.terminal_artifact_indexr   r   r   r	   r!   r%   r5   r<   rM   __name__exit r6   r$   <module>r`      s   , #   
  (^##%--a0
z?#(("HHOOAs:'   @  		e
 
e
P6&$N zCHHTV r6   