RohDongHyun

rohdonghyun.github.io

Quartz 5 기반 개인 지식 저장소. AI Agent 또는 웹(Pages CMS)에서 글을 작성해 바로 발행하는 흐름이 목적이다. 별도 초안(draft) 단계 없이 content/posts/에 쓰면 즉시 웹에 노출된다. 공개 전 검수가 필요하면 private: true로 두고(암호화된 채로 웹에서 확인) 준비되면 해제한다.

라이브 사이트: https://rohdonghyun.github.io

나는 누구인가

디렉토리 구조

content/
├── index.md          홈 페이지
├── images/           업로드 이미지 (Pages CMS가 여기에 저장, /images/* 로 서빙)
└── posts/            발행된 글 (사이트에 노출)
    ├── foundations/  카테고리: 학술 기초 지식
    ├── insights/     카테고리: 세미나·기사·글 신지식
    └── papers/       카테고리: 논문 요약
        └── <date>-<slug>.md
.pages.yml            Pages CMS 설정 (웹 편집·이미지 업로드)
quartz/               Quartz 5 엔진 (수정 금지)
quartz.config.yaml    사이트 설정 (수정 가능)
quartz.config.default.yaml  업스트림 기본값 참조용
scripts/build.mjs     배포 빌드 + 카테고리 강제 검증 / 비공개 글 암호화
.github/workflows/deploy.yml  Pages 자동 배포

카테고리와 태그

글 하나는 카테고리 1개(아래 3개 중 하나로 제한)와 태그(1개 이상, 값은 자유)를 가진다. scripts/build.mjs가 발행글(posts/)에 대해 빌드 시 “카테고리 폴더가 유효한지 + 태그가 1개 이상인지”를 강제하며, 위반 시 빌드가 실패한다. 태그 값 자체는 검증하지 않는다.

카테고리 (폴더로 표현, 정확히 1개)

글이 속한 폴더가 곧 카테고리다. 별도 frontmatter 필드는 없다. 어느 카테고리인지는 writer-agent가 글 내용으로 판단한다.

태그 (frontmatter tags, 1개 이상, 값 자유)

태그 값은 자유롭게 만들 수 있다(빌드가 값을 제한하지 않음). 다만 난립을 막기 위해 자주 쓰는 태그는 재사용한다. 대표 태그:

이 둘은 Pages CMS 태그 입력란에서 제안으로 뜬다. 필요하면 새 태그를 그 자리에서 입력하면 된다.

예: AI Agent에 관한 세미나 요약 글 → 카테고리 insights (= posts/insights/에 저장) / 태그 AI Agent.

카테고리(폴더) 목록을 늘리려면 이 문서, scripts/build.mjsCATEGORIES, .pages.yml의 컬렉션을 함께 수정한다. 태그는 자유 입력이라 코드 수정이 필요 없다.

글 작성 규칙

프론트매터 (필수)

---
title: 글 제목
date: 2026-06-04        # YYYY-MM-DD
tags:
  - AI Agent            # 1개 이상 (값 자유)
---

수식

마크다운 함정 (특히 외부 이전 글)

링크 포맷

글 작성 워크플로 (Subagent)

사용자의 요청은 주로 아래 4가지 유형이다. Main Agent는 유형을 판별해 자료 수집 → 작성 → 검토 순으로 위임한다.

요청 유형 자료 수집 에이전트 핵심 입력
(A) 논문 URL을 주고 상세 설명 요청 search-agent (mode: paper-deep-dive) arXiv/DOI/논문 URL
(B) 키워드를 주고 최신·임팩트 큰 논문 목록 요약 요청 search-agent (mode: paper-roundup) 키워드 + (선택) 기간/개수
(C) PPT/슬라이드 내용 요약 요청 ppt-agent PDF 절대 경로
(D) 키워드(특히 AI Agent)의 최신 trend 검색 요청 search-agent (mode: trend-scan) 키워드

절차:

  1. 자료 수집 — 위 표대로 필요한 에이전트만 (병렬 가능) 호출. (B)는 보통 papers 카테고리, (A)도 papers, (C)·(D)는 내용에 따라 insights.
  2. 작성writer-agent (수집 결과를 materials로 전달). 카테고리를 판단해 content/posts/<category>/YYYY-MM-DD-<slug>.md직접 작성. 공개 전 검수가 필요한 글이면 private: true를 넣는다.
  3. 검토·교정review-agent (작성된 posts/<category>/<file>.md를 직접 revise).
  4. Main은 최종 파일 경로(라이브 URL 포함)와 review의 변경 요약·의문점을 사용자에게 보고. 사용자는 웹에서 확인 후 필요하면 private를 해제하거나 직접 수정.

각 subagent의 도구 권한과 시스템 프롬프트는 .claude/agents/에서 관리한다.

웹 편집 (Pages CMS)

사람이 직접 쓸 때는 Pages CMS에서 웹으로 편집한다 (.pages.yml이 설정). 이미지를 본문에 붙여넣으면 content/images/에 커밋되고 /images/... 링크가 자동 삽입된다. 저장하면 main에 직접 커밋 → 자동 배포.

로컬 워크플로 (Windows PowerShell)

npm ci                       # 의존성 설치 (최초 1회 + lockfile 변경 시)
npx quartz plugin install    # 플러그인 설치 (최초 1회 + quartz.lock.json 변경 시)
npx quartz build --serve     # 로컬 미리보기 (http://localhost:8080) — 비공개 글은 평문으로 보임
npm run build                # 배포용 빌드 (public/ 생성, 비공개 글 암호화)

public/node_modules/, .quartz/, .env.gitignore 적용.

비공개 글

frontmatter에 private: true를 추가하면 본문이 AES-256-GCM으로 빌드 시 암호화된다. 제목/태그/링크는 listings·RSS·sitemap에 그대로 노출되고 본문만 잠긴다.

---
title: 비공개 메모
date: 2026-06-05
tags:
  - note
private: true
---

비밀번호는 환경변수 PRIVATE_POSTS_PASSWORD에서 읽는다. 글의 frontmatter에는 비밀번호를 적지 않는다 (공개 repo에 새는 것 방지).

npm run build가 호출되면 scripts/build.mjscontent/를 OS 임시 디렉토리에 복제하고 private: true 글의 frontmatter에 password:를 주입한 뒤 quartz에 그 디렉토리를 빌드시킨다. 원본 content/는 절대 수정되지 않는다.

브라우저에서 비공개 글에 접근하면 비밀번호 입력 UI가 뜨고, 한 번 입력하면 localStorage에 캐싱되어 동일 비밀번호의 다른 비공개 글도 자동 해제된다. 우하단의 🔒 로그아웃 버튼으로 캐시를 비울 수 있다 (콘솔에서 privateLogout() 호출과 동등).

배포

main 브랜치에 push → GitHub Actions가 npm ciquartz plugin installnpm run buildpublic/을 GitHub Pages로 업로드.

Settings → Pages 의 Source는 GitHub Actions여야 한다 (Deploy from branch가 아님).

Phase 2 로드맵 (현재 미구현)

자동 발행 파이프라인은 다음 작업이 끝나야 동작한다:

  1. scripts/fetch_arxiv.py — arXiv API에서 지정 카테고리(cs.LG, cs.AI 등)의 최근 논문 메타데이터를 가져온다.
  2. scripts/summarize.py — Claude API로 논문 PDF/abstract를 요약해 Markdown으로 변환.
  3. 결과물을 content/posts/<category>/YYYY-MM-DD-<slug>.md 로 저장 (검수 전이면 private: true).
  4. .github/workflows/auto-draft.ymlschedule: cron으로 매일 1회 실행, 생성된 글을 PR로 올린다. (직접 push 금지 — 검수 단계 강제)
  5. 사람이 PR을 검토하고 머지 (필요 시 private 해제).

Anthropic API 키는 GitHub Secrets ANTHROPIC_API_KEY로 보관 예정.

Quartz 5 관련 메모