AgentStack
Browse Sign in
Browse Why AgentStack Sell Docs
Sign in
SKILL verified MIT Self-run

Content Pipeline

skill-humanerd-drew-opencode-drewgent-content-pipeline · by humanerd-drew

{{AGENT_NAME}} content pipeline - editorial topic selection, draft writing, Korean humanization, review-ready publishing

No reviews yet
0 installs
33 views
0.0% view→install

Install

$ agentstack add skill-humanerd-drew-opencode-drewgent-content-pipeline

✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • Prompt-injection patterns
  • Secret / credential exfiltration
  • Dangerous shell & filesystem operations
  • Untrusted network calls
  • Known-malicious package signatures

What it can access

  • Network access No
  • Filesystem access Used
  • Shell / process execution No
  • Environment & secrets Used
  • Dynamic code execution No

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

View the full security report →

Verified badge

Passed review? Show it. Paste this badge into your README, it links to the public security report.

AgentStack Verified badge Links to your public security report.
[![AgentStack Verified](https://agentstack.voostack.com/badges/verified.svg)](https://agentstack.voostack.com/security/report/skill-humanerd-drew-opencode-drewgent-content-pipeline)

Reliability & compatibility

Security review passed
0 installs to date
no reviews yet
2mo ago

Declared compatibility

Claude CodeClaude Desktop

Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.

Preview Execution monitoring

We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.

How agent discovery & health will work →
Are you the author of Content Pipeline? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

Content Pipeline Skill

Aggregator pattern: 이 skill은 content를 수집하지 않음. monitoring — watch, don't prompt.

  • Synthesize in batches. One cycle produces blog draft + X thread + LinkedIn.
  • Track narrative arc. Posts accumulate into a story. Season/episode structure keeps continuity.
  • Start simple. One agent profile + cron job + one tracking file. No multi-stage pipeline unless proven necessary.

Modes

Mode A: Aggregator (external → blog)

Collect from external sources (trend-harvester, SEO-harvester), select topics, assign to content-writer via kanban. Suitable for: trend posts, SEO-optimized evergreen, tool roundups.

Mode B: CMO Agent (internal work → content)

Single autonomous agent profile (content-manager) observes Drew's recent work and produces multi-format content. Runs daily at 12:00 KST via cron.

Trigger: Cron (0 12 * * *), deliver to Discord #content-channel. Profile: ~/.{{AGENT_NAME_LOWER}}/agents/content-manager.md (deepseek-v4-pro, tools: terminal, file, search, session_search, web) Skill prerequisites: content-pipeline (this skill), SVG knowledge, Excalidraw, Mermaid. Suitable for: build logs, troubleshooting deep-dives, architecture decisions, project retrospectives.

See references/cmo-agent-mode.md for the full implementation guide.

Mode B requires these knowledge base files (in P4-cortex/content/):

  • brand-guide.md — brand positioning, voice, audience
  • glossary.md — project terms ({{AGENT_NAME}}, M-LOG, PDC...)
  • content-inventory.md — published/drafted content for dedup
  • narrative_arc.md — episode tracking, season structure, continuity

The agent reads all four at the start of every cycle before gathering context.


Editorial North Star

YOUR_DOMAIN은 자동 뉴스 블로그가 아니라 Drew가 AI, 도구, 코드, 글쓰기, 시스템 설계를 통해 어떻게 사고하고 만드는지를 보여주는 개인 작업실이다.

공개 후보가 되는 글은 반드시 아래 등식을 만족해야 한다:

public-worthy content = 기록 + 해석 + 재사용 가능한 통찰

단순한 수집 결과, 출시 소식, 활동 보고, 링크 요약은 공개 draft로 만들지 않는다. 그런 항목은 raw 또는 archive에 남겨도 되지만 content board task로 승격하지 않는다.

Editorial State Machine

raw source
  ↓ editorial_screen
candidate
  ↓ enough Drew-angle + reader value
draft              → status: draft      → Quartz EXCLUDE
  ↓ human review
published          → status: published  → Quartz INCLUDE
  ↓ rework needed
in_review          → status: in_review  → Quartz EXCLUDE
  ↓ no longer useful
archived           → status: archived   → Quartz EXCLUDE

content-pipelinecandidate → draft까지만 자동화한다. published 전환은 사용자가 직접 검토한 뒤에만 한다.

Triggers

  • Mode A (Aggregator): Cron job 3시간마다 (0 */3 * * * KST)
  • Mode B (CMO Agent): Cron job daily (0 12 * * *), content-manager agent profile
  • One story per cycle. SILENT if nothing new since last run.
  • Material-driven cadence: backlog clears one post per day, not batched.

See references/cmo-agent-mode.md for the full Mode B implementation.

Approach & Decision-Making

When making technical/content recommendations for Drew (site platform, theme, tools, services):

  1. Try first, evaluate later. Propose a concrete implementation path, apply it to the current environment, and test. Do NOT decide based on imagination, brand reputation, or hypotheticals alone. Retreat only if the tested approach proves genuinely inefficient.
  1. Research, don't pretend. If you don't have first-hand experience with a tool or technology, say "let me search for that" — not "I think X is good." The user will call out fake expertise immediately. When asked for a recommendation:
  • Search the web for current options
  • Test the top candidate in the user's environment
  • Report what you found and what worked
  • Don't generate comparison tables from hearsay or brand recall
  1. Don't fear change. Changing platforms (Quartz → WordPress), tools, or approaches is not inherently bad. Evaluate the migration cost against the benefit honestly, and if the direction makes sense, execute it rather than listing objections.
  1. When asked for a recommendation, search first. Before saying "I recommend X," search for current options, pick 2-3 concrete candidates, install/test the most promising one, and report results. Let real testing guide the decision, not your training data.
  1. Don't list objections for a direction the user is already committed to. If the user says "let's use WordPress" or "let's run Huly on NAS," don't produce a comparison table of alternatives. Instead:
  • Say "let's check if it works" and test it
  • Surface blocking issues only after the test fails, not before
  • Default to "yes, let's try that" over "here are the trade-offs"

These rules apply any time the user asks "which X should I use" or "what do you recommend."

Patching & Conventions

When updating or extending skills, follow these conventions:

Reference File Updates

  • references/ files preserve session-specific detail. When a one-time setup or workflow is discovered, add a reference file rather than bloating SKILL.md. Each reference file starts with a one-line summary of what it covers.
  • Scripts live in scripts/. Anything the agent should run rather than hand-type. Scripts are documented in SKILL.md with their usage example.
  • Templates live in templates/. Boilerplate configs, scaffolding, starter files meant to be copied and modified.

When to Add vs. Update

  • Add a reference file when a new technique, tool, or workflow was discovered during the session (e.g., fixing NAS SSH, setting up WordPress MCP).
  • Update SKILL.md when the core workflow changes (e.g., a new Mode, a step order change, a new image type).
  • Update memory when a USER preference or environment fact is learned (e.g., "user prefers trying first over analysis").
  • Don't save if nothing was learned that a future session would benefit from.

Phase 1: Source Tally (Aggregator Mode)

직접 수집하지 않음. 기존 cron output 3개를 읽음.

1. Trend Harvester → analyzed/keep

위치: ~/.{{AGENT_NAME_LOWER}}/P4-cortex/growth/trend-harvester/analyzed/keep/
형식: JSON (item{name,description,url,source}, total_score, decision)
필터: decision == "keep", scored_at 최근 48시간
선별: 상위 5개 → topic 후보
# 실행
ls -t ~/.{{AGENT_NAME_LOWER}}/P4-cortex/growth/trend-harvester/analyzed/keep/*.json | head -10
# → 상위 10개 JSON 파일 경로

JSON 파싱:

import json, pathlib
keep_dir = pathlib.Path("~/.{{AGENT_NAME_LOWER}}/P4-cortex/growth/trend-harvester/analyzed/keep")
files = sorted(keep_dir.glob("*.json"), key=lambda p: p.stat().st_mtime, reverse=True)[:10]
for f in files:
    d = json.load(open(f))
    item = d["item"]
    print(f"- {item['name']}: score={d['total_score']:.1f}, source={item['source']}")

2. SEO Harvester → report.json

위치: ~/.{{AGENT_NAME_LOWER}}/P2-hippocampus/knowledge/seo-articles/report.json
형식: JSON (articles[{title,url,keyword,score}])
선별: score ≥ 0.7, keyword 명확한 것 상위 3개
cat ~/.{{AGENT_NAME_LOWER}}/P2-hippocampus/knowledge/seo-articles/report.json | python3 -c "
import json, sys
d = json.load(sys.stdin)
articles = d.get('articles', [])
scored = [(a, a.get('score', 0)) for a in articles if a.get('score', 0) >= 0.7]
for a, s in sorted(scored, key=lambda x: -x[1])[:5]:
    print(f'- {a[\"title\"]} | keyword={a.get(\"keyword\",\"?\")} | score={s:.2f}')
"

3. Activity Logger → kanban tasks (last 24h)

위치: {{AGENT_NAME_LOWER}}_tasks.db (board=default, trigger_source=activity_logger)
쿼리: SELECT title, body FROM tasks
      WHERE trigger_source = 'activity_logger'
      AND status = 'completed'
      AND created_at > datetime('now', '-24 hours')
선별: conversation insight 관련 것 (implement/build/create 등 포함) 상위 3개
import sqlite3, pathlib
db = pathlib.Path.home() / ".{{AGENT_NAME_LOWER}}/P2-hippocampus/kanban/state/{{AGENT_NAME_LOWER}}_tasks.db"
conn = sqlite3.connect(str(db))
rows = conn.execute("""
    SELECT title, body FROM tasks
    WHERE trigger_source = 'activity_logger'
    AND status = 'completed'
    AND created_at > datetime('now', '-24 hours')
    ORDER BY created_at DESC
    LIMIT 10
""").fetchall()
for title, body in rows:
    print(f"- [{title}] {body[:100] if body else ''}")
conn.close()

Phase 2: Topic Selection

세 source에서 합산 최대 3개 topic 선별. 기본값은 0개다. 충분히 좋은 후보가 없으면 [SILENT]가 올바른 결과다.

| 출처 | Topic 유형 | Prefix | |------|-----------|--------| | Trend Harvester | [draft-trend] | 기술 동향 | | SEO Harvester | [draft-seo] | 검색 최적화 | | Activity Logger | [draft-conversation] | 작업 insight |

Editorial Gate

각 후보는 0~2점으로 평가한다. 총점 7점 이상만 content board task로 만든다.

| 기준 | 0점 | 1점 | 2점 | |---|---|---|---| | Drew-angle | Drew의 작업/판단과 무관 | 약하게 연결됨 | Drew의 작업 방식, 도구, 포트폴리오와 직접 연결 | | Insight | 요약/소식 수준 | 관찰은 있으나 일반화 약함 | 독자가 재사용할 수 있는 판단 기준이 있음 | | Evidence | 출처/맥락 불충분 | 기본 출처 있음 | 출처 + 실제 작업 맥락 또는 artifact 있음 | | Portfolio value | 지나가는 메모 | blog note로는 가능 | portfolio/insight 축에 남겨도 가치 있음 | | Specificity | 일반론, 키워드 나열 | 어느 정도 구체적 | 구체적 사례, 프로젝트, 도구, 실패/결정 포함 |

자동 reject 규칙:

  • 단순 제품/도구 출시 요약
  • Drew가 직접 써본 흔적이나 판단이 없는 외부 트렌드
  • SEO keyword만 좋고 관점이 없는 주제
  • 이미 최근 30일 내 같은 주장으로 다룬 주제
  • "AI가 대단하다/위험하다" 수준의 일반론

source별 우선순위:

  1. [draft-conversation]: Drew의 작업에서 나온 insight면 우선.
  2. [draft-trend]: {{AGENTNAME}}, YOURDOMAIN, agent tooling, creative coding, publishing system과 연결될 때만.
  3. [draft-seo]: 검색 유입보다 사이트 정체성에 맞는 evergreen 주제일 때만.

최대 3개. 품질 > 수량.


Phase 3: Kanban Task Creation

선별한 topic마다 content board에 task 생성:

kanban_create(
    title=f"[draft-{type}] {topic_title}",
    body=f"""## Topic
{topic_description}

## Editorial Decision
- score: {score}/10
- publish_intent: blog | insight | portfolio | archive
- Drew-angle: {why_this_matters_to_drew}
- reusable_insight: {one_sentence_reader_value}
- reject_if_missing: if this cannot show Drew's judgment, archive instead of drafting

## Content Source
- source: {source_name}
- collected_at: {YYYY-MM-DD HH:MM}

## 글쓰기 방향
- 톤: writing-style-guide.md hybrid approach 따르기
  - 톤: 휴머너드 말투 (긴 플로우, Bold 강조, "당신" 직접호칭, 1인칭 "저"/"나")
  - SEO: 기존 방식 유지 (aliases, 해시태그, SEO 키워드 섹션)
- 제목: 질문 또는 provocative statement
- 도입: Bold 훅 한 문장 → 10~20문장 플로우

## Frontmatter

title: {title} type: document space: concept tags: [blog, {category}] aliases: ['/blog/{slug}'] created: {YYYY-MM-DD} status: draft links:

  • "[[@identity/persona/writing-style-guide]]"

## 작성 시 반드시 확인할 것
1. forbidden.patterns grep → 0건
2. Bold 섹션 강조 2~4개 존재
3. "당신" 직접호칭 + 1인칭 "저"/"나" 포함
4. 본문 날짜 (X월 X일) 없음
5. SEO 키워드 3~7개, 해시태그 8~14개
6. aliases in frontmatter
7. 기록 + 해석 + 재사용 가능한 통찰이 모두 있음
""",
    board="content",
    trigger_source="content_pipeline",
    priority=1,
    idempotency_key=f"{YYYY-MM-DD}-{slug}",
)

Title prefix 규칙:

  • 트렌드 기반: [draft-trend]
  • SEO 키워드 기반: [draft-seo]
  • 대화/경험 기반: [draft-conversation]

Draft 파일 위치: memories/insights/YYYY-MM-{slug}.md

  • 예: memories/insights/2026-05-gemini-cli-shutdown.md
  • Obsidian에서 직접 확인 가능: ~/.{{AGENT_NAME_LOWER}}/P2-hippocampus/memories/insights/
  • Kanban 대시보드 연동: body에 ## Draft 파일 위치 절대경로가 있으면 대시보드 카드에 📄 Obsidian 링크가 자동 생성됨. 카드 클릭 → Description 탭 하단 "📄 Open in Obsidian" 버튼 클릭 → Obsidian에서 draft 파일 열림.
  • YOUR_DOMAIN의 /blog/{slug} 또는 /blog/YYYY/{slug} 경로로 Quartz에 의해 공개됨. Raw monthly log는 공개하지 않음.

Phase 4: Draft Writing ({{AGENT_NAME}} Worker)

kanban-dispatcher가 ready task를 worker에 배분.

4-1. Task Claim

kanban_claim(task_id, ttl_seconds=1800)

4-2. Research (if needed)

Topic 관련 정보가 충분하지 않으면 web search로 보강. 출처: URL, source-date 명시.

4-3. Draft 작성

memories/insights/에 Markdown 파일 생성.

writing-style-guide.md 적용 (hybrid approach):

  • : 휴머너드 말투 (긴 플로우, Bold 강조, "당신" 직접호칭, 1인칭 "저"/"나")
  • SEO: 기존 방식 유지 (aliases, 해시태그, SEO 키워드 섹션, frontmatter)

ReefWatch 스타일 글 구조 (기술 심화 글용):

ReefWatch 아티클 (dev.to/siiddhantt/building-reefwatch)의 7가지 핵심 포인트를 적용한 템플릿:

  1. 문제 프레이밍 — 공감되는 상황부터 시작. Bad: "이 글은 ~에 대해 알아봅니다." Good: 구체적 경험/상황 → 문제 발견
  2. 강한 주장 (Bold) — 기존 방식의 한계를 Bold로. 예: "But that is not triage. That is a polished to-do list."
  3. 디자인 제약 (emphasis) — 핵심 원칙을 emphasis로 강조. 예: "The design constraint from the start was simple: no evidence, no answer."
  4. One-sentence 요약 (blockquote) — 한 문장으로 전체 정의. 블록쿼트로 시각적으로突出
  5. 이미지 배치 — "설명 전에 보여주기" — 개념 설명 직전에 시각 자료. Obsidian: ![[image.png|너비]]
  6. "What This Guide Builds" 테이블 — 글 도입부에 outcomes를 테이블로 제시. 독자가 첫 스캔에서 판단
  7. Build Path / 구조 테이블 — 순서를 시각화. 다단계 컴포넌트 설명에 효과적

ReefWatch 확장 템플릿:

# {제목: 질문 또는 provocative statement}

{커버 이미지:  — 16:9 landscape, 글 전체를 대표하는 시각적}

**{문제 프레이밍 — Bold 훅}**
{구체적 상황 묘사. 독자가 공감할 수 있는 경험/관찰}

**{강한 주장 — Bold 한 문장}**
{기존 방식의 한계 또는 문제의 본질}

{분석 플로우: 10~20문장. 경험 → 관찰 → 분석}

**{중간 핵심 강조 — Bold}**
{구체적 해결책 또는 인사이트}

{이어지는 플로우}

> {One-sentence 정의 — 블록쿼트로 한 문장 요약}

## What This Guide Builds

| 당신은 이것을 할 수 있게 된다 |
|---|
| {outcome 1} |
| {outcome 2} |
| {outcome 3} |

{구현/설계 섹션}

{이미지:  — 플로우/아키텍처 다이어그램, 설명 전에 배치}

{이어지는 설명}

**{마무리 강조 — Bold 한 문장}**
{결론 또는 행동 유도}

---

**이런 분들께 추천**
- {타겟 독자}

**SEO 키워드**: {키워드 3~7개}
**#해시태그**: #{태그1} #{태그2} ...

ReefWatch 스타일 글쓰기 순서:

  1. 문제 상황 묘사 (Opening) — Bold 훅
  2. 기존 방식의 한계 (Bold 주장)
  3. 해결 원칙 (emphasis)
  4. 구체적 구현/해결책
  5. 구조/순서 정리 (표 또는 트리)
  6. 마무리 행동 유도

기술 심화 글이 아닌 경우 (트렌드/단편): 확장 템플릿 대신 기본 구조(문제 프레이밍 → Bold 주장 → Bold 마무리)만 사용. "What This Guide Builds" 테이블은 생략 가능.


Image Types in Blog Posts

Blog posts use THREE types of visual content, each with a different production path:

| Type | Production | Cost | When | |------|-----------|------|------| | Mermaid (inline) | ``mermaid code blocks — Quartz renders to SVG | $0 | Flows, sequences, state machines | | **Excalidraw PNG** (exported) | .excalidraw.jsonexcalidraw-to-png.js.png | $0 | Architecture diagrams, before/after, data flow | | **SVG Cover** (inline) | Model writes SVG XML → saved as .svg` | $0 | Hero/banner, article cover image |

SVG is the primary cover/hero image format — model writes SVG XML directly. Mermaid is for inline flow diagrams. Excalidraw is for complex architecture visuals.

SVG Meme Templates (Mode B only)

For stories with a natural humor angle, create a meme SVG alongside the cover. Memes make technical content more approachable on social/X.

Supported templates:

| Template | Use Case | Structure | |----------|----------|-----------| | Drake Reject/Approve | Before/after comparison | Two panels: red ✗ (old) → green ✓ (new) | | "This is fine" | Recognizable pain/bug | Burning room, "it's fine" caption | | Galaxy Brain | Escalating understanding | 4 levels of insight, last one mind-blowing | | Distracted Boyfriend | Three-way comparison | 3 labeled elements: old → new → shiny |

Save as YYYY-MM-DD-slug-meme.svg. Embed optionally: ![[slug-meme.svg|600]]

Pitfall: Don't force a meme where none fits. If the story is serious (incident, security, reflection), skip it. Memes are for "this is ridiculous" or "this pattern is obvious in hindsight" angles only.

⚠️ Pitfall: Do not conflate Mermaid with exported images. Mermaid renders inline as SVG. Excalidraw PNGs are separate files. The blog post needs BOTH — Mermaid for inline flows, Excalidraw PNG for architecture visuals.

Excalidraw → PNG Pipeline

The content-manager creates .excalidraw.json files for complex architecture. The full pipeline is:

Step 1: Create JSON → Validate

Create .excalidraw.json with proper JSON structure. Must validate before proceeding:

python3 -c "import json; json.load(open('diagram.excalidraw.json'))" && echo "VALID" || echo "INVALID"

Common pitfall: trailing comma in the last element of an array or object. JSON does not allow trailing commas. Use write_file which includes a JSON lint step, or run the validation above.

Step 2: Create .excalidraw binary
excalidraw create diagram.excalidraw.json -o diagram.excalidraw
# Requires: npm install -g excalidraw-cli (Homebrew)

Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet, be the first.

Versions

  • v0.1.0 Imported from the upstream source.