$npx -y skills add AgriciDaniel/claude-blog --skill blog-personaCreate and manage writing personas with NNGroup 4-dimension tone framework (Funny-Serious, Formal-Casual, Respectful-Irreverent, Enthusiastic-Matter-of-fact). Personas define readability targets, sentence length distribution, vocabulary tier, contraction frequency, and summary bo
| 1 | # Blog Persona - Writing Voice Management |
| 2 | |
| 3 | Create, store, and enforce writing personas based on the NNGroup 4-dimension tone |
| 4 | framework and CMI Brand Voice Chart. Personas ensure consistent voice across all |
| 5 | blog content produced by blog-write and blog-rewrite. |
| 6 | |
| 7 | ## Commands |
| 8 | |
| 9 | | Command | Purpose | |
| 10 | |---------|---------| |
| 11 | | `/blog persona create` | Interactive interview to build a new persona | |
| 12 | | `/blog persona list` | Show all saved personas | |
| 13 | | `/blog persona use <name>` | Set active persona for current session | |
| 14 | | `/blog persona show <name>` | Display full persona profile | |
| 15 | |
| 16 | ## Create Workflow |
| 17 | |
| 18 | Run the 6-step interactive interview. Ask each step, wait for response, then proceed. |
| 19 | |
| 20 | ### Step 1: Brand Basics |
| 21 | |
| 22 | Ask the user for: |
| 23 | - **Brand name** - company or personal brand |
| 24 | - **Industry** - primary sector (e.g., SaaS, health, finance, education) |
| 25 | - **Target audience** - who reads the blog (role, experience level, goals) |
| 26 | - **One-sentence brand mission** - what the brand helps people do |
| 27 | |
| 28 | ### Step 2: Tone Dimensions (NNGroup Framework) |
| 29 | |
| 30 | Present each dimension as a 0.0 to 1.0 slider. Explain both ends with examples. |
| 31 | |
| 32 | | Dimension | 0.0 End | 1.0 End | Example at 0.0 | Example at 1.0 | |
| 33 | |-----------|---------|---------|-----------------|-----------------| |
| 34 | | funny_serious | Funny | Serious | "Let's be real, nobody reads Terms of Service" | "Understanding legal agreements protects your business" | |
| 35 | | formal_casual | Formal | Casual | "We are pleased to announce" | "Guess what - we shipped it!" | |
| 36 | | respectful_irreverent | Respectful | Irreverent | "We appreciate your patience" | "Yeah, that old way was broken" | |
| 37 | | enthusiastic_matter_of_fact | Enthusiastic | Matter-of-fact | "This changes everything!" | "Here are the results." | |
| 38 | |
| 39 | Defaults if user is unsure: `[0.6, 0.5, 0.3, 0.5]` (slightly serious, balanced formality, |
| 40 | respectful, balanced enthusiasm). |
| 41 | |
| 42 | ### Step 3: Writing Rules |
| 43 | |
| 44 | Ask the user to pick a **vocabulary tier** first, then auto-suggest the matching |
| 45 | readability band (user can override). |
| 46 | |
| 47 | | Setting | What to Ask | Default | |
| 48 | |---------|-------------|---------| |
| 49 | | Vocabulary tier | Consumer, Professional, or Technical | Professional | |
| 50 | | Readability band | Auto-filled from tier (see table below) | Grade 8-10 | |
| 51 | | Sentence length mean | Average words per sentence | 18 | |
| 52 | | Sentence length std | Variation in sentence length | 6 | |
| 53 | | Contraction frequency | 0.0 (never) to 1.0 (always) | 0.6 | |
| 54 | | Max passive voice | Percentage cap on passive constructions | 10% | |
| 55 | |
| 56 | ### Step 4: Do's and Don'ts (CMI Brand Voice Chart) |
| 57 | |
| 58 | Ask for 3-5 items in each list. Provide starter examples based on the tone dimensions. |
| 59 | |
| 60 | **Example Do's:** "Use data to back claims", "Address the reader as you", |
| 61 | "Open with a question or stat" |
| 62 | |
| 63 | **Example Don'ts:** "Don't use jargon without defining it", "Don't start sentences |
| 64 | with There is/There are", "Don't use cliches like game-changer" |
| 65 | |
| 66 | ### Step 5: Summary Label Preference |
| 67 | |
| 68 | The label used for summary/takeaway boxes in blog posts. Ask user to pick one: |
| 69 | |
| 70 | - Key Takeaways (default) |
| 71 | - The Bottom Line |
| 72 | - What You'll Learn |
| 73 | - TL;DR |
| 74 | - Quick Summary |
| 75 | - In a Nutshell |
| 76 | - Custom label |
| 77 | |
| 78 | ### Step 6: Voice Samples (Optional) |
| 79 | |
| 80 | Ask if the user has 1-3 URLs of existing content that exemplifies the desired voice. |
| 81 | Store URLs in the persona for future reference. If provided, read each URL and extract: |
| 82 | - Average sentence length |
| 83 | - Contraction frequency |
| 84 | - Tone dimension estimates |
| 85 | - Vocabulary level |
| 86 | |
| 87 | Compare extracted values with the persona settings and flag any mismatches. |
| 88 | |
| 89 | ### Save |
| 90 | |
| 91 | Write the completed persona as JSON to: |
| 92 | `skills/blog/references/personas/<name>.json` |
| 93 | |
| 94 | Use kebab-case for the filename (e.g., `acme-saas.json`). |
| 95 | |
| 96 | ## Persona Profile Schema |
| 97 | |
| 98 | ```json |
| 99 | { |
| 100 | "name": "acme-saas", |
| 101 | "description": "Professional SaaS voice for B2B marketing content", |
| 102 | "brand": "Acme Corp", |
| 103 | "industry": "SaaS", |
| 104 | "audience": "Marketing managers at mid-market companies", |
| 105 | "mission": "Help marketing teams automate reporting", |
| 106 | "tone_dimensions": { |
| 107 | "funny_serious": 0.7, |
| 108 | "formal_casual": 0.4, |
| 109 | "respectful_irreverent": 0.2, |
| 110 | "enthusiastic_matter_of_fact": 0.5 |
| 111 | }, |
| 112 | "readability": { |
| 113 | "flesch_grade_min": 8, |
| 114 | "flesch_grade_max": 10, |
| 115 | "flesch_ease_min": 50, |
| 116 | "flesch_ease_max": 60 |
| 117 | }, |
| 118 | "style": { |
| 119 | "sentence_length_mean": 18, |
| 120 | "sentence_length_std": 6, |
| 121 | "contraction_frequency": 0.6, |
| 122 | "passive_voice_max_pct": 10, |
| 123 | "vocabular |