기술 문서 URL, 텍스트, 또는 로컬 PDF 파일 → 번역/정리 → env.config 의 ARTICLE_DIR 을 참고해서 obsidian 문서 생성
기술 문서 URL, 텍스트, 또는 로컬 PDF 파일을 받아 백그라운드로 번역/정리하여 Obsidian 문서를 생성합니다.
$ARGUMENTS를 순서대로 확인한다:
http:// 또는 https://로 시작하면 → URL 모드.pdf로 끝남 (대소문자 무관) 또는 file://로 시작하면 → PDF 모드텍스트 모드에서 $ARGUMENTS가 200자 미만이면 경고를 출력한다:
⚠️ 입력 텍스트가 200자 미만입니다. URL을 입력하려 했다면 'http://' 또는 'https://'로 시작해야 합니다.
경고 출력 후에도 처리는 계속 진행한다.
이 스킬이 직접 호출된 경우 (사용자가 메인 세션에서 /obsidian:summarize-article URL 또는 텍스트 실행): → 백그라운드 모드로 실행
이 스킬이 subagent 내부에서 호출된 경우 (batch-summarize-urls 등): → 로 실행
반드시 Read 도구로 /Users/jdragon/my-daily-assistant/env.config 파일을 읽은 뒤 OBSIDIAN_VAULT, ARTICLE_DIR, ATTACHMENT_DIR 값을 추출한다.
ENV_CONFIG="/Users/jdragon/my-daily-assistant/env.config"
OBSIDIAN_VAULT=$(grep '^OBSIDIAN_VAULT=' "$ENV_CONFIG" | cut -d'=' -f2-)
ARTICLE_DIR=$(grep '^ARTICLE_DIR=' "$ENV_CONFIG" | cut -d'=' -f2-)
ATTACHMENT_DIR=$(grep '^ATTACHMENT_DIR=' "$ENV_CONFIG" | cut -d'=' -f2-)
# 최종 저장 디렉토리
ARTICLE_OUTPUT_DIR="${OBSIDIAN_VAULT}${ARTICLE_DIR}"
ATTACHMENT_OUTPUT_DIR="${OBSIDIAN_VAULT}${ATTACHMENT_DIR}"
이후 모든 단계에서 위 변수들을 사용한다.
.claude/article-progress/ 디렉토리에 진행 상황 파일을 생성합니다.
URL 모드 파일명: YYYYMMDD-HHMMSS-{url-slug}.json
{
"url": "$ARGUMENTS",
"type": "article",
"status": "processing",
"started_at": "현재시간 ISO-8601",
"completed_at": null,
"output_file": null,
"error": null
}
텍스트 모드 파일명: YYYYMMDD-HHMMSS-text-{앞 30자 alphanumeric}.json
{
"input": "text",
"type": "article",
"status": "processing",
"started_at": "현재시간 ISO-8601",
"completed_at": null,
"output_file": null,
"error": null
}
PDF 모드 파일명: YYYYMMDD-HHMMSS-pdf-{파일명-stem-30자}.json
{
"file": "$ARGUMENTS",
"type": "article",
"status": "processing",
"started_at": "현재시간 ISO-8601",
"completed_at": null,
"output_file": null,
"error": null
}
Task tool을 사용하여 백그라운드 subagent를 시작합니다:
subagent_type: "general-purpose"run_in_background: truedescription: "Summarize: {URL 도메인/경로 일부}"description: "Summarize text: {텍스트 앞 30자}"description: "Summarize PDF: {파일명 without extension}"prompt: 아래 동기 모드 프로세스 전체를 포함하되, 다음을 추가:
$ARGUMENTS 전체 텍스트를 prompt에 포함하여 전달URL 모드:
백그라운드 작업 시작됨:
- URL: $ARGUMENTS
- Progress: .claude/article-progress/{파일명}.json
- 완료되면 자동으로 알려드립니다.
텍스트 모드:
백그라운드 작업 시작됨:
- 입력: 텍스트 ({글자수}자)
- Progress: .claude/article-progress/{파일명}.json
- 완료되면 자동으로 알려드립니다.
PDF 모드:
백그라운드 작업 시작됨:
- PDF: $ARGUMENTS
- Progress: .claude/article-progress/{파일명}.json
- 완료되면 자동으로 알려드립니다.
URL 모드: WebFetch 도구로 URL에 접근하여 콘텐츠를 추출합니다.
$ARGUMENTSfailed로 업데이트)WebFetch 결과에서 다음을 파악한다:
본문이 200자 미만이면 로그인 wall 또는 접근 제한 가능성이 있으므로 사용자에게 안내한다.
PDF 모드: Read 도구로 PDF 파일을 직접 읽어 콘텐츠를 추출한다.
test -f "$ARGUMENTS" 로 파일 존재 여부 확인. 없으면 progress 파일을 failed로 업데이트하고 중단pages: "1-10" → pages: "11-20" → pages: "21-30" → ...-와 _를 공백으로 치환failed로 업데이트 후 중단텍스트 모드: WebFetch를 스킵하고 다음을 설정한다.
# 마크다운 헤딩을 추출. 없으면 첫 문장(최대 80자)을 title로 사용$ARGUMENTS 전체 텍스트추출된 콘텐츠를 아래 규칙(## 문서 번역 및 요약 규칙)에 따라 정리하여 yaml frontmatter를 포함한 obsidian 파일로 저장합니다.
$OBSIDIAN_VAULT/$ARTICLE_DIR/YYYY-MM-DD {문서제목}.md
date +%Y-%m-%d 값 사용2026-03-16 10 Essential Software Design Patterns.mdmkdir -p "$ARTICLE_OUTPUT_DIR"~/.claude/commands/obsidian/add-tag.md 준수텍스트 모드인 경우 이 단계를 완전히 스킵한다.
URL 모드: WebFetch 결과에 이미지 URL이 포함된 경우, ATTACHMENTS 폴더에 저장하고 Obsidian 문서에 포함시킵니다.
$OBSIDIAN_VAULT/$ATTACHMENT_DIR/WebFetch 결과에서  패턴으로 이미지 URL 목록을 수집한다.
gravatar, avatar, favicon, icon, logo, badge, tracking, pixel, analyticspng, jpg, jpeg, gif, webp, svg, avif{YYYYMMDD}-{article-title-slug-30자}-{NN}.{ext}
curl -sL --max-time 15 --max-filesize 10485760 \
-o "$ATTACHMENT_OUTPUT_DIR/{filename}" "{image_url}"
다운로드된 이미지가 0개면 이미지 임베딩을 스킵한다.
각 이미지의 내용과 요약 본문의 챕터(### 소제목)를 대조하여, 해당 이미지가 설명하는 내용과 가장 관련 깊은 챕터의 끝에 인라인으로 배치한다.
어느 챕터에도 명확히 매칭되지 않는 이미지는 문서 끝에 ## 참고 이미지 섹션을 만들어 배치한다.
매칭되지 않는 이미지가 없으면 ## 참고 이미지 섹션을 생략한다.
PDF 모드: extract_pdf_images.py 스크립트로 PDF에서 이미지를 추출한 뒤, 관련성 필터링을 거쳐 선별된 이미지만 Obsidian 문서에 포함시킨다.
python3 /Users/jdragon/my-daily-assistant/.claude/commands/obsidian/extract_pdf_images.py \
--pdf "$ARGUMENTS" \
--output-dir "$ATTACHMENT_OUTPUT_DIR" \
--prefix "{YYYYMMDD}-{pdf-title-slug-30자}" \
--min-size 5120 \
--max-images 20
images 배열로 저장된 파일명 목록을 얻는다추출된 각 이미지 파일을 Read 도구로 열어 시각적으로 확인한다. 다음 기준으로 관련 이미지만 선별:
포함 대상 (요약 내용을 보충하는 이미지):
제외 대상:
선별되지 않은 이미지는 ATTACHMENTS 폴더에서 삭제한다:
rm -f "$ATTACHMENT_OUTPUT_DIR/{제외된-파일명}"
선별된 이미지가 0개면 이미지 임베딩을 스킵한다.
각 이미지를 Read 도구로 확인한 내용과 요약 본문의 챕터(### 소제목)를 대조하여, 해당 이미지가 설명하는 내용과 가장 관련 깊은 챕터의 끝에 인라인으로 배치한다.
어느 챕터에도 명확히 매칭되지 않는 이미지는 문서 끝에 ## 참고 이미지 섹션을 만들어 배치한다.
매칭되지 않는 이미지가 없으면 ## 참고 이미지 섹션을 생략한다.
progress 파일 경로가 전달된 경우, 작업 완료/실패 시 업데이트합니다:
성공 시:
{
"url": "...",
"type": "article",
"status": "completed",
"started_at": "...",
"completed_at": "현재시간 ISO-8601",
"output_file": "001_Inbox/문서제목.md",
"error": null
}
실패 시:
{
"url": "...",
"type": "article",
"status": "failed",
"started_at": "...",
"completed_at": "현재시간 ISO-8601",
"output_file": null,
"error": "에러 메시지"
}