작업 명세
`scripts/export_ai_logs.ps1` 원본(ai-rules)에 3가지 버그가 있어 AITEM에서 수정/검증 완료:
issues docs/issues/AI_LOGS_V2_UPGRADE.md
AITEM 프로젝트에서 검증 완료된 개선사항을 ai-rules 원본에 반영하고, Obsidian 연동 + 스케줄러 자동화를 추가하는 작업.
배경
scripts/export_ai_logs.ps1 원본(ai-rules)에 3가지 버그가 있어 AITEM에서 수정/검증 완료:
- Cursor 채팅 미수집 —
Resolve-SourceDirectory가 첫 매칭 1개만 반환 + 재귀 탐색 미지원 - Claude Code 미수집 — Cursor/Claude 소스가 같은 배열에 섞여 Cursor가 먼저 매칭되면 Claude 무시
- 한글 깨짐 — 터미널 로그
Get-Content -Raw에-Encoding UTF8누락
Task 1: export_ai_logs.ps1 원본 업그레이드
검증 완료된 수정 사항 (AITEM에서 테스트 완료)
참조: D:\dev\AITEM\scripts\export_ai_logs.ps1 (419줄, 수정 후 버전)
1-A. 소스 수집 분리 (핵심 변경)
기존 $transcriptCandidates 통합 배열 + Resolve-SourceDirectory 단일 반환 구조를 제거하고,
3개 소스를 독립 루프로 분리:
(A) Cursor agent-transcripts — -Recurse로 subagents/ 하위까지 탐색
(B) Claude Code sessions — ~/.claude/projects/{slug}/*.jsonl
(C) Cursor terminals — claude 명령 포함 터미널만 필터
$exportedNames해시로 프로젝트 디렉토리 간 중복 제거- 파일명 prefix:
cursor-,claude-,terminal- - Type 라벨:
cursor-chat,claude-code,terminal
1-B. Convert-CursorJsonlToMarkdown 수정
Cursor JSONL message 필드가 문자열이 아닌 {content: [{type, text}]} 객체 구조.
기존 코드는 문자열로 가정해서 AppendLine 에러 발생.
변경:
role+message필드 기반 필터링 (type/role/sender순회 →role직접 확인)message.content배열에서type === "text"블록만 추출 (Claude Code와 동일 구조)- 헤더에
> Last active: {파일 수정일}추가
1-C. Convert-ClaudeCodeJsonl 타임스탬프 추가
Claude Code JSONL에는 메시지별 timestamp 필드(ISO 8601 UTC)가 있음.
UTC → KST 변환하여 역할 라벨 옆에 표시:
**[User]** _2026-03-21 19:23:26_
1-D. 터미널 claude 필터 + 인코딩
Get-Content -Raw→Get-Content -Raw -Encoding UTF8$content -notmatch '(?m)^\s*claude\b'이면 스킵
1-E. INDEX.md 소스 표시
3개 소스 각각 표시:
- Cursor chat: {paths}
- Claude Code: {paths}
- Terminal (claude only): {paths}
Task 2: Obsidian Vault 연동 래퍼 스크립트
목적
여러 프로젝트의 AI 로그를 Obsidian vault에 프로젝트별/날짜별로 자동 수집.
출력 구조
{ObsidianVault}/AI-Log/
├── {ProjectName}/
│ ├── INDEX.md
│ ├── YYYY-MM-DD/
│ │ ├── cursor-{uuid}.md
│ │ ├── claude-{uuid}.md
│ │ └── terminal-{n}.txt
│ └── YYYY-MM-DD/
│ └── ...
└── {AnotherProject}/
└── ...
래퍼 스크립트 설계: scripts/ai-logs-daily.ps1
param(
[string]$VaultRoot = "D:\Obsidian Vault\AI-Log", # 설정 파일에서 읽기
[string[]]$Projects = @() # 빈 배열이면 설정 파일에서 읽기
)
# 설정 파일: ~/.ai-rules/ai-logs-config.json
# {
# "vaultRoot": "D:\\Obsidian Vault\\AI-Log",
# "projects": [
# { "name": "AITEM", "repoRoot": "D:\\dev\\AITEM" },
# { "name": "AX-Studio", "repoRoot": "D:\\dev\\AX-Studio" }
# ],
# "timezone": "Asia/Seoul",
# "schedule": "09:00"
# }
$today = Get-Date -Format "yyyy-MM-dd"
foreach ($project in $projects) {
$destDir = Join-Path $VaultRoot "$($project.name)\$today"
$indexPath = Join-Path $VaultRoot "$($project.name)\INDEX.md"
# 프로젝트 루트에서 export_ai_logs.ps1 실행
# -DestinationDir → Obsidian 날짜 폴더
# -IndexPath → 프로젝트 INDEX.md (누적)
}
설정 파일 위치
~/.ai-rules/ai-logs-config.json — 프로젝트/vault 경로는 머신별 설정이므로 git 밖에 저장.
Task 3: Windows 작업 스케줄러 등록
등록 스크립트: scripts/setup-ai-logs-scheduler.ps1
# 관리자 권한 필요
$action = New-ScheduledTaskAction `
-Execute "powershell.exe" `
-Argument "-ExecutionPolicy Bypass -File {ai-rules-path}\scripts\ai-logs-daily.ps1"
$trigger = New-ScheduledTaskTrigger -Daily -At 9:00AM
Register-ScheduledTask -TaskName "AI-Logs-Daily-Export" `
-Action $action -Trigger $trigger `
-Description "AI conversation logs daily export to Obsidian"
해제
Unregister-ScheduledTask -TaskName "AI-Logs-Daily-Export" -Confirm:$false
Task 4: 문서 업데이트
수정 대상
| 파일 | 변경 내용 |
|---|---|
ai_logs/README.md |
3개 소스 설명, Obsidian 연동 안내, 스케줄러 등록 방법 추가 |
docs/guide/AI_LOG_AUTOMATION_MODEL.md |
실제 구현 상태 반영 (설계→구현 완료) |
구현 순서
1. export_ai_logs.ps1 원본 업그레이드 (Task 1) — AITEM 수정본 반영
2. ai-logs-daily.ps1 래퍼 스크립트 생성 (Task 2)
3. ai-logs-config.json 스키마 + 예시 (Task 2)
4. setup-ai-logs-scheduler.ps1 생성 (Task 3)
5. 문서 업데이트 (Task 4)
6. AITEM에서 E2E 테스트 (Obsidian vault에 실제 출력 확인)
검증 체크리스트
-
npm run ai:logs— 프로젝트 내 수집 정상 (기존 동작 유지) -
ai-logs-daily.ps1— Obsidian vault에 프로젝트별/날짜별 출력 - Cursor 채팅
.md— 서브에이전트 포함, 한글 정상 - Claude Code
.md— 메시지별 KST 타임스탬프 표시 - 터미널 — claude 명령 포함 파일만 수집
- 중복 파일 없음 (
$exportedNames해시 동작) - INDEX.md — 3개 소스 경로 + 로그 목록 정상
- 스케줄러 — 매일 9시 자동 실행 확인
참조 파일
- AITEM 수정 완료본:
D:\dev\AITEM\scripts\export_ai_logs.ps1 - ai-rules 원본:
D:\dev\ai-rules\scripts\export_ai_logs.ps1 - 설계 모델:
D:\dev\ai-rules\docs\guide\AI_LOG_AUTOMATION_MODEL.md - ai-rules README:
D:\dev\ai-rules\ai_logs\README.md