ai-rules handbook 작업 명세

작업 명세

`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에서 수정/검증 완료:

  1. Cursor 채팅 미수집Resolve-SourceDirectory가 첫 매칭 1개만 반환 + 재귀 탐색 미지원
  2. Claude Code 미수집 — Cursor/Claude 소스가 같은 배열에 섞여 Cursor가 먼저 매칭되면 Claude 무시
  3. 한글 깨짐 — 터미널 로그 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 -RawGet-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