From article-writer
Creates author profiles via questionnaire or transcript analysis using voice-extractor script for consistent voice across articles.
npx claudepluginhub mwguerra/claude-code-plugins --plugin article-writerThis skill uses the workspace's default tool permissions.
Create and maintain consistent author voice across all articles.
Extracts speaking style, signature phrases, vocabulary, and sentence patterns from transcripts to build or refine author profiles for authentic AI content.
Captures and refines user's writing voice into AUTHOR_VOICE.md via discovery questions, drafts, sample generation, and feedback cycles for AI mimicking tone/style.
Generates personalized AI writer skill by extracting linguistic fingerprint from interactive writing samples, style preferences, and pattern rejection questionnaire (~15 min).
Share bugs, ideas, or general feedback.
Create and maintain consistent author voice across all articles.
Stored in: .article_writer/article_writer.db (authors table)
Schema: .article_writer/schemas/authors.schema.json
Ask questions in conversational groups (2-3 at a time):
Use Skill(voice-extractor) for transcript analysis.
If the author has recordings (podcasts, interviews, videos, meetings):
bun run "${CLAUDE_PLUGIN_ROOT}"/scripts/voice-extractor.ts --speaker "Name" transcripts/*.txt
Best results come from combining both:
{
"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..."
}
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 |
When writing articles, use voice_analysis data:
avg_length and varietycommunication_style traitscharacteristic_expressions naturallysignature_vocabularysentence_starters{slug}.{language}.mdExample 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
If article task doesn't specify author:
sort_order in the database is used# 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)