vibe-sunsang-retro (Codex)
Codex 세션 로그를 읽기 좋은 Markdown으로 변환하고 분석 가이드를 제공한다.
Codex는 skill-first다 (별도 커맨드 파일 없음). 객관식은 Codex CLI에 카드 UI가 없으므로 $PLUGIN_ROOT/shared/questioning-policy.md §A 번호 블록으로 채팅에서 묻는다.
데이터 경로
- 원본:
~/.codex/sessions/**/*.jsonl($CODEX_HOME/sessions가 있으면 그쪽. 다른 위치는--sessions-dir) - 변환 결과:
~/vibe-sunsang/conversations/{프로젝트명}/ - 인덱스:
~/vibe-sunsang/conversations/INDEX.md - 설정:
~/vibe-sunsang/config/ - 리포트 저장:
~/vibe-sunsang/exports/ - 변환 스크립트:
$PLUGIN_ROOT/scripts/convert_sessions.py
프로젝트 = 세션의 작업 디렉토리(cwd). 표시 이름은 폴더명에서 자동 생성되고 config/project_names.json(cwd → 이름)으로 바꿀 수 있다. 같은 폴더명이 다른 경로에 있으면 부모 폴더명이 접두로 붙는다.
실행: 대화 로그 변환
인자: $ARGUMENTS
Step 0: 워크스페이스 자동 치유 (dead-end 방지)
파일 존재만 확인하고 튕기지 않는다. 다음을 실행해 워크스페이스를 스스로 준비한다:
python3 "$PLUGIN_ROOT/scripts/ensure_workspace.py" 2>/dev/null || python "$PLUGIN_ROOT/scripts/ensure_workspace.py"
출력 마지막 줄 STATUS <fresh|v2|v1_migrated> CONFIG <present|absent>로 분기한다:
v1_migrated→ "이전 버전 데이터를 새 구조로 옮겼어요." 한 줄만 안내하고 계속 진행한다.CONFIG absent(fresh) → 아직 초기 설정 전이다. "처음이시네요 — 바로 준비할게요!" 안내 후 vibe-sunsang-onboard로 넘긴다 (자동 이름/기본 유형 lazy 온보딩 가능). 여기서 종료하지 말 것.- 그 외(
v2,CONFIG present) → 그대로 다음 단계.
Step 1: 변환 스크립트 실행
인자를 분석하여 적절한 옵션으로 실행합니다:
| 인자 | 동작 |
|---|---|
| (없음) | 증분 변환 (새 세션·이어진 세션만) |
| "전체", "force", "다시" | --force 전체 재변환 |
| "상세", "verbose" | --verbose 도구 결과 전문 포함 |
| 프로젝트명 | --project <이름> 해당 프로젝트만 (INDEX.md 표시 이름 또는 cwd 경로) |
프로젝트명이 지정된 경우: ~/vibe-sunsang/conversations/INDEX.md에서 프로젝트 목록을 읽어 일치하는 프로젝트를 찾습니다. 정확히 일치하는 프로젝트가 없으면 shared/questioning-policy.md §A 번호 블록으로 묻는다:
질문: 어떤 프로젝트의 대화를 변환할까요?
1. {프로젝트명1} — {세션 수}개 세션 (가장 활발, 추천)
2. {프로젝트명2} — {세션 수}개 세션
3. 문장으로 직접 알려주세요
(모르면 1번으로 진행하겠습니다)
선택지는 INDEX.md에서 읽은 프로젝트 목록으로 동적 생성한다. 세션 수가 많은 순으로 정렬한다.
# 기본: 증분 변환
python3 "$PLUGIN_ROOT/scripts/convert_sessions.py" --names-file "$HOME/vibe-sunsang/config/project_names.json" --output-dir "$HOME/vibe-sunsang/conversations" 2>/dev/null || python "$PLUGIN_ROOT/scripts/convert_sessions.py" --names-file "$HOME/vibe-sunsang/config/project_names.json" --output-dir "$HOME/vibe-sunsang/conversations"
# --force: 인자에 "전체", "force", "다시" 포함 시 위 명령에 --force 추가
# --verbose: 인자에 "상세", "verbose" 포함 시 추가
# --project <이름>: 인자에 프로젝트명 포함 시 추가
에러 처리
변환 스크립트 실행 중 문제가 발생하면 비개발자가 이해할 수 있게 안내합니다:
| 상황 | 사용자에게 보여줄 메시지 |
|---|---|
| Python 없음 | "Python이 설치되어 있지 않아요. 터미널에서 python3 --version을 실행해서 확인해주세요." |
| 세션 폴더 없음 | "Codex 대화 기록을 찾을 수 없어요. Codex로 작업한 적이 있는지, ~/.codex/sessions/가 있는지 확인해주세요. 다른 위치면 --sessions-dir <경로>로 지정할 수 있어요." |
| 권한 오류 | "파일에 접근할 수 없어요. ~/.codex/sessions/ 폴더의 권한을 확인해주세요." |
| 변환 0건 | "새로 변환할 대화가 없어요. 이미 최신 상태입니다!" |
Step 2: 인덱스 확인
변환 완료 후 인덱스를 읽어 현황을 보여줍니다:
~/vibe-sunsang/conversations/INDEX.md를 읽습니다 (프로젝트별 세션 수·기간·최근 활동 컬럼, 최근 활동 순 정렬).
변환 결과를 요약합니다:
- 총 프로젝트 수
- 총 세션 수
- 최근 변환된 세션
Step 3: 분석 템플릿 제안
변환이 완료되면 다음 분석 옵션을 제안합니다:
사용 가능한 분석:
프로젝트 패턴 분석
"[프로젝트명] 세션들을 분석해줘. 주요 작업 유형, 반복 에러, 도구 활용 패턴을 정리해줘."
성장 트래커 → "성장 리포트 만들어줘" (vibe-sunsang-growth)
성장 리포트를 생성합니다. (v2: 6축 기술 차원 분석 + 레이더 차트 포함)
멘토링 세션 → "멘토링해줘" (vibe-sunsang-mentor)
AI 활용 능력을 코칭 받습니다. (v2: 6축 중심 맞춤 분석)
버그/실수 패턴
"모든 프로젝트에서 내가 겪은 실수 패턴을 찾아줘."
멀티에이전트 리뷰
"서브에이전트를 spawn한 세션을 분석해서 코디네이션 효율을 평가해줘." (frontmatter
has_orchestration: true)비용 분석
"프로젝트별 토큰 사용량과 모델 분포를 정리해줘."
6축 분석
"최근 세션을 6축(DECOMP/VERIFY/ORCH/FAIL/CTX/META) 기준으로 분석해줘."
회고 프레임
회고를 진행할 때 다음 프레임을 쓴다:
- 사용자가 무엇을 잘 요청했는가?
- 요청에 맥락이나 수용 기준(acceptance criteria)이 빠진 곳은 어디였는가?
- 에이전트는 불확실성에 어떻게 반응했는가?
- 테스트·인용·스크린샷·검증이 적절한 순간에 쓰였는가?
- 다음에 연습할 행동 하나는 무엇인가?
Output
- 기본은 간결한 한국어.
- 사용자가 산출물을 원하면
~/vibe-sunsang/exports/에 저장한다.
Guardrails
- 원본 JSONL 로그를 직접 수정하지 않는다 (읽기 전용).
- 변환된 로그에 보이지 않는 예시를 지어내지 않는다.
- 변환 중 분석이 완료됐다고 말하지 않는다. 변환은 데이터 준비일 뿐이다.
- Codex CLI에는 객관식 카드 UI가 없다 →
shared/questioning-policy.md §A번호 블록을 쓴다.