blog-persona

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Blog Persona - Writing Voice Management

博客写作角色 - 语气管理

Create, store, and enforce writing personas based on the NNGroup 4-dimension tone framework and CMI Brand Voice Chart. Personas ensure consistent voice across all blog content produced by blog-write and blog-rewrite.
基于NNGroup四维语气框架和CMI品牌语气图表创建、存储并执行写作角色。写作角色可确保blog-write和blog-rewrite生成的所有博客内容语气一致。

Commands

命令

CommandPurpose
/blog persona create
Interactive interview to build a new persona
/blog persona list
Show all saved personas
/blog persona use <name>
Set active persona for current session
/blog persona show <name>
Display full persona profile
命令用途
/blog persona create
交互式访谈以创建新角色
/blog persona list
显示所有已保存的角色
/blog persona use <name>
设置当前会话的活跃角色
/blog persona show <name>
显示完整的角色档案

Create Workflow

创建流程

Run the 6-step interactive interview. Ask each step, wait for response, then proceed.
运行6步交互式访谈。依次询问每一步,等待用户回复后再继续。

Step 1: Brand Basics

步骤1:品牌基础

Ask the user for:
  • Brand name - company or personal brand
  • Industry - primary sector (e.g., SaaS, health, finance, education)
  • Target audience - who reads the blog (role, experience level, goals)
  • One-sentence brand mission - what the brand helps people do
询问用户以下信息:
  • 品牌名称 - 企业或个人品牌
  • 行业 - 核心领域(如SaaS、健康、金融、教育)
  • 目标受众 - 博客的读者群体(角色、经验水平、目标)
  • 一句话品牌使命 - 品牌能为用户提供什么帮助

Step 2: Tone Dimensions (NNGroup Framework)

步骤2:语气维度(NNGroup框架)

Present each dimension as a 0.0 to 1.0 slider. Explain both ends with examples.
Dimension0.0 End1.0 EndExample at 0.0Example at 1.0
funny_seriousFunnySerious"Let's be real, nobody reads Terms of Service""Understanding legal agreements protects your business"
formal_casualFormalCasual"We are pleased to announce""Guess what - we shipped it!"
respectful_irreverentRespectfulIrreverent"We appreciate your patience""Yeah, that old way was broken"
enthusiastic_matter_of_factEnthusiasticMatter-of-fact"This changes everything!""Here are the results."
Defaults if user is unsure:
[0.6, 0.5, 0.3, 0.5]
(slightly serious, balanced formality, respectful, balanced enthusiasm).
将每个维度展示为0.0到1.0的滑块,并用示例解释两端的含义。
维度0.0端1.0端0.0端示例1.0端示例
funny_serious诙谐严肃"说实话,没人会读服务条款""理解法律协议能保护您的业务"
formal_casual正式随意"我们很高兴宣布""猜猜看——我们上线了!"
respectful_irreverent恭敬不敬"感谢您的耐心等待""没错,旧方法已经行不通了"
enthusiastic_matter_of_fact热情实事求是"这彻底改变了一切!""以下是结果。"
若用户不确定,默认值为:
[0.6, 0.5, 0.3, 0.5]
(略带严肃、正式与随意平衡、恭敬、热情与实事求是平衡)。

Step 3: Writing Rules

步骤3:写作规则

Ask the user to pick a vocabulary tier first, then auto-suggest the matching readability band (user can override).
SettingWhat to AskDefault
Vocabulary tierConsumer, Professional, or TechnicalProfessional
Readability bandAuto-filled from tier (see table below)Grade 8-10
Sentence length meanAverage words per sentence18
Sentence length stdVariation in sentence length6
Contraction frequency0.0 (never) to 1.0 (always)0.6
Max passive voicePercentage cap on passive constructions10%
先询问用户选择词汇层级,然后自动推荐匹配的可读性区间(用户可覆盖)。
设置询问内容默认值
词汇层级大众级、专业级或技术级专业级
可读性区间根据层级自动填充(见下表)8-10年级水平
平均句子长度平均每句单词数18
句子长度标准差句子长度的变化幅度6
缩写使用频率0.0(从不)至1.0(总是)0.6
被动语态上限被动句式的占比上限10%

Step 4: Do's and Don'ts (CMI Brand Voice Chart)

步骤4:注意事项(CMI品牌语气图表)

