
    SiH$                    x    d Z ddlmZ ddlZddlmZ  ed      Zg dZg dZdZ	g d	Z
g d
ZddZddZd Zd Zy)u  tests/taskctl/test_hidden_path_audit.py
Hidden Path Audit — 우회 경로 잔존 검증 (task-2467)

벨레스(개발6팀 테스터) 작성.

명세 §7 (taskctl-state-machine-spec.md) + pr-lifecycle-spec.md §3/§5:
    "gh pr create", "gh pr merge", "git push origin main" 등의 패턴이
    scripts/taskctl.py 외 코드베이스에 존재하면 안 됨.

케이스:
    1. test_no_direct_gh_pr_calls_outside_taskctl — 금지 패턴 우회 경로 검사
    )annotationsN)Pathz-/home/jay/workspace/.worktrees/task-2467-dev6)zgh pr creategh pr mergezgit push origin mainzgit push --force origin mainz&worktree_manager finish --action merge)z.gittestsfixturesz
.worktreesnode_modules__pycache__zmemory/logszmemory/eventsscripts/taskctl.py)zmemory/specs/zmemory/plans/zmemory/tasks/zmemory/reports/zmemory/orchestration-audit/zmemory/feedback_daemonzmemory/system_bot	blueprintz.md:z.txt:z.log:z.jsonl:z.json:z.yml:z.yaml:z.sh:)#"""'''z# z//f"f'c                   | j                         }|sy|j                  d      ry|j                  d      s|j                  d      ry|j                  d      s|j                  d      ry|d   j                         rd|d	d
 v ry|j                  d      s|j                  d      ryd|v sd|v ryd|v r	d|v sd|v ryd| v sd| v sd| v ryd| v sd| v ryd|v rd|v ryd|v rd|v ryd|v sd|v ryy)u   content가 실제 코드 호출인지 (주석/docstring/문자열 아닌지) 판단.

    실제 위반은 subprocess.run(["gh", "pr", "merge", ...]) 형태.
    주석/docstring/f-string 에러 메시지는 위반 아님.
    Fr   r   r   -*r   .N   r   r   z= f"z= f'grepz-E-rnu   대상u   호출보다u   보장u   호출.u   기준 먼저zsubprocess.runghTz	os.systemz`gh z$(gh )strip
startswithisdigit)contentstrippeds     U/home/jay/workspace/.worktrees/task-2467-dev6/tests/taskctl/test_hidden_path_audit.py_is_code_line_contentr   N   s1    }}H35!X%8%8%?38#6#6s#;{!!45!X%8%8%>(f0tx/5H3D7n78w;NG'98#(8h48#3W0     c                Z    | j                         syt        | v ryt        D ]  }|| v s y y)uP   해당 라인이 허용된 위치(taskctl.py 또는 제외 경로)인지 판단.TF)r   ALLOWED_FILEEXCLUDED_PATH_FRAGMENTS)linefragments     r   _is_allowed_liner&      s8    ::<t+ t r    c            	        i } t         D ]  }g }t        D ]	  }|d|gz  } |g dz  }t        j                  ddg|z   |t	        t
              gz   dd      }g }|j                  j                         D ]j  }|j                         st        |      r d|v r%d|v r1|j                  dd	      }t        |      d
k\  r|d	   }t        |      sZ|j                  |       l |s|dd | |<    | rog }	| j                         D ]A  \  }}
|	j                  d| dt        |
       d       |
D ]  }|	j                  d|         C J ddj                  |	      z          y)u  금지 패턴이 taskctl.py 외 코드베이스에 존재하지 않아야 함.

    허용:
        - scripts/taskctl.py (유일한 gh pr merge 진입점)
        - tests/ (본 파일 및 검증 코드)
        - memory/specs/, memory/plans/ 등 문서 파일
        - .md, .txt, .log, .json, .jsonl 파일
        - .git, .worktrees, node_modules, __pycache__

    검증:
        각 금지 패턴에 대해 grep 실행 → 위반 라인 0건 확인.
    z--exclude-dir)--exclude=*.md--exclude=*.txt--exclude=*.logz--exclude=*.jsonz--exclude=*.jsonlr   r   Tcapture_outputtexttest_hidden_path_audit:   r   N
   u	   
패턴 'u
   ' 위반 (u   건):  u   우회 경로 잔존 발견:
)FORBIDDEN_PATTERNSEXCLUDES
subprocessrunstr	WORKSPACEstdout
splitlinesr   r&   splitlenr   appenditemsjoin)all_violationspatternexcludes_argsexproc
violationsr$   partsr   	msg_partsviolsvs               r   *test_no_direct_gh_pr_calls_outside_taskctlrK      s    ,.N% '6 	3Bor22M	3 	 
 	
 ~~UOm+wI.GGd

 
KK**, 	$D::<%'4/d{

3*u:?#AhG09 d#!	$$ &0"oN7#O'6R 	,224 	+NGUz'*SZLNO +  2aS*+	+ 	L4tyy7KKKu r    c                    d} t        j                  ddd| gt        t              dd      }|j                  dk(  ry|j                  d	k7  rAt        j                  dd
dddddddd| t        t              gdd      }|j                  d	k7  ry|j
                  j                         }g }|D ]{  }|j                         st        |v sd|v r!d|v sd|v r*t        |      r6d|v r1|j                  dd      }t        |      dk\  r|d   }t        |      sk|j                  |       } |r J ddj                  d |D              z          y)u   scripts/taskctl.py가 'gh pr merge' 유일한 호출처임을 검증.

    git grep을 사용하여 worktree 내 모든 파일 검색.
    (git grep은 tracked 파일만 검색 — untracked 제외)
    r   gitr   z-nT)cwdr,   r-      Nr   r   z--exclude-dir=.gitz--exclude-dir=testsz--exclude-dir=.worktreesz--exclude-dir=node_modulesz--exclude-dir=__pycache__r(   r)   r*   r+   r
   ztests/test_r/   r0   r   u<   'gh pr merge' 직접 호출이 taskctl.py 외에서 발견:
r3   c              3  &   K   | ]	  }d |   yw)r2   N ).0rJ   s     r   	<genexpr>z:test_taskctl_is_sole_gh_pr_merge_caller.<locals>.<genexpr>  s     1bH1s   )r6   r7   r8   r9   
returncoder:   r;   r   r"   r&   r<   r=   r   r>   r@   )rB   rE   linesrF   lnrG   r   s          r   'test_taskctl_is_sole_gh_pr_merge_callerrX      st    G >>	g&	N$D ! 	! ~~U!#8')E(02Cc)n&  d
 ??aKK""$EJ xxz2!5!;r>W]B"9HHS!$E5zQ(,W5"'*  
G
))1j1
1	2>zr    )r   r8   returnbool)r$   r8   rY   rZ   )__doc__
__future__r   r6   pathlibr   r9   r4   r5   r"   r#   COMMENT_OR_STRING_INDICATORSr   r&   rK   rX   rR   r    r   <module>r_      s]    #  @A	 	 $ ,  0f>LB=r    