npx claudepluginhub mwguerra/claude-code-plugins --plugin article-writerWant just this skill?
Add to a custom plugin, then install with one command.
Create author profiles via questionnaire or transcript analysis for consistent article voice
This skill uses the workspace's default tool permissions.
Author Profile
Create and maintain consistent author voice across all articles.
Profile Location
Stored in: .article_writer/article_writer.db (authors table)
Schema: .article_writer/schemas/authors.schema.json
Two Ways to Create an Author
Option 1: Manual Questionnaire
Ask questions in conversational groups (2-3 at a time):
Identity
- What name/identifier for this author? (e.g., "mwguerra")
- Display name? (e.g., "MW Guerra")
- Professional role(s)?
- Years/areas of experience?
- Expertise areas?
Languages
- Primary writing language? (e.g., pt_BR, en_US)
- Translation target languages?
Tone (1-10)
- Casual (1) vs Formal (10)?
- Neutral (1) vs Opinionated (10)?
Vocabulary
- Terms readers know (use freely)?
- Terms to always explain?
Style
- Signature phrases?
- Phrases to avoid?
Positions
- Strong technology opinions?
- Topics to stay neutral on?
Example
- Write 2-3 sentences in your voice as example.
Option 2: Extract from Transcripts
Use Skill(voice-extractor) for transcript analysis.
If the author has recordings (podcasts, interviews, videos, meetings):
- Prepare transcripts - Get transcription files with speaker labels
- Run analysis:
bun run "${CLAUDE_PLUGIN_ROOT}"/scripts/voice-extractor.ts --speaker "Name" transcripts/*.txt - Review extracted data - Communication style, phrases, vocabulary
- Add identity info - Name, role, expertise, languages (manual)
- Merge - Combine extracted + manual data
Option 3: Combined Approach (Recommended)
Best results come from combining both:
- Extract voice patterns from transcripts
- Add identity/expertise info manually
- Review and refine the merged profile
Author JSON Structure
{
"id": "author-slug",
"name": "Display Name",
"languages": ["pt_BR", "en_US"],
"role": "Senior Developer",
"experience": "10+ years",
"expertise": ["Laravel", "PHP", "Architecture"],
"tone": {
"formality": 4,
"opinionated": 7
},
"vocabulary": {
"use_freely": ["Controllers", "Middleware", "API"],
"always_explain": ["DDD", "CQRS", "Event Sourcing"]
},
"phrases": {
"signature": ["Na prática...", "Vamos direto ao ponto:"],
"avoid": ["Simplesmente", "É só fazer..."]
},
"opinions": {
"strong_positions": ["Tests are essential", "Fat models are bad"],
"stay_neutral": ["Tabs vs spaces", "IDE preferences"]
},
"example_voice": "Sample paragraph in author's voice...",
"voice_analysis": {
"extracted_from": ["podcast_ep1.txt", "interview.txt"],
"sample_count": 156,
"total_words": 12450,
"sentence_structure": {
"avg_length": 14.5,
"variety": "moderate length, conversational",
"question_ratio": 12.3
},
"communication_style": [
{ "trait": "enthusiasm", "percentage": 28.5 },
{ "trait": "analytical", "percentage": 24.1 }
],
"characteristic_expressions": ["you know", "the thing is"],
"sentence_starters": ["I think", "So the"],
"signature_vocabulary": ["approach", "strategy", "implementation"],
"analyzed_at": "2025-01-15T10:00:00Z"
},
"notes": "Additional style notes..."
}
Voice Analysis Fields
When transcripts are analyzed, these fields are populated:
| Field | Description |
|---|---|
extracted_from | Transcript files analyzed |
sample_count | Speaking turns analyzed |
total_words | Total words in analysis |
sentence_structure | Length, variety, question frequency |
communication_style | Traits: enthusiasm, hedging, directness, etc. |
characteristic_expressions | Frequently used phrases/fillers |
sentence_starters | Common ways to start sentences |
signature_vocabulary | Words that characterize the speaker |
Using Voice Analysis When Writing
When writing articles, use voice_analysis data:
- Sentence structure: Match
avg_lengthandvariety - Tone: Follow
communication_styletraits - Natural speech: Sprinkle
characteristic_expressionsnaturally - Vocabulary: Prefer words from
signature_vocabulary - Sentence starters: Use patterns from
sentence_starters
Multi-Language Workflow
- Article written in author's primary language (first in array)
- After completion, translated to other languages
- Each file named:
{slug}.{language}.md
Example for author with ["pt_BR", "en_US"]:
content/articles/2025_01_15_rate-limiting/
├── rate-limiting.pt_BR.md # Primary (written first)
└── rate-limiting.en_US.md # Translation
Default Author
If article task doesn't specify author:
- Author with lowest
sort_orderin the database is used - Their language settings apply
- Their voice/tone is followed
Updating Authors
Add More Transcript Data
# Analyze new transcripts for existing author
bun run "${CLAUDE_PLUGIN_ROOT}"/scripts/voice-extractor.ts \
--speaker "Name" \
--author-json \
new_podcast.txt > new_analysis.json
# Merge into existing profile (manually or via command)
When to Update
- New transcript data available
- Writing style evolves
- Feedback indicates tone mismatch
- New expertise develops