- Add claude-md-guardian agent with SessionStart hook for auto CLAUDE.md maintenance - Add 6 thinking commands: /my-world, /emerge, /challenge, /connect, /today, /close - Add my-world skill for one-shot vault context loading - Fix command injection vulnerability in init-vault.sh (use env vars) - Add error handling and logging to vault-sync.sh - Update write-article skill with complete frontmatter fields - Upgrade CLAUDE.md to v1.3.0 with cycle time tracking and exit criteria Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
5.7 KiB
5.7 KiB
| name | description |
|---|---|
| write-article | Generate articles from topics and outlines stored in an Obsidian vault. This skill should be used when creating long-form content such as tech blogs, opinion pieces, tutorials, or social posts from structured topic briefs. Depends on obsidian:obsidian-cli for all vault read/write operations. Trigger words: 写文章、写作、生成草稿、技术博客、观点文、教程、社交短文、 article、blog post、draft。 |
Write-Article:Obsidian 文章写作技能
目标
用统一流程产出可发布草稿,避免无来源、无结构、无 frontmatter 的半成品。
输入要求
必须提供:
topic:文章主题(1 句话)style:tech_blog|opinion|tutorial|social_shortaudience:目标读者source_notes:至少 1 个 Obsidian note 路径(vault 相对路径)tags:1-5 个标签
可选但建议提供:
title:文章标题slug:文件 slug(英文短横线)length_target:目标字数或段落数cta:结尾行动建议publish_channel:发布渠道
强制工作流(不得跳步)
Step 1:读取素材
逐个读取 source_notes 中的笔记,确认事实边界。
obsidian read path="<source_note_path_1>"
obsidian read path="<source_note_path_2>"
执行要求:
source_notes中每个路径都要读取。- 未读完素材前,禁止进入写作。
- 素材不足以支撑结论时,输出
[?]标记并向用户索要补充信息。
Step 2:生成文章草稿
按 references/writing-styles.md 选择对应风格模板生成正文。
执行要求:
- 只使用已读取素材中的事实。
- 观点必须有论证链,不得堆砌口号。
- 内容结构必须匹配所选风格的"结构"要求。
Step 3:创建草稿文件
将生成的 Markdown 写入 02-drafts/ 目录。
obsidian create path="02-drafts/<YYYY-MM-DD>-<slug>.md" content="<ARTICLE_MARKDOWN>"
执行要求:
- 目标目录必须是
02-drafts/。 - 文件名必须包含日期前缀与 slug。
- 正文必须是 Markdown,可直接发布或二次编辑。
Step 4:设置 frontmatter
对 Step 3 产物逐项设置元数据。
# 先 cd 到 vault 目录
cd /home/kang/apps/content-forge/content-forge
# CLAUDE.md 必填字段
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="id" value="<YYYY-MM-DD>-<slug>"
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="title" value="<title>"
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="slug" value="<slug>"
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="status" value="draft"
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="content_type" value="article"
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="channels" value="[\"wechat\",\"x\"]" type=list
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="language" value="zh-CN"
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="source_urls" value="[]" type=list
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="assets" value="[]" type=list
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="cover_image" value=""
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="template" value="article"
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="owner" value="content-forge"
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="created_at" value="<YYYY-MM-DD>T00:00:00+08:00"
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="updated_at" value="<YYYY-MM-DD>T00:00:00+08:00"
# 技能扩展字段(可选)
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="style" value="<style>"
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="audience" value="<audience>"
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="tags" value="[\"tag1\",\"tag2\"]" type=list
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="source_notes" value="[\"note1.md\"]" type=list
最小 frontmatter 字段集合(对齐 CLAUDE.md §4.2):
id,title,slug,status,content_type,channels,languagesource_urls,assets,cover_image,template,ownercreated_at,updated_at
技能扩展字段(可选):
style— 写作风格(tech_blog/opinion/tutorial/social_short)audience— 目标读者tags— 标签列表source_notes— 来源笔记路径
输出约束
- 输出仅包含文章草稿及必要元数据,不输出无关解释。
- 文章语言默认中文,除非用户显式要求其他语言。
- 禁止编造数据、案例、引文、实验结果。
- 未确认的事实必须标记
[?],并明确缺失项。 - 结构必须符合所选风格规范(见
references/writing-styles.md)。 - 段落应可读,避免空泛套话与重复表达。
质量检查(交付前必须全部通过)
- 所有
source_notes已执行obsidian read - 文章结构与目标风格一致
- 关键结论可追溯到输入素材
- 草稿已通过
obsidian create写入02-drafts/ - frontmatter 必填字段已通过
obsidian property:set完整设置 - 标题、slug、标签与内容主题一致
- 不存在事实捏造与无依据断言
失败处理
- 缺少必要输入时,返回:
[?] 缺失输入:<字段名>,并停止写入。 obsidian命令失败时,返回:[✗] <命令> 失败:<错误信息>,并停止后续步骤。- 如果无法确定风格,默认使用
tech_blog,同时显式告知用户。
风格参考
references/writing-styles.md