소스 정보
- 저장소
- River-181/org-ops-workspace
- 최근 소스 활동
- 2026년 7월 23일 15:19
- 감지된 SKILL.md 언어
- 한국어
- 스타
- 0
- 포크
- 0
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/River-181/org-ops-workspace --skill drop-announce명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
SOC 직업 분류 기준
SKILL.md 표시 중
| name | drop-announce |
| description | Drop 공지 자동화 — 유동적 항목 개수 지원, 이미지 스마트 캡처, Drop 파일 생성, /drop-publish 자동 호출 |
| argument-hint | <번호> "<제목>" "<타입>" (항목은 stdin에서 N개 읽기) |
Drop 공지 발행을 한 번에 자동화:
_system/obsidian/maps/MAP-드롭.md)/drop-publish 호출 → Discord #share + Notion 동시 발행두 가지 작성 경로:
/drop-announce)로 전체 자동화01_ops/templates/tpl-drop.md로 초안 작성 후 drop_status: ready로 바꾸고 /drop-publish만 호출. 아래 "공유 내용"·"카카오톡 공유용" 섹션 형식은 두 경로 모두에 동일하게 적용된다./drop-announce <번호> "<제목>" "<타입>"
그 후 항목을 자유롭게 입력 (1개 ~ N개):
① <항목명> | <링크> | by <제공자> | <한줄설명>
② <항목명> | <링크> | by <제공자> | <한줄설명>
(필요한 만큼 반복)
/drop-announce 0017 "이번 주 도구 4가지" "Tools"
① Korean Law MCP | https://github.com/chrisryugj/korean-law-mcp | by Chris (@chrisryugj) | 한국 법률 DB 연동
② Meta AI — 뇌 반응 예측 | https://www.meta.com/research/ | by Meta Research | UI/UX 리서치용 AI
③ Anthropic Science Hub | https://www.anthropic.com/science | by Anthropic | Claude 개발 뒤의 과학
④ NotebookLM MCP | https://notebooklm.google.com/ | by Google | 리서치 노트 AI 자동화
/drop-announce 0018 "새로운 Claude 모델 출시" "News"
① Claude 4.5 발표 | https://www.anthropic.com/news/claude-4.5 | by Anthropic | 최신 AI 모델 공개
/drop-announce 0019 "AI 모델 비교" "Research"
① GPT-4 vs Claude | https://comparison.com/gpt-vs-claude | by OpenAI/Anthropic | 성능 비교 분석
② 코드 생성 능력 벤치마크 | https://benchmark.com/llm | by HuggingFace | 정량 데이터
DROP_NUMBER=$(printf "%04d" $1) # "0017"
DROP_TITLE="$2" # "이번 주 도구 4가지"
DROP_TYPE="$3" # "Tools" (기본값: "News")
TODAY=$(date +%Y-%m-%d)
FILENAME=$(date +%y%m%d)
# 항목 개수 동적 읽기
ITEMS=()
COUNT=0
while IFS='|' read -r NUM NAME LINK AUTHOR DESC; do
NUM=$(echo "$NUM" | xargs) # ① 제거
NAME=$(echo "$NAME" | xargs)
LINK=$(echo "$LINK" | xargs)
AUTHOR=$(echo "$AUTHOR" | xargs)
DESC=$(echo "$DESC" | xargs)
ITEMS+=("$NUM|$NAME|$LINK|$AUTHOR|$DESC")
((COUNT++))
done
echo "📋 항목 개수: $COUNT개"
# Drop 이미지 정본 보관 규칙(04_studio/assets/README.md):
# PNG/JPG/GIF는 04_studio/assets/etc/에 보관하고, 임베드는 반드시 전체 경로로 쓴다.
# 예: ![[04_studio/assets/etc/260629-drop-0040-예시.png|700]] (바레 파일명만 쓰면 안 됨)
ASSETS_DIR="04_studio/assets/etc"
mkdir -p "$ASSETS_DIR"
# 항목 개수에 따라 격자 동적 계산
# 1~2개: 1열, 3~4개: 2열
COLS=$((COUNT > 2 ? 2 : 1))
ROWS=$((($COUNT + $COLS - 1) / $COLS))
# 카드 크기 및 간격
CARD_WIDTH=320
CARD_HEIGHT=200
CARD_X_OFFSET=40
CARD_Y_OFFSET=80
GAP_X=380
GAP_Y=240
# JSON 카드 생성 (각 항목별)
ELEMENTS="["
for i in "${!ITEMS[@]}"; do
IFS='|' read -r NUM NAME LINK AUTHOR DESC <<< "${ITEMS[$i]}"
COL=$((i % COLS))
ROW=$((i / COLS))
X=$((CARD_X_OFFSET + COL * GAP_X))
Y=$((CARD_Y_OFFSET + ROW * GAP_Y))
# 색상 로테이션 — 브랜드 Light 팔레트 4종 (design-tokens.css --brand-light-* 계열)
# 라벤더 / 페이퍼 / 실버블루 / 브라운 틴트
COLORS=("#EDE7F8" "#F4F1EA" "#E8EDF2" "#F2EAE0")
COLOR=${COLORS[$i % 4]}
ELEMENTS+="
{
\"type\": \"rectangle\",
\"id\": \"card$((i+1))\",
\"x\": $X,
\"y\": $Y,
\"width\": $CARD_WIDTH,
\"height\": $CARD_HEIGHT,
\"backgroundColor\": \"$COLOR\",
\"fillStyle\": \"solid\",
\"roundness\": {\"type\": 3},
\"strokeColor\": \"#3A4147\",
\"strokeWidth\": 1,
\"label\": {
\"text\": \"$NUM $NAME\\nby $AUTHOR\\n\\n$DESC\",
\"fontSize\": 16,
\"fontColor\": \"#1A1813\"
}
},"
done
ELEMENTS="${ELEMENTS%,}]"
> /tmp/excalidraw.json <<
EXCALIDRAW_URL=
# 환경변수 로드
source _system/tools/.env
# 각 링크에서 오브젝트별 스크린샷 캡처
capture_smart_screenshot() {
local url=$1
local output=$2
local description=$3
echo "📸 캡처 중: $description"
# Safari 열기 + 로딩 대기
open -a Safari "$url"
sleep 4
# 웹사이트 유형별 정밀 캡처 (오브젝트 중심)
if [[ "$url" == *"github.com"* ]]; then
# GitHub: 리포지토리 헤더 영역만 캡처
screencapture -t png -R 0,100,1920,400 "$ASSETS_DIR/$output.png"
elif [[ "$url" == *"meta.com"* ]]; then
# Meta: 콘텐츠 본체 영역 캡처
screencapture -t png -R 0,200,1920,600 "$ASSETS_DIR/$output.png"
elif [[ "$url" == *"anthropic.com"* ]]; then
# Anthropic: 메인 섹션 캡처
screencapture -t png -R 0,150,1920,550 "$ASSETS_DIR/$output.png"
elif [[ "$url" == *"google.com"* ]] || [[ == ** ]];
screencapture -t png -R 0,100,1920,500
[[ == ** ]];
screencapture -t png -R 100,100,1720,820
screencapture -t png -R 0,100,1920,700
}
capture_smart_screenshot \
i ;
IFS= -r NUM NAME LINK AUTHOR DESC <<<
capture_smart_screenshot \
파일명: 04_studio/drops/${FILENAME}-drop-${DROP_NUMBER}-${슬러그}.md
Frontmatter (정확한 순서):
---
title: "Drop #${DROP_NUMBER} — ${DROP_TITLE}"
kind: drop
area: studio
status: draft
drop_status: ready
drop_number: "${DROP_NUMBER}"
type: ${DROP_TYPE}
tags:
- type/drop
- category/${CATEGORY}
source: 외부
link:
memo: ${항목들 요약}
visibility: Member
created: ${TODAY}
published_at:
up: "[[MAP-드롭]]"
discord_message_id:
notion_page_id:
---
콘텐츠 (동적 항목 개수):
## 공유 내용
📢 **이번 주 Drop ${COUNT}개 공개했어요!**
(항목별 반복):
**${NUM} ${NAME}** by ${AUTHOR}
${DESC}
![[04_studio/assets/etc/${FILENAME}-drop-${NUM}.png|600]]
---
(마지막 항목 후):
더 자세한 내용은 각 Drop 문서를 확인해주세요! 🎯
[ Drop | #${DROP_NUMBER} ]
## 카카오톡 공유용
(항목별 하이라이트를 소개형("① ~ / ② ~")이 아니라 하나의 산문으로 엮는다.
"이번 주 Drop ${COUNT}개 공개했어요" 식으로 시작해, 항목별 핵심을 한두 문장씩
자연스럽게 이어 붙이고, 마지막에 링크와 스레드 안내를 둔다.
말투·분량 기준은 아래 "카카오톡 공유용 섹션 형식" 참고.)
이번 주 Drop ${COUNT}개 공개했어요! (항목별 핵심을 한 문장씩 자연스럽게 이어서 서술)
더 자세한 건 디스코드 스레드에서 볼 수 있어요.
(항목별 링크 나열, 한 줄씩)
[ Drop | #${DROP_NUMBER} ]
## 링크
- ${NAME}: ${LINK}
(각 항목 반복)
Drop 파일명에서 wikilink를 생성해 MAP-드롭.md의 그래프 링크 callout 마지막 줄에 삽입한다.
MAP_FILE="_system/obsidian/maps/MAP-드롭.md"
DROP_SLUG="${FILENAME}-drop-${DROP_NUMBER}-${슬러그}" # Drop 파일명에서 .md 제거
# 그래프 링크 callout의 마지막 항목 다음에 삽입
# "> - [[마지막항목]]" 패턴 찾아 그 뒤에 추가
python3 - <<PYEOF
import re
with open("$MAP_FILE", "r", encoding="utf-8") as f:
content = f.read()
new_link = "> - [[$DROP_SLUG]]"
# 그래프 링크 callout 내 마지막 [[...]] 줄 다음에 삽입
pattern = r'(> - \[\[[^\]]+\]\]\n)(\n> \[!)'
replacement = r'\1' + new_link + r'\n\2'
updated = re.sub(pattern, replacement, content)
if updated == content:
# fallback: callout 마지막 [[...]] 줄 바로 뒤에 추가
pattern2 = r'((?:> - \[\[[^\]]+\]\]\n)+)'
def add_link(m):
block = m.group(1)
return block.rstrip('\n') + '\n' + new_link + '\n'
updated = re.sub(pattern2, add_link, content, count=1)
# updated 필드 갱신
import datetime
today = datetime.date.today().isoformat()
updated = re.sub(r'^updated:.*$', f'updated: {today}', updated, flags=re.MULTILINE)
with open("$MAP_FILE", "w", encoding="utf-8") as f:
f.write(updated)
print(f"✅ MAP-드롭 그래프 링크 추가: [[$DROP_SLUG]]")
PYEOF
echo "🚀 /drop-publish 스킬 호출..."
/drop-publish "04_studio/drops/${FILENAME}-drop-${DROP_NUMBER}*.md"
# 칸반 파일에서 항목 찾기 및 이동
KANBAN_FILE="_system/obsidian/kanban/칸반-드롭.md"
for i in "${!ITEMS[@]}"; do
IFS='|' read -r NUM NAME LINK AUTHOR DESC <<< "${ITEMS[$i]}"
# "🔜 발행 대기" → "✅ 발행 완료"로 항목 이동
sed -i '' "/- \[ \] \[\(${NAME}\|${LINK}\)\]/s/^/✅ $TODAY /g" "$KANBAN_FILE"
done
_system/tools/.env에 설정:
DISCORD_BOT_TOKEN="your_bot_token"
DISCORD_GUILD_ID="your_guild_id"
DISCORD_SHARE_CHANNEL_ID="your_channel_id"
NOTION_API_KEY="your_api_key"
NOTION_DROPS_DB_ID="your_db_id"
기존 drop-0018 형식 따름 (필드 순서 엄격히 지킬 것):
title: "Drop #NNNN — [제목]" (반드시 "#" 포함, 큰따옴표 필수)kind: "drop" (고정)area: "studio" (고정)status: "draft" (생성 시) → "live" (발행 후) ← 단일 값, 리스트 아님drop_status: "ready" (생성 시) → "live" (발행 후)drop_number: "NNNN" (4자리 zero-pad 문자열, 큰따옴표 필수)type: "Tip", "Tools", "News", "Research", "Insight" 등tags: YAML 배열 형식만 허용 (- type/drop, - category/tips) — 인라인 해시태그 금지source: "내부" (자체 제작) | "외부" (외부 링크) | "Discord" (Discord 공유)link: 외부 URL (선택)memo: 한 줄 설명 (drops.csv에도 반영됨)visibility: "Member" (기본) 또는 "Internal"created: YYYY-MM-DDpublished_at: YYYY-MM-DD (발행 전 빈 값)up: "[[MAP-드롭]]" (고정, 큰따옴표 필수)related: (선택) 다른 드롭이나 외부 소스와 교차 링크할 때 YAML 배열로 추가 — ["[[260629-drop-0039-예시]]"] 등. 아크형 드롭(여러 드롭을 하나로 묶는 완결 드롭)은 묶이는 드롭 전체를 여기 나열한다.discord_message_id: 발행 후 기록notion_page_id: 발행 후 기록비표준 필드 추가 금지: series, updated, drop_type, author 등 위 목록에 없는 필드는 넣지 말 것.
Drop 파일의 ## 공유 내용은 Discord 스레드에 그대로 올라가는 본문이다.
핵심 원칙:
---로 구분된 여러 섹션(왜 유용한가·핵심·의미 등)으로 길게 써도 된다. 단, 체크리스트·FAQ 같은 기획 문서를 통째로 넣지 않는다 — 기획·초안이 길면 04_studio/drops/기획/에 별도 보관하고 링크만 참조.![[04_studio/assets/etc/파일명.png|700]] 형식으로 삽입 — 전체 경로를 포함해서 쓴다 (04_studio/assets/README.md 정본 규칙). 이미지 파일은 04_studio/assets/etc/에 저장한다.[ Drop | #NNNN ] (드롭 번호 없이 [ Drop ]만 쓰지 않는다)올바른 구조:
## 공유 내용
📝 **[한 줄 훅]**
[핵심 인사이트]
![[04_studio/assets/etc/이미지.png|700]]
---
**[구조화된 핵심 정보 — 필요한 만큼 --- 로 섹션 반복]**
[ Drop | #NNNN ]
## 카카오톡 공유용
(아래 "카카오톡 공유용 섹션 형식" 참고)
## 링크
- [출처]: [URL]
## 카카오톡 공유용은 멤버들에게 카카오톡으로 공유하는 텍스트다. ## 공유 내용과 별도로 작성하고, 반드시 코드블럭(```)으로 감싼다 — publish-drop.py가 코드블럭 안 텍스트를 우선 추출하며, 코드블럭이 없으면 섹션 전체를 그대로 긁어와 형식이 깨진다.
핵심 원칙:
[ Drop | #NNNN ]아크형 드롭(여러 드롭을 하나로 묶는 완결 드롭) 추가 규칙:
[Drop #NN] 식으로 소개하지 않는다 — 장별 번호·제목 구분, 불릿 나열 금지.올바른 구조 (drop-0023, drop-0025 참고):
[첫 문단: 맥락 소개 + 핵심 키워드. "~이에요" 마무리.]
[둘째 문단: 주요 포인트 + 링크 + 스레드 안내.]
https://링크주소
[ Drop | #NNNN ]
말투 레퍼런스 (drop-0025):
"Google I/O 2026 정리예요. 구글 유료(Pro) 계정 쓰신다면 이번에 꽤 챙길 게 많아요. 올해 키워드는 '에이전틱 AI'인데, 내가 안 시켜도 배경에서 알아서 돌아가는 AI예요. Gemini가 채팅 도구를 넘어서 Gmail·Docs·캘린더를 24시간 자동 정리하는 에이전트가 됐고, Docs Live는 말로 brain dump만 해도 문서를 완성해줘요."
✨ Drop #0017 공지 발행 완료!
📄 Drop 파일: 04_studio/drops/260401-drop-0017-도구4가지.md
🖼️ 이미지 5개: 04_studio/assets/etc/
💬 Discord: https://discord.com/channels/.../1234567890
📋 Notion: https://www.notion.so/xxxxx
✅ /drop-publish 자동 실행 완료
✓ discord_message_id 기록됨
✓ notion_page_id 기록됨
✓ drops.csv 갱신됨
✓ 칸반 자동 이동 완료 (4개 항목)
/drop-publish 호출로 즉시 Discord+Notion 동시 발행published_at 미래 날짜로 설정 시 예약