Help us improve
Share bugs, ideas, or general feedback.
From sr-obsidian
오늘 데일리 노트를 생성한다. GitHub Issue → Feature 브랜치 → 노트 작성 → 커밋 → PR 전 과정 자동화. 파일이 이미 있으면 갱신 모드(미완 이슈 갱신)로 전환. Keywords: 데일리, daily, 오늘 노트, 일일 노트, 작업 로그, 갱신.
npx claudepluginhub seokrae/sr-obsidian --plugin sr-obsidianHow this skill is triggered — by the user, by Claude, or both
Slash command
/sr-obsidian:dailyThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
```
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
Applies a firm's KYC/AML rules grid to parsed onboarding records: assigns risk rating, checks required documents, outputs rule outcomes with citations, and routes for escalation.
Designs test strategies and plans with testing pyramid. Covers APIs, frontend, data pipelines, infrastructure; outputs plans including coverage targets, examples, and gaps.
Share bugs, ideas, or general feedback.
/daily # 오늘 날짜 기준 데일리 노트 생성 or 갱신
/daily 2026-04-01 # 특정 날짜 지정 (YYYY-MM-DD)
$ARGUMENTS가 있으면 해당 날짜 사용 (형식: YYYY-MM-DD)date +%Y-%m-%ddate -j -f "%Y-%m-%d" "{날짜}" +%a (예: Mon, Tue, Wed, Thu, Fri, Sat, Sun)YYYY, MM (예: 2026, 04)60-logs/daily/{YYYY}/{MM}/{YYYY-MM-DD}.md60-logs/daily/{YYYY}/{MM}/{YYYY-MM-DD}.md 존재 여부 확인:
오늘 갱신용으로 생성한 이슈(데일리 노트 자체 이슈)와 docs: YYYY-MM-DD 데일리 노트 작성/갱신 패턴의 이슈는 모두 제외한다.
각 이슈의 본문에서 ## 범위, ## 작업 범위, ## 작업 내용, ## 변경사항, ## 구현 내용, ## 체크리스트, ## Changes, ## 산출물 섹션의 bullet 항목을 추출해 계층형 sub-bullet으로 출력한다.
python3 - <<'PYEOF'
import subprocess, json, re
TARGET_SECTIONS = {
'범위', '작업 범위', '작업 내용', '변경사항', '구현 내용',
'체크리스트', 'Changes', '산출물'
}
DAILY_SKIP = re.compile(r'^docs: \d{4}-\d{2}-\d{2} 데일리 노트')
result = subprocess.run(
['gh', 'issue', 'list', '--repo', 'SeokRae/knowledge-labs',
'--state', 'open', '--limit', '20', '--json', 'number,title'],
capture_output=True, text=True
)
issues = json.loads(result.stdout)
for issue in issues:
num = issue['number']
title = issue['title']
if DAILY_SKIP.match(title):
continue
print(f"- [ ] #{num} — {title}")
body_result = subprocess.run(
['gh', 'issue', 'view', str(num), '--repo', 'SeokRae/knowledge-labs',
'--json', 'body'],
capture_output=True, text=True
)
body = json.loads(body_result.stdout).get('body', '')
in_section = False
in_code = False
for line in body.splitlines():
if line.strip().startswith('```'):
in_code = not in_code
continue
if in_code:
continue
h = re.match(r'^## (.+)', line)
if h:
in_section = h.group(1).strip() in TARGET_SECTIONS
elif in_section:
stripped = line.strip()
if re.match(r'^[-*] ', stripped) or re.match(r'^- \[', stripped):
print(f" {stripped}")
PYEOF
결과를 {OPEN_ISSUES_WITH_STEPS}로 저장한다.
git branch --show-current
현재 브랜치가 feature/*-daily-{YYYY-MM-DD} 형식이면 → 그대로 사용
아니면 → 새 Issue + 브랜치 생성 후 진행
gh issue create --repo SeokRae/knowledge-labs \
--title "docs: {YYYY-MM-DD} 데일리 노트 갱신" \
--body "- 미완 작업(GitHub Issues) 섹션 갱신\n- 파일: 60-logs/daily/{YYYY}/{MM}/{YYYY-MM-DD}.md"
git checkout -b feature/{ISSUE_NUMBER}-daily-{YYYY-MM-DD}-update
절대 전체 교체 금지. 기존 이슈 항목의 상세 sub-bullet(주제/목적/문제현황/해결방안/미결 등)은 반드시 보존한다.
처리 방식:
## 미완 작업 (GitHub Issues) 섹션의 첫 번째 항목으로 삽입 (Edit 사용)신규 이슈가 없으면 이 단계를 건너뛴다.
작업 로그 섹션이 - [ ] placeholder 상태일 때만 실행한다. 이미 기록이 있으면 건너뛴다.
# 오늘 자정 이후 커밋 수집 (merge 커밋 제외)
git -C /Users/sr/obsidian/sr-labs log \
--since="$(date +%Y-%m-%d) 00:00:00" \
--oneline --no-merges 2>/dev/null | head -10
출력된 커밋 메시지에서 #NNNN PR 번호를 추출해 아래 형식으로 변환,
작업 로그 섹션의 - [ ] placeholder 한 줄을 Edit로 교체한다.
- [x] {커밋 메시지 요약} (PR #{번호})
제외 패턴: docs: {YYYY-MM-DD} 데일리 노트 (데일리 노트 자체 커밋)
커밋이 없으면 이 단계를 건너뛴다.
git add 60-logs/daily/{YYYY}/{MM}/{YYYY-MM-DD}.md
git commit -m "docs: {YYYY-MM-DD} 데일리 노트 갱신 (#{ISSUE_NUMBER})"
git push origin {현재_브랜치}
✅ {YYYY-MM-DD} 데일리 노트 갱신 완료
파일 : 60-logs/daily/{YYYY}/{MM}/{YYYY-MM-DD}.md
Branch: {브랜치명}
같은 달 폴더에서 오늘 이전 파일 중 가장 최근 파일을 찾는다:
ls 60-logs/daily/{YYYY}/{MM}/*.md 2>/dev/null \
| grep -v "{YYYY-MM-DD}" | sort | tail -1
없으면 이전 달 폴더도 확인:
PREV_YM=$(date -j -f "%Y-%m-%d" "{YYYY-MM-DD}" -v-1m "+%Y/%m")
ls 60-logs/daily/$PREV_YM/*.md 2>/dev/null | sort | tail -1
이전 노트가 있으면 ## 목표, ## 작업 로그, ## 미완 작업 섹션에서 ^- \[ \] 항목을 추출한다.
단, docs: YYYY-MM-DD 데일리 노트 작성/갱신 패턴의 이슈는 이월하지 않는다.
추출 후 최근 30개 데일리 노트에서 이슈별 이월 횟수를 카운트해 각 항목에 태그를 붙인다:
python3 - <<'EOF'
import re, glob
text = open("{PREV_NOTE_PATH}").read()
sections = ["목표", "작업 로그", "미완 작업 (GitHub Issues)"]
DAILY_SKIP = re.compile(r'— docs: \d{4}-\d{2}-\d{2} 데일리 노트')
results = []
current = None
for line in text.splitlines():
h = re.match(r'^## (.+)', line)
if h:
current = h.group(1)
elif current and any(s in current for s in sections):
if line.startswith("- [ ]") and not DAILY_SKIP.search(line):
results.append(line)
# 최근 30개 노트에서 이슈별 등장 횟수 카운트
recent_files = sorted(glob.glob("60-logs/daily/**/*.md", recursive=True))[-30:]
issue_counts = {}
for f in recent_files:
try:
content = open(f).read()
except:
continue
for line in content.splitlines():
if line.startswith("- [ ]") and not DAILY_SKIP.search(line):
for num in re.findall(r'#(\d+)', line):
issue_counts[num] = issue_counts.get(num, 0) + 1
# 이월 횟수 태그 추가
for item in results:
nums = re.findall(r'#(\d+)', item)
count = max((issue_counts.get(n, 0) for n in nums), default=0)
if count >= 3:
print(f"{item} ({count}회 이월) ⚠️ 재검토")
elif count >= 1:
print(f"{item} ({count}회 이월)")
else:
print(item)
EOF
추출 결과를 {CARRIED_ITEMS}로 저장한다. 없으면 빈 문자열.
{CARRIED_ITEMS} 에서 이월 횟수 내림차순 상위 2개를 선택해 {GOAL_ITEMS}로 저장한다.
이월 항목이 없으면 {GOAL_ITEMS} = - [ ] (빈 항목).
선택 규칙:
(\d+)회 이월 패턴⚠️ 재검토 태그 항목 → 제목 뒤에 (재검토 or 폐쇄 결정) 주석 추가{GOAL_ITEMS}에서 제외 (미완 작업 섹션엔 전부 포함)gh issue create \
--repo SeokRae/knowledge-labs \
--title "docs: {YYYY-MM-DD} 데일리 노트 작성" \
--body "## Summary\n- {YYYY-MM-DD} ({요일}) 데일리 노트 생성\n- 파일: \`60-logs/daily/{YYYY}/{MM}/{YYYY-MM-DD}.md\`"
반환된 Issue 번호를 {ISSUE_NUMBER}로 저장한다.
현재 브랜치를 {PREV_BRANCH}로 저장한 뒤 새 브랜치로 전환:
git checkout -b feature/{ISSUE_NUMBER}-daily-{YYYY-MM-DD}
Step G1과 동일한 Python 스크립트를 실행해 {OPEN_ISSUES_WITH_STEPS}를 생성한다.
갱신용 이슈(오늘 데일리 노트 작성 이슈)는 제외한다.
아래 형식으로 60-logs/daily/{YYYY}/{MM}/{YYYY-MM-DD}.md 를 Write한다.
{YYYY-MM-DD}, {요일} 은 실제 값으로 치환한다.
이월 항목이 있을 때만 ## 이월된 미완 항목 섹션을 포함하고, 없으면 섹션 전체를 생략한다.
{OPEN_ISSUES} 자리에는 {OPEN_ISSUES_WITH_STEPS} (이슈 제목 + 계층형 sub-bullet) 를 삽입한다.
---
type: daily
created: {YYYY-MM-DD}
tags: [daily]
description: 날짜별 작업 로그 — 할 일, 배운 것, 회고
---
# {YYYY-MM-DD} ({요일})
## 이월된 미완 항목
> [[{PREV_DATE}]] 에서 이월
{CARRIED_ITEMS}
## 목표
{GOAL_ITEMS}
## Inbox — 오늘 포착한 것
> **구조**: 주제 / 목적 / 핵심 내용·지적사항 / 해결 방안 / 제약사항·미결
> 단순 운영 태스크는 제목 한 줄만 유지 가능
- [ ] [[이슈 링크]] 제목
- **주제**: 무엇에 관한 내용인지 (날짜·출처 포함)
- **목적**: 왜 이 작업/회의가 필요한지
- **핵심 내용 / 지적사항**
- ① 항목별로 번호 목록으로 세분화
- ② 각 항목은 원인·영향까지 한 줄로
- **해결 방안**: 결정된 대응 방향 (근거 포함)
- **제약사항 / 미결**
- 각 미결 항목 — 왜 미결인지 한 줄 설명
## 작업 로그
> **ISS 작업**: ISS 허브를 부모로, 하위 step/comms를 서브 블렛으로 작성
> `- [x] [[ISS 허브]] 작업 요약 (PR #번호)`
> `- [[step-NN-파일명]] 또는 [[comms/파일명]] 변경 내용`
> **독립 노트** (wiki·permanent 등): `- [x] [[노트]] 작업 내용 (PR #번호)`
> 미완료 항목도 `- [ ]`로 진행 중 작업 기록 가능
- [ ]
## 미완 작업 (GitHub Issues)
> 오픈 이슈 기준 — {YYYY-MM-DD}
> **미완료** `- [ ]`: 이슈 제목 + sub-bullet (범위·작업 항목)
> **완료** `- [x]`: 이슈 제목 한 줄만 — sub-bullet 제거 (상세는 작업 로그에)
{OPEN_ISSUES}
## 진행 중 WBS / 이슈
\`\`\`dataview
TABLE
default(wbs-status, status) AS "상태",
dateformat(file.mtime, "MM-dd") AS "최종수정"
FROM ""
WHERE file.folder != "_templates"
AND (
(type = "wbs" AND wbs-status != "export")
OR (type = "issue" AND status = "in-progress")
)
SORT type ASC, file.mtime DESC
\`\`\`
## 현재 작업 중 노트
\`\`\`dataview
TABLE
file.link AS "노트",
default(status, "-") AS "status",
dateformat(file.mtime, "MM-dd HH:mm") AS "수정"
FROM ""
WHERE file.folder != "_templates"
AND file.name != "{YYYY-MM-DD}"
AND file.mtime >= date("{YYYY-MM-DD}")
AND file.mtime < date("{YYYY-MM-DD}") + dur(1 day)
AND (
status = "in-progress"
OR contains(file.tags, "#wip")
)
SORT file.mtime DESC
\`\`\`
## 처리할 것
inbox에서 프로젝트/영역/리소스로 이동할 메모:
-
## 오늘 작업한 노트
\`\`\`dataview
TABLE
dateformat(file.ctime, "HH:mm") AS "생성",
dateformat(file.mtime, "HH:mm") AS "수정",
type
FROM ""
WHERE file.ctime >= date("{YYYY-MM-DD}") AND file.ctime < date("{YYYY-MM-DD}") + dur(1 day)
AND file.folder != "_templates"
AND file.name != "{YYYY-MM-DD}"
SORT file.ctime ASC
\`\`\`
## 회고
오늘 배운 것, 연결된 아이디어:
git add 60-logs/daily/{YYYY}/{MM}/{YYYY-MM-DD}.md
git commit -m "docs: {YYYY-MM-DD} 데일리 노트 작성 (#{ISSUE_NUMBER})"
git push -u origin feature/{ISSUE_NUMBER}-daily-{YYYY-MM-DD}
gh pr create \
--repo SeokRae/knowledge-labs \
--title "docs: {YYYY-MM-DD} 데일리 노트 작성" \
--body "## Summary\n- {YYYY-MM-DD} ({요일}) 데일리 노트 생성\n\nCloses #{ISSUE_NUMBER}"
Obsidian CLI가 사용 가능하면 생성된 노트를 Obsidian에서 바로 연다.
obsidian open path="60-logs/daily/{YYYY}/{MM}/{YYYY-MM-DD}.md" vault=sr-labs 2>/dev/null || true
CLI 실패(Obsidian 미실행 등)해도 워크플로우에 영향 없음 — 무시하고 진행.
✅ {YYYY-MM-DD} 데일리 노트 생성 완료
Issue : SeokRae/knowledge-labs#{ISSUE_NUMBER}
Branch: feature/{ISSUE_NUMBER}-daily-{YYYY-MM-DD}
PR : SeokRae/knowledge-labs#{PR_NUMBER}
파일 : 60-logs/daily/{YYYY}/{MM}/{YYYY-MM-DD}.md
완료 출력 후 자동 실행. 회의록이 없거나 후보가 없으면 전체 생략.
오늘 날짜 기준 회의록 스캔
find 20-areas -path "*/meetings/*.md" | xargs grep -l "{YYYY-MM-DD}" 2>/dev/null || true
ls 20-areas/meetings/*{YYYY-MM-DD}*.md 2>/dev/null || true
미처리 여부 확인 — 60-logs/ingest-log.md 에서 해당 파일 경로 검색
미처리 파일이 있으면 wiki 후보 추출 (Read 후 Grep)
\*\*Term\*\* 패턴\[\[링크\]\]wiki-term: true 노트와 중복이면 제외후보 제시 (1개 이상일 때만)
📎 미처리 회의록 N개 | wiki 후보: "용어A", "용어B" ...
wiki 페이지 만들까요? [y/스킵]
y → sr-obsidian:wiki scan {파일경로} 호출스킵 / 후보 없음 / 회의록 없음 → 종료| 상황 | 처리 |
|---|---|
| 파일이 이미 존재 | 갱신 모드로 전환 (덮어쓰지 않음) |
| 이전 데일리 노트 없음 | ## 이월된 미완 항목 섹션 생략 |
| 이전 노트에 미완 항목 없음 | ## 이월된 미완 항목 섹션 생략 |
docs: YYYY-MM-DD 데일리 노트 작성/갱신 이슈 | 이월 및 미완 작업 섹션에서 제외 (이월 누적 방지) |
| 날짜 형식 오류 | 오류 메시지 출력 후 중단 |
| gh 인증 실패 | 오류 메시지 출력 후 중단 |
| 이월 횟수 0회 | 횟수 태그 생략 (원본 항목 그대로 유지) |
| glob 실패 (daily 폴더 없음) | 이월 횟수 카운트 건너뜀, 항목만 출력 |
| 작업 로그에 기존 기록 있음 (G3.5) | placeholder 교체 건너뜀 — 기존 기록 보존 |
| 이월 항목 없음 (Step 1.6) | {GOAL_ITEMS} = - [ ] (빈 항목 유지) |
생성·갱신 완료 후 note_validator.py 가 아래 추가 지표를 측정해 evolution_log.jsonl에 기록한다.
이 지표들은 스킬 동작을 막지 않는다 — 측정·기록만 한다.
| 지표 | 측정 방법 | 목표값 |
|---|---|---|
goal_item_count | ## 목표 섹션의 - [ 항목 수 | 1 이상 |
goal_issue_linked | 목표 항목 중 #NNN 포함 비율 (0.0~1.0) | 0.5 이상 |
log_real_items | 작업 로그에서 placeholder(- [ ] 단독 1줄) 제외 후 항목 수 | 1 이상 |
completion_rate | 갱신 모드: 전날 [ ] 중 오늘 [x]로 전환된 비율 | 0.3 이상 |
carryover_reduction | 전날 이월 수 - 오늘 이월 수 (음수 = 이월 증가) | 양수 권장 |