Ask for 3-5 items in each list. Provide starter examples based on the tone dimensions.
Example Do's: "Use data to back claims", "Address the reader as you", "Open with a question or stat"
Example Don'ts: "Don't use jargon without defining it", "Don't start sentences with There is/There are", "Don't use cliches like game-changer"
询问用户在每个列表中提供3-5项内容。根据语气维度提供示例参考。
示例注意事项(Do): "用数据支撑观点"、"用‘你’称呼读者"、"以问题或数据开篇"
示例注意事项(Don't): "不要使用未定义的行话"、"不要以‘There is/There are’开头"、"不要使用‘game-changer’这类陈词滥调"

Step 5: Summary Label Preference

步骤5:摘要标签偏好

The label used for summary/takeaway boxes in blog posts. Ask user to pick one:
  • Key Takeaways (default)
  • The Bottom Line
  • What You'll Learn
  • TL;DR
  • Quick Summary
  • In a Nutshell
  • Custom label
博客文章中摘要/要点框使用的标签。让用户选择以下选项之一:
  • Key Takeaways(默认)
  • The Bottom Line
  • What You'll Learn
  • TL;DR
  • Quick Summary
  • In a Nutshell
  • 自定义标签

Step 6: Voice Samples (Optional)

步骤6:语气示例(可选)

Ask if the user has 1-3 URLs of existing content that exemplifies the desired voice. Store URLs in the persona for future reference. If provided, read each URL and extract:
  • Average sentence length
  • Contraction frequency
  • Tone dimension estimates
  • Vocabulary level
Compare extracted values with the persona settings and flag any mismatches.
询问用户是否有1-3个体现理想语气的现有内容URL。将URL存储在角色档案中供后续参考。若提供URL,读取每个URL并提取:
  • 平均句子长度
  • 缩写使用频率
  • 语气维度估算值
  • 词汇水平
将提取的值与角色设置进行比较,标记任何不匹配之处。

Save

保存

Write the completed persona as JSON to:
skills/blog/references/personas/<name>.json
Use kebab-case for the filename (e.g.,
acme-saas.json
).
将完成的角色以JSON格式写入:
skills/blog/references/personas/<name>.json
文件名使用短横线分隔的小写格式(如
acme-saas.json
)。

Persona Profile Schema

角色档案架构

json
{
  "name": "acme-saas",
  "description": "Professional SaaS voice for B2B marketing content",
  "brand": "Acme Corp",
  "industry": "SaaS",
  "audience": "Marketing managers at mid-market companies",
  "mission": "Help marketing teams automate reporting",
  "tone_dimensions": {
    "funny_serious": 0.7,
    "formal_casual": 0.4,
    "respectful_irreverent": 0.2,
    "enthusiastic_matter_of_fact": 0.5
  },
  "readability": {
    "flesch_grade_min": 8,
    "flesch_grade_max": 10,
    "flesch_ease_min": 50,
    "flesch_ease_max": 60
  },
  "style": {
    "sentence_length_mean": 18,
    "sentence_length_std": 6,
    "contraction_frequency": 0.6,
    "passive_voice_max_pct": 10,
    "vocabulary_tier": "professional",
    "summary_label": "Key Takeaways"
  },
  "voice_samples": [],
  "do": [
    "Use data to back every major claim",
    "Address the reader directly as you",
    "Lead sections with actionable insight"
  ],
  "dont": [
    "Don't use buzzwords without context",
    "Don't write sentences longer than 30 words",
    "Don't open with We at Acme"
  ]
}
json
{
  "name": "acme-saas",
  "description": "Professional SaaS voice for B2B marketing content",
  "brand": "Acme Corp",
  "industry": "SaaS",
  "audience": "Marketing managers at mid-market companies",
  "mission": "Help marketing teams automate reporting",
  "tone_dimensions": {
    "funny_serious": 0.7,
    "formal_casual": 0.4,
    "respectful_irreverent": 0.2,
    "enthusiastic_matter_of_fact": 0.5
  },
  "readability": {
    "flesch_grade_min": 8,
    "flesch_grade_max": 10,
    "flesch_ease_min": 50,
    "flesch_ease_max": 60
  },
  "style": {
    "sentence_length_mean": 18,
    "sentence_length_std": 6,
    "contraction_frequency": 0.6,
    "passive_voice_max_pct": 10,
    "vocabulary_tier": "professional",
    "summary_label": "Key Takeaways"
  },
  "voice_samples": [],
  "do": [
    "Use data to back every major claim",
    "Address the reader directly as you",
    "Lead sections with actionable insight"
  ],
  "dont": [
    "Don't use buzzwords without context",
    "Don't write sentences longer than 30 words",
    "Don't open with We at Acme"
  ]
}

Readability Bands by Vocabulary Tier

各词汇层级对应的可读性区间

TierFlesch GradeFlesch EaseTypical Use
Consumer6-860-80Health, lifestyle, personal finance
Professional8-1050-60B2B, marketing, management
Technical10-1230-50Engineering, medical, legal
When the user picks a tier, auto-fill the readability fields. Let them override if they want a non-standard combination (e.g., technical vocabulary at consumer readability for explainer content).
层级Flesch年级水平Flesch易读度典型用途
大众级6-860-80健康、生活方式、个人理财
专业级8-1050-60B2B、营销、管理
技术级10-1230-50工程、医疗、法律
当用户选择层级后,自动填充可读性字段。若用户需要非标准组合(如面向大众可读性的技术词汇解释内容),允许其覆盖默认值。

Integration with blog-write and blog-rewrite

与blog-write和blog-rewrite的集成

When a persona is active (via
/blog persona use <name>
), the writer agent loads the persona JSON and enforces these constraints during generation:
  1. Pre-generation - Load persona, inject tone dimensions and style rules into the system prompt for the blog-writer agent.
  2. During generation - Writer follows do/dont rules, targets sentence length mean/std, uses contractions at specified frequency.
  3. Post-generation validation - Check the output against persona constraints:
    • Sentence length distribution within 1 std of target mean
    • Readability score within the specified grade band
    • Passive voice percentage under the max
    • No violations of "dont" rules found via pattern matching
If validation fails, flag the specific violations and suggest edits.
当角色处于活跃状态(通过
/blog persona use <name>
命令)时,写作Agent会加载角色JSON,并在生成内容时执行以下约束:
  1. 生成前 - 加载角色,将语气维度和风格规则注入blog-writer Agent的系统提示词中。
  2. 生成过程中 - 写作遵循Do/Don't规则,以目标平均句子长度/标准差为基准,按指定频率使用缩写。
  3. 生成后验证 - 检查输出是否符合角色约束:
    • 句子长度分布在目标平均值的1个标准差范围内
    • 可读性分数在指定年级区间内
    • 被动语态占比低于上限
    • 通过模式匹配未发现违反Don't规则的内容
若验证失败,标记具体违规内容并建议修改。

List Command

列表命令

Glob
skills/blog/references/personas/*.json
and display a table:
PersonaIndustryAudienceVocabulary
acme-saasSaaSMarketing managersProfessional
If no personas exist, prompt the user to create one.
遍历
skills/blog/references/personas/*.json
文件并显示表格:
角色行业受众词汇层级
acme-saasSaaS营销经理(中型企业)专业级
若不存在任何角色,提示用户创建一个。

Show Command

展示命令

Read the specified persona JSON and display it as a formatted summary with all tone dimensions, style rules, and do/dont lists.
读取指定的角色JSON文件,以格式化摘要的形式显示所有语气维度、风格规则和Do/Don't列表。

Use Command

使用命令

Read the persona JSON and confirm activation. Print a summary of the key constraints that will be enforced. The persona stays active for the current conversation session. Blog-write and blog-rewrite check for the active persona before generating content.
读取角色JSON并确认激活。打印将执行的关键约束摘要。该角色在当前对话会话中保持活跃状态。blog-write和blog-rewrite在生成内容前会检查是否有活跃角色。

Error Handling

错误处理

  • Invalid tone values: If a user provides values outside 0.0-1.0, clamp to the nearest valid bound and warn
  • Unreachable voice samples: If a URL in voice_samples returns an error, skip it and note in the profile that the sample was unavailable
  • Empty personas directory: When running list or show with no personas saved, prompt the user to create one first
  • Name conflicts: If a persona name already exists during create, ask whether to overwrite or choose a different name
  • Malformed JSON: If a persona file is corrupted, report the error and offer to recreate it from the interview
  • 无效语气值:若用户提供的值超出0.0-1.0范围,将其限制为最近的有效值并发出警告
  • 无法访问的语气示例:若voice_samples中的URL返回错误,跳过该URL并在档案中注明示例不可用
  • 角色目录为空:当运行列表或展示命令但未保存任何角色时,提示用户先创建一个
  • 名称冲突:创建角色时若名称已存在,询问用户是否覆盖或选择其他名称
  • JSON格式错误:若角色文件损坏,报告错误并提供通过访谈重新创建的选项