| name | tech-blog-manager |
| description | Curates the ThakiCloud tech blog content inventory: per-category policy, 250-posts/language publish cap, add-one/drop-one rule, and published-flag toggling. Use when managing blog categories, enforcing or inspecting the post cap, toggling published state, routing a twitter-selected topic to the blog. Korean+English triggers: ๊ธฐ์ ๋ธ๋ก๊ทธ ๊ด๋ฆฌ, ๋ธ๋ก๊ทธ ์นดํ
๊ณ ๋ฆฌ ์ ๋ฆฌ, ๊ธ 250๊ฐ ์ํ, ๋ฐฐํฌ ๊ธ ๋นผ๊ธฐ, ๋ธ๋ก๊ทธ ๋ฐํ ์ํ, blog cap, unpublish post, blog curation. Do NOT use for building/pushing the site (use tech-blog-deploy), translating posts to en/ar (use blog-i18n-sync), nightly quality scoring/rewriting (use tech-blog-evolve), or humanizing prose (use humanizer). |
tech-blog-manager
ThakiCloud ๊ธฐ์ ๋ธ๋ก๊ทธ(์๋ธ๋ชจ๋ thakicloud.github.io/, Jekyll Minimal-Mistakes)์ ์ฝํ
์ธ ๊ด๋ฆฌ.
ํฌ๋งท ๊ฒฐ์ ๋ก ์ [[sonnet-format-determinism]]์ ๋ฐ๋ฅธ๋ค โ ๋ชจ๋ธ์ ๊ธ ๋ณธ๋ฌธ๋ง, ์นด์ดํธยทpriorityยท
published ํ ๊ธยท์ง๊ณ๋ ๊ฒฐ์ ๋ก ์ฝ๋๊ฐ ์์ ํ๋ค. ๋ชจ๋ ๋ฐฐํฌ ๊ธ์ [[humanizer]] ํต๊ณผ๊ฐ ๊ฒ์ดํธ์ด๊ณ ,
ํ๊ตญ์ด ๊ธ์ humanizer ์งํ [[korean-tone-reviewer]]๋ก ํฉ๋๋ค์ฒด ๊ฒฉ์์ ํต์ผํ๋ค(humanizer๋ AI ํ์ ๋ง
์ ๊ฑฐํ๊ณ ๊ฒฉ์/๊ฒฝ์ด๋ ๋ณด์ฅํ์ง ์์ผ๋ฏ๋ก ๋ณ๋ register ๊ฒ์ดํธ ํ์ โ 2026-06-22 ์ปฌ์ฒ 5ํธ ๋ฐฐํฌ ์ humanizer
ํ ๋ณ๋ ํฉ๋๋ค์ฒด ๋ณํ์ด ๋ ํ์ํ๋ ์ฌ๊ณ ).
๋ฉ์ปค๋์ฆ (์ฌ์ฉ์ ๊ฒฐ์ )
- 250 cap = ์ธ์ด๋ณ(ko/en/ar ๊ฐ 250).
published: false๋ก ๊ณต๊ฐ ๋ฐฐํฌ์์ ์ ์ธ(ํ์ผ์ repo์
๋จ์ jekyll serve --unpublished๋ก ๋ก์ปฌ ํ์ธ ๊ฐ๋ฅ โ ์ญ์ ์๋).
- 1๋ฃ๊ณ 1๋นผ๊ธฐ = blog_plan.py๊ฐ ๊ณง ์์ง: ํญ์ ์ธ์ด๋ณ ์์ ์ฐ์ ์์๋ง published ์ ์ง. ์ ๊ธ ์ถ๊ฐ
ํ ์ฌ์คํํ๋ฉด ์ต์ ์ฐ์ ์์๊ฐ ์๋์ผ๋ก published:false. ๋ณ๋ ๋ก์ง ๋ถํ์(idempotent).
๊ฒฐ์ ๋ก ์คํฌ๋ฆฝํธ (scripts/, stdlib only, py3.12)
| ์คํฌ๋ฆฝํธ | ์ญํ |
|---|
blog_inventory.py [--json] | _posts/<lang>/<cat>/ ์ค์บ โ ์นดํ
๊ณ ๋ฆฌ๋ณ ์นด์ดํธ/manifest |
blog_plan.py [--json] | ์นดํ
๊ณ ๋ฆฌ ์ ์ฑ
+ 250 backstop์ผ๋ก post๋ณ target_published ๊ณ์ฐ |
blog_apply.py [--write] | ํ๋์ front-matter published:์ ์ต์-diff๋ก ๊ธฐ๋ก(๊ธฐ๋ณธ dry-run) |
blog_common.py | POLICY ํยทVALID_CATEGORIESยทfront-matter ํ์ยทset_published (๊ณต์ฉ) |
blog_category_check.py | โ ์นดํ
๊ณ ๋ฆฌ ๊ฒ์ดํธ: ๋ชจ๋ ๊ธ์ ๋๋ ํ ๋ฆฌ+front-matter categories:๊ฐ VALID_CATEGORIES ๋ถ๋ถ์งํฉ์ธ์ง ๊ฒ์ฆ(์๋ฐ exit 1). ๋ฐฐํฌ ์ ํ์ |
์คํ์ ์ ๋๊ฒฝ๋ก ๋๋ repo ๋ฃจํธ์์: python3 .claude/skills/tech-blog-manager/scripts/blog_plan.py.
BLOG_ROOT env๋ก ๋ธ๋ก๊ทธ ๊ฒฝ๋ก ์ค๋ฒ๋ผ์ด๋(๊ธฐ๋ณธ <repo>/thakicloud.github.io).
โ ์นดํ
๊ณ ๋ฆฌ = ํ์์งํฉ 11๊ฐ (blog_common.VALID_CATEGORIES โ ์ฝ๋๊ฐ ๊ฐ์ )
๋ธ๋ก๊ทธ๊ฐ ๋
ธ์ถํ๋ ์นดํ
๊ณ ๋ฆฌ๋ ๋ฑ 11๊ฐ๋ฟ์ด๋ค. ์ด ์งํฉ ๋ฐ์ ์นดํ
๊ณ ๋ฆฌ๋ก ๊ธ์ ๋ง๋ค๋ฉด
_pages/<lang>/categories/์ ํ์ด์ง๊ฐ ์์ด ์นดํ
๊ณ ๋ฆฌ ์ธ๋ฑ์ค์์ ๋๋ฌ ๋ถ๊ฐ(์ ์ฒด ๊ธ ๋ณด๊ธฐ๋ก๋ง
๋ณด์) = ์ฌ๊ณ (2026-07-03: iaas/paas/saas/technique/๋งํ/devops ๋ฑ stray ์นดํ
๊ณ ๋ฆฌ 83ํธ + ์์ ํ
2์ฐจ ์นดํ
๊ณ ๋ฆฌ 107๊ฑด์ด orphan). ์ ๊ท/์ฌ์์ฑ ๊ธ์ categories: ์ฒซ ํญ๋ชฉ = ๋๋ ํ ๋ฆฌ๋ช
= ์๋ 11๊ฐ
์ค ํ๋์ฌ์ผ ํ๊ณ , 2์ฐจ ํญ๋ชฉ๋ ์ ๋ถ ์ด ์งํฉ์ด์ด์ผ ํ๋ค. ์์ ํ ๋ผ๋ฒจ(AI, Kubernetes,
DevOps, ai-application ๋ฑ)์ categories:๊ฐ ์๋๋ผ tags: ์ ๋ฃ๋๋ค.
| ์นดํ
๊ณ ๋ฆฌ(slug) | ๋๋น ๋ผ๋ฒจ | tier | cap(๋ชฉํ max) | ๋น๊ณ |
|---|
| culture | ๐จ Culture | 100 | ์ ๋(protected) | ์ญ์ ๊ธ์ง, humanizer ์ฌ์์ฑ |
| careers | ๐ค Careers | 100 | ์ ๋(protected) | ์ญ์ ๊ธ์ง |
| owm | ๐ OWM | 90 | 10 | ์ ๋ชจ๋ธ๋ก ๊ต์ฒด(refresh). ๋น๋ฉ์ธ ๋ชจ๋ธ โ news |
| research | ๐ Research | 70 | 30 | ์ต์ 30 |
| datasets | โ๏ธ Datasets | 60 | 11 | ์ต์ 11 |
| llmops | ๐ค LLMOps | 55 | 35 | ํต์ฌ๋ง |
| agentops | ๐๏ธ AgentOps | 50 | 20 | ํต์ฌ๋ง |
| comics | ๐ฌ Comics | 45 | ์ ๋ | ํ๋ณด ๋งํ(news-comic-strip ์ฐ์ถ), ์์ keep-all |
| dev | ๐ DevOps | 40 | 19 | K8s/vLLM/Ollama ์คํ |
| tutorials | ๐ป Tutorials | 10 | 20 | ํธ์ฆ์จ |
| news | ๐ News | 10 | 10 | ์ต์ company-fit only |
์นดํ
๊ณ ๋ฆฌ ์ถ๊ฐ ์: VALID_CATEGORIESยทPOLICYยท_pages/<lang>/categories/<slug>.mdยท
_data/navigation.yml 4๊ณณ ๋ชจ๋ ๊ฐฑ์ . ๋ท ์ค ํ๋๋ผ๋ ๋น ์ง๋ฉด orphan/๋ถ์ผ์น. stray ๋๋ ํ ๋ฆฌ๋ก
๊ธ์ ๋ง๋ค์ง ๋ง ๊ฒ.
cap ํฉ ~168 < 250 โ ์ ๊ท ์ฝํ
์ธ ํค๋๋ฃธ. cap์ "์ต์ N๊ฐ(๋ ์ง์)"๋ก ๊ธฐ๊ณ ์ ์ฉ.
ํ๋ ์ด์
์ค๋ฒ๋ผ์ด๋ (references/curation_overrides.json)
๊ธฐ๊ณ cap ์์ ์ฌ๋ ํ๋จ์ ์น๋๋ค(๊ฒฐ์ ๋ก ์ ์ง):
refresh_categories: ํด๋น ์นดํ
๊ณ ๋ฆฌ ๊ธฐ์กด ์ ๋ unpublish(์ ๋ฉด ๊ต์ฒด์ฉ, ์: owm).
force_unpublish / force_publish: ํน์ ๊ธ ๊ฒฝ๋ก ๊ฐ์ .
์ํฌํ๋ก
- ํํฉ:
blog_inventory.py โ ์นดํ
๊ณ ๋ฆฌ๋ณ ์นด์ดํธ ํ์ธ
- ํ๋:
blog_plan.py โ ์ธ์ด๋ณ published ์ยท๋ณ๊ฒฝ ๊ท๋ชจ ํ์ธ (dry)
- ์ ์ฉ:
blog_apply.py --write โ published: ํ๋๊ทธ ๊ธฐ๋ก
- ์ ๊ท/์ฌ์์ฑ: ์นดํ
๊ณ ๋ฆฌ ๋ ์ํผ(
references/category-recipes.md)๋ฅผ ์ฝํ
์ธ ๊ณ์ฝ์ผ๋ก ๋ฐ๋ฅธ๋ค โ
์นดํ
๊ณ ๋ฆฌ๋ง๋ค ํ์ ์ฐ์ถ๋ฌผ(์ด๋ฏธ์งยท์ํคํ
์ฒ ๋ํยท์ฝ๋ยท์์ค/GitHub/HF ๋งํฌยทGDrive ๋งํฌยทThakiCloud
๊ด์ ์น์
)๊ณผ ์ฌ์ฉ ์คํฌ์ด ์ ํด์ ธ ์๋ค. ๊ธ๋ง ์ฌ๋ฆฌ์ง ์๋๋ค. ๋น์ฃผ์ผ์ blog-author-pipeline.md
[3-D]๋ฅผ ๋ฐ๋ฅธ๋ค โ (0) NLM ์ฌ๋ผ์ด๋ ๊ฐค๋ฌ๋ฆฌ๊ฐ ๊ธฐ๋ณธ 1์ฐจ ๋น์ฃผ์ผ([[nlm-deck-blog-visuals]],
NotebookLM ๋ ๋ ์ฌ๋ผ์ด๋๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉ, gpt-image-2 hero๋ ์ ์งยทํด๋ฐฑ). ์คํ์ผ์ ํฌ์คํธ๋ง๋ค
๋๋ค ๋กํ
์ด์
(์ฌ์ฉ์ ์ง์ 2026-06-30 โ ๋งค ๊ธ ๊ฐ์ ์คํ์ผ๋ก ๊ตณ์ง ์๊ฒ ์ฝ๋ ์์ RNG๊ฐ ํ๋ ์ด์
ํ์์ 1๊ฐ; ๋ฐํ/์๊ฐ ๋ฑ๋ง jobs ๊ณ ์ ). humanizer ํต๊ณผ โ ํ๊ตญ์ด๋
[[korean-tone-reviewer]]๋ก ํฉ๋๋ค์ฒด ๊ฒฉ์ ํต์ผ โ en/ar ๋ฒ์ญ
([[blog-i18n-sync]]) โ _posts/<lang>/<cat>/์ ๋ฐฐ์น โ 2~3 ์ฌ์คํ(์๋ ๋๋กญ)
- ๊ฒ์ฆ/๋ฐฐํฌ: [[tech-blog-deploy]]๋ก ๋ก์ปฌ serve / push
์ด์ ๋ชฉ์ (๋ชจ๋ ๊ธ): ๊ฒ์ ์ ์
โ ํ์ฌ ํ๋ณดยท์ฑ์ฉยทํฌ์์ ์ดํ. research/owm/llmops/agentops๋
ThakiCloud ๊ด์ /์๋ ์น์
ํ์(category-recipes.md).
๊ฒ์ฆ (apply ์ ํ์)
blog_apply.py --write ์ ์ ํญ์ dry-run์ผ๋ก ๋ณ๊ฒฝ ๊ท๋ชจ๋ฅผ ํ์ธํ๋ค โ front-matter ๋๋
์ฌํฌ๋งท(692-diff ํญ๋ฐ)ยท์๋์น ์์ unpublish๋ฅผ ์ฌ์ ์ฐจ๋จํ๋ค.
blog_plan.py --json โ target_published ๋ณ๊ฒฝ ๊ฑด์ ํ์ธ
- ๋ณ๊ฒฝ ์๊ฐ ์์ ๋ฒ์๋ฉด VERDICT: PASS โ
blog_apply.py --write
- ๋ณ๊ฒฝ ์๊ฐ ๋น์ ์(์: ์ ์นดํ
๊ณ ๋ฆฌ unpublish)์ด๋ฉด VERDICT: FAIL โ
curation_overrides.json ์ ๊ฒ ํ ์ฌ์คํ
twitter ์ฐ๋
twitter-timeline-to-slack์ด ๋ธ๋ก๊ทธ ์ ํฉ ์ฃผ์ ์ ์ ์: ์นดํ
๊ณ ๋ฆฌ ๋ฐฐ์ โ humanizer ์ด์ โ
ํด๋น _posts/<lang>/<cat>/์ ๋ฐฐ์น โ blog_apply.py --write(์๋ 1๋ฃ๊ณ 1๋นผ๊ธฐ). ์์ธ references ์ฐธ์กฐ.
gotchas
set_published๋ published ๊ธ์์ published: ์ค์ ์ ๊ฑฐ(Jekyll ๊ธฐ๋ณธ=published) โ diff ์ต์.
unpublish ๊ธ์๋ง published: false ์ถ๊ฐ. YAML ์ ์ฒด ์ฌํฌ๋งท ๊ธ์ง(692๊ฐ diff ํญ๋ฐ ๋ฐฉ์ง).
- ๋ ์ง๋ ํ์ผ๋ช
YYYY-MM-DD-์์ ํ์ฑ(front-matter date๋ณด๋ค ์ ๋ขฐ). ํ์ฑ ์คํจ ์ 0000-00-00.
- owm/tutorials/news ๊ณผ๊ฑฐ ์ ๊ฑฐ๋ ๊ธฐ๋ณธ unpublish(๋ก์ปฌ ๋ณด์กด). ํ๋ ์ญ์ ๊ฐ ํ์ํ๋ฉด ๋ช
์ ์ง์ ํ git rm.