본문 바로가기
프로그램 (PHP,Python)

Cursor AI Chat 개발 히스토리를 프로젝트 Markdown 문서로 자동 기록

by 날으는물고기 2025. 9. 11.

Cursor AI Chat 개발 히스토리를 프로젝트 Markdown 문서로 자동 기록

728x90

목표와 원칙

  1. 프로젝트 루트에 Markdown 저장: ./docs/chat/ 또는 ./chat/ 하위에 저장
  2. 간편/자동/무정지: 한 번 셋업 후 단축키 1번 또는 주기적 자동화
  3. 보안 안전장치: 민감정보 마스킹, Git 유출 방지, 접근권한·암호화 선택지

기본 구조(권장 폴더)

<your-project>/
├─ chat/                 # 채팅 로그 폴더(리포트/롤업 파일)
│  ├─ chat-history.md    # 누적 파일(append)
│  └─ 2025-09-10.md      # 날짜별 리포트(선택)
├─ .gitignore
├─ .gitattributes        # (선택) git-crypt/sops 등
└─ tools/                # 스크립트 모음
   ├─ append-clipboard.js
   ├─ redact.conf        # 마스킹 패턴
   ├─ rollup.py
   └─ pre-commit.sh

최소노력(수동+템플릿) — 바로 시작하기

  • 대화 중 마무리 프롬프트
    “지금까지 대화를 Markdown 회의록 템플릿(Context/Decisions/Snippets/Next)으로 요약해줘. 코드/명령은 fenced code block으로.”
  • 받은 결과를 chat/chat-history.md붙여넣기(append)
  • 장점: 설정 없이 바로 가능
  • 한계: 완전 자동은 아님 → 아래 “반자동/자동”을 권장
300x250

반자동(강추) — “단축키 한 번”으로 클립보드 → 파일 Append

아이디어: Chat 패널에서 Ctrl/Cmd+A → 복사 후 단축키 1번 → chat-history.md에 자동 추가

1) 공통 Node.js 스크립트 (OS 공용)

tools/append-clipboard.js

#!/usr/bin/env node
// npm i clipboardy fs-extra
import clipboard from 'clipboardy';
import fs from 'fs-extra';
import path from 'path';

const root = process.cwd();
const outDir = path.join(root, 'chat');
const outFile = path.join(outDir, 'chat-history.md');

await fs.ensureDir(outDir);

const text = await clipboard.read();
if (!text || !text.trim()) {
  console.error('Clipboard is empty.');
  process.exit(1);
}

// 간단 마스킹(토큰/시크릿/이메일 등은 필요시 추가 확장)
const masked = text
  .replace(/(AKIA|ASIA|AIza|ghp_)[0-9A-Za-z\-\_]+/g, '[REDACTED]')
  .replace(/(secret|token|apikey|password)\s*[:=]\s*\S+/gi, '$1: [REDACTED]')
  .replace(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/gi, '[EMAIL]');

const now = new Date().toISOString();
const block = `\n\n---\n**Saved:** ${now}\n\n${masked}\n`;

await fs.appendFile(outFile, block, 'utf8');
console.log(`Appended to ${path.relative(root, outFile)}`);
  • 준비
    cd <your-project>
    mkdir -p chat tools
    npm init -y
    npm i clipboardy fs-extra
    chmod +x tools/append-clipboard.js
  • package.json에 스크립트 추가
    {
      "scripts": {
        "save:chat": "node tools/append-clipboard.js"
      }
    }
  • 사용 흐름
    1. Cursor Chat 창에서 전체 선택 → 복사
    2. 터미널에서 npm run save:chat 실행 → chat/chat-history.md에 자동 Append

2) OS별 단축키 등록

  • macOS (Hammerspoon): ~/.hammerspoon/init.lua
    -- 클립보드 → chat-history.md append
    hs.hotkey.bind({"alt", "cmd"}, "S", function()
      local project = hs.execute("pwd"):gsub("%s+$","")
      hs.alert.show("Saving chat...")
      hs.execute("cd '"..project.."' && npm run save:chat")
    end)
  • Windows (AutoHotkey v2): 예: Ctrl+Alt+S
    ^!s::
    RunWait "cmd /c npm run save:chat", A_WorkingDir, "Hide"
    MsgBox "Chat appended."
    return
  • Linux (sxhkd 예시): Ctrl+Alt+S
    ctrl + alt + s
      npm run save:chat

이렇게 설정하면 “복사 → 단축키 1번”으로 즉시 파일 기록됩니다.
추후 선택 영역만 기록하고 싶다면 Chat 일부만 복사한 뒤 같은 단축키를 누르세요.

완전 자동(선택) — “하루 한 번 롤업 & 정리”

1) 일일 리포트로 쪼개 저장(rollup)

tools/rollup.py

import os, re, hashlib
from datetime import datetime, timezone, timedelta
KST = timezone(timedelta(hours=9))
root = os.getcwd()
src = os.path.join(root, "chat", "chat-history.md")
dst_dir = os.path.join(root, "chat")
os.makedirs(dst_dir, exist_ok=True)
today = datetime.now(KST).strftime("%Y-%m-%d")
dst = os.path.join(dst_dir, f"{today}.md")

def dedup_blocks(text: str):
    blocks = re.split(r'\n-{3,}\n', text)  # --- 구분선 기준
    seen = set()
    out = []
    for b in blocks:
        sig = hashlib.sha256(b.strip().encode('utf-8')).hexdigest()[:16]
        if sig not in seen and b.strip():
            seen.add(sig)
            out.append(b.strip())
    return "\n\n---\n".join(out)

if os.path.exists(src):
    with open(src, "r", encoding="utf-8") as f:
        data = f.read()
    clean = dedup_blocks(data)
    with open(dst, "w", encoding="utf-8") as f:
        f.write(f"# Chat Log {today}\n\n")
        f.write(clean if clean.strip() else "_no content_\n")
    print(f"Rolled up to {dst}")
else:
    print("No chat-history.md yet.")
  • 크론 등록(예: 매일 21:00 KST)
    • macOS/Linux (crontab -e)
      0 21 * * * cd /path/to/your-project && /usr/bin/python3 tools/rollup.py
    • Windows(작업 스케줄러)에서 python 실행으로 동일하게 등록

2) “섹션 자동 서식” 팁(프롬프트 템플릿)

  • 매일 마지막 대화에 아래를 붙여주세요.
    “오늘 대화를 아래 섹션으로 요약해줘:
    **Context & Goal**
    **Key Decisions**
    **Commands & Code**(fenced code)
    **Risks/Security**
    **Next Actions(담당/기한)**”

→ 저장된 YYYY-MM-DD.md바로 공유 가능한 리포트가 됩니다.

보안 가이드 & 점검 포인트

  1. 민감정보 마스킹(필수)
    • 토큰/비밀번호/API키/쿠키/세션ID/내부 도메인 등은 저장 전 마스킹
    • append-clipboard.js의 정규식 패턴을 회사 표준으로 강화
    • 별도 tools/redact.conf에 패턴 목록을 관리(리뷰 가능)
  2. Git 유출 방지
    • .gitignore에 추가
      chat/chat-history.md
      chat/*.md
    • 또는 저장은 하되 암호화
      • git-crypt / sops + .gitattributeschat/** filter=crypt
      • 리포의 권한/키 관리를 준비했을 때만 적용
  3. 접근 통제
    • 프로젝트 디렉터리 권한(Unix 750/770 수준) 및 노트북 암호/보안 솔루션
    • 백업 저장소에도 동일한 암호화/권한 정책 적용
  4. 보존/파기 정책
    • 저장 기간, 열람 대상, 파기 절차를 내부 규정화
    • rollup.py보관 기간 초과 파일 자동 삭제 옵션 추가 가능
  5. 감사 가능성 확보
    • 파일 헤더에 작성자/시각/Branch/Commit 기록
      echo "**Author:** $USER  **Branch:** $(git rev-parse --abbrev-ref HEAD)  **Commit:** $(git rev-parse --short HEAD)" >> chat/chat-history.md

고급(선택) — 로컬 캐시/DB 파싱 기반 자동화(실험)

IDE 내부 캐시(예: AppData/Library/.config 하위)에 대화 스니펫이 저장될 수 있으나, 버전마다 포맷/경로가 바뀌고 공식 API가 없음. 운영 환경에서 쓰려면 샌드박스에서 검증하세요.

  • 접근 절차(안전 모드)
    1. 해당 App Support 디렉터리를 복사본으로 스냅샷
    2. ripgrep/jq/sqlite3“대화 키워드/문서 구조” 탐색
    3. 구조가 확인되면 읽기 전용 파서 작성 → chat-history.md로 변환
  • 리스크: 업데이트 시 파손 위험, 포맷 변경 가능성, 라이선스/정책 고려 필요

일반적으로는 클립보드 append 방식(2번)이 가장 안정적입니다.

운영 체크리스트

  1. 단축키 동작 점검: 복사 → 단축키 → chat/chat-history.md에 Append
  2. 마스킹 규칙 테스트: 의도한 민감정보가 [REDACTED] 처리되는지
  3. Git 정책 확인: .gitignore/암호화 정책 충돌 여부
  4. 일일 롤업 확인: YYYY-MM-DD.md 생성 및 중복 제거 작동
  5. 백업/복구: 로컬/원격 백업 및 복구 절차 문서화
  6. 보안 점검: 접근권한, 로그 보존기간, 파기 정책 정기 점검

부가 스니펫 모음

1) .gitignore (유출 방지 기본형)

# Chat logs
chat/chat-history.md
chat/*.md

2) pre-commit 훅(실수 방지)

tools/pre-commit.sh

#!/usr/bin/env bash
if git diff --cached --name-only | grep -E '^chat/.*\.md$' > /dev/null; then
  echo "[BLOCK] chat/*.md 커밋이 차단되었습니다. (보안 정책)"
  exit 1
fi

설치

chmod +x tools/pre-commit.sh
ln -sf ../../tools/pre-commit.sh .git/hooks/pre-commit

3) 일괄 마스킹 강화(예: 회사 표준 패턴 추가)

append-clipboard.jsmasked 체인에 예를 더합니다.

  .replace(/\b\d{2,3}-\d{3,4}-\d{4}\b/g, '[PHONE]')
  .replace(/\b(10\.0\.\d+\.\d+|192\.168\.\d+\.\d+)\b/g, '[PRIVATE_IP]')
  .replace(/\b[a-f0-9]{32}\b/gi, '[MD5?]')

권장 시나리오

  • 단기: “복사 → 단축키 → Append” (2번)로 바로 운영 시작
  • 중기: 일일 롤업(3번) 추가로 날짜별 관리 & 공유 편의 확보
  • 상시: 마스킹/유출방지/권한/보존정책(4번)을 정책 문서화하고 정기 점검
728x90
그리드형(광고전용)

댓글