
    .i                         d Z ddlZddlZddlZddlZddlmZmZ ddlmZ ddl	m
Z
  eej                  j                  dd            Zedz  d	z  d
z  Z	 	 ddedededede
e   defdZdedee   fdZddedefdZddZedk(  r e        yy)u^  
decision_logger.py - JSONL 결정 히스토리 기록 유틸리티

각 작업의 판단 근거를 JSONL로 자동 기록한다.
dispatch.py 위임 시, .done 처리 시, /retro 스킬에서 참조.

출처: gstack artifact chain 패턴 (MIT 라이선스, https://github.com/garrytan/gstack)

Usage:
    # 결정 기록
    python3 decision_logger.py log --task-id task-xxx --stage plan --decision "A안 선택" --reason "성능 우선"

    # 특정 task의 결정 조회
    python3 decision_logger.py query --task-id task-xxx

    # 전체 결정 통계
    python3 decision_logger.py stats [--days 7]
    N)datetime	timedelta)Path)OptionalWORKSPACE_ROOTz/home/jay/workspacememoryevents	decisionstask_idstagedecisionreasonfindingsreturnc                 r   t         j                  dd       | ||t        j                         j	                         d}|r||d<   |||d<   |j                  |       t         |  dz  }t        |dd	
      5 }|j                  t        j                  |d      dz          ddd       |S # 1 sw Y   |S xY w)uM  
    결정을 JSONL 파일에 기록.

    Args:
        task_id: 작업 ID
        stage: 단계 (plan, review, dispatch, done, cross_review 등)
        decision: 결정 내용
        reason: 결정 사유
        findings: 발견 사항 수 (선택)
        **extra: 추가 필드

    Returns:
        기록된 entry dict
    T)parentsexist_ok)r   r   r   	timestampr   Nr   .jsonlautf-8encodingFensure_ascii
)
DECISIONS_DIRmkdirr   now	isoformatupdateopenwritejsondumps)	r   r   r   r   r   extraentrydecisions_filefs	            &/home/jay/workspace/decision_logger.pylog_decisionr+   !   s    , t4 \\^--/	 E  h$j	LL #y%77N	ncG	4 >	

5u5<=> L> Ls   8*B,,B6c                 @   t         |  dz  }|j                         sg S g }t        |dd      5 }|D ]:  }|j                         }|s	 |j	                  t        j                  |             < 	 ddd       |S # t
        j                  $ r Y ]w xY w# 1 sw Y   |S xY w)u+   특정 task의 모든 결정 기록 조회.r   rr   r   N)r   existsr"   stripappendr$   loadsJSONDecodeError)r   r(   entriesr)   lines        r*   query_decisionsr5   M   s    "y%77N  "	G	ncG	4  	D::<DNN4::d#34		 N ++  Ns/   B	$A:-B:BBBBBdaysc           	      (   t         j                         sddi ddS t        j                         t	        |       z
  }|j                         }d}t               }i }t         j                  d      D ]  }t        |dd      5 }|D ]  }|j                         }|s	 t        j                  |      }	|	j                  d	d
      }
|
|k  rD|dz  }|j                  |	j                  dd
             |	j                  dd      }|j                  |d      dz   ||<    	 ddd        t        j                         j                  d      }|j                  d      }|t!        |      || d| dS # t        j                  $ r Y w xY w# 1 sw Y   !xY w)u   
    최근 N일간 결정 통계.

    Returns:
        {
            "total_decisions": int,
            "total_tasks": int,
            "by_stage": {"plan": N, "review": N, ...},
            "period": "YYYY-MM-DD ~ YYYY-MM-DD",
        }
    r   zN/A)total_decisionstotal_tasksby_stageperiodr6   z*.jsonlr-   r   r   r       r   r   unknownNz%Y-%m-%dz ~ )r   r.   r   r   r   r    setglobr"   r/   r$   r1   r2   getaddstrftimelen)r6   cutoff
cutoff_strtotaltasksr:   
jsonl_filer)   r4   r'   tsr   end_date
start_dates                 r*   	get_statsrN   _   s    ! 	
 	
 \\^iT22F!!#JEEE!H#((3 =
*cG4 	= =zz| JJt,E YY{B/
?
		%))Ir23		'95"*,,ua"81"<!=	= 	==( ||~&&z2H,J !5zLH:.	  ++ 	= 	=s1   FE.0A*F.F	FF	FF	c                     t        j                  d      } | j                  dd      }|j                  dd      }|j	                  d	dd
       |j	                  ddd       |j	                  ddd       |j	                  ddd       |j	                  dt
        d d       |j                  dd      }|j	                  d	dd       |j                  dd      }|j	                  dt
        dd       | j                         }|j                  dk(  rdt        |j                  |j                  |j                  |j                  |j                        }t        t        j                   |d d!"             y |j                  dk(  rpt#        |j                        }|s1t        t        j                   d#d$|j                   d%d &             y |D ]"  }t        t        j                   |d &             $ y |j                  dk(  r8t%        |j&                  '      }t        t        j                   |d d!"             y y )(Nu&   JSONL 결정 히스토리 유틸리티)descriptioncommandT)destrequiredlogu   결정 기록)helpz	--task-idu	   작업 ID)rS   rU   z--stageu&   단계 (plan/review/dispatch/done 등)z
--decisionu   결정 내용z--reasonr=   u   결정 사유)defaultrU   z
--findingsu   발견 사항 수)typerV   rU   queryu   결정 조회u   조회할 작업 IDstatsu   결정 통계z--days   u   통계 기간 (일))r   r   r   r   r   F   )r   indentemptyu   결정 기록 없음: )statusmessager   r<   )argparseArgumentParseradd_subparsers
add_parseradd_argumentint
parse_argsrQ   r+   r   r   r   r   r   printr$   r%   r5   rN   r6   )	parser
subparsers
log_parserquery_parserstats_parserargsr'   r3   rY   s	            r*   mainrn      s   $$1YZF&&I&EJ &&u?&CJK$[II;cdL4oNJILsDGZ[ (((GLkD?TU (((GLhS!BWXD||uLL**]];;]]
 	djjU1=>		 !$,,/$**>TUYUaUaTb<cdsxyz  =djjU;<= 
	 tyy)djjU1=> 
!    __main__)r=   N)rZ   )r   N)__doc__r`   r$   ossysr   r   pathlibr   typingr   environrB   	WORKSPACEr   strre   dictr+   listr5   rN   rn   __name__ ro   r*   <module>r}      s   &   	 
 (   02GHI	H$x/+= "))) ) 	)
 sm) 
)XS T$Z $7C 7 7t*?Z zF ro   