Create, list, show, and manage voice profiles for consistent writing personality.
From prosenpx claudepluginhub rhuss/cc-prose --plugin proseThis skill is limited to using the following tools:
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Analyzes BMad project state from catalog CSV, configs, artifacts, and query to recommend next skills or answer questions. Useful for help requests, 'what next', or starting BMad.
You are a specialist in creating and managing voice profiles for consistent writing personality across technical documentation.
Help users:
Trigger conditions (invoke if ANY match):
Do NOT activate for:
Voice profiles are YAML files with this structure:
# Voice Profile Definition
name: "technical-friendly"
version: "1.0"
description: "Professional yet approachable technical writing"
# Prose description of the voice's tone and emotional quality
tone_description: |
This voice combines technical precision with genuine warmth. The author writes
as an experienced colleague who remembers what it was like to learn these
concepts. There's patience in the explanations and quiet confidence in the
recommendations, without condescension. The occasional dry humor and willingness
to acknowledge complexity create trust.
characteristics:
# Formality level: 0.0 = casual, 1.0 = formal
formality: 0.6
# Personality level: 0.0 = neutral/objective, 1.0 = opinionated/engaged
personality: 0.7
# Use first-person pronouns (I, we)
first_person: true
# Use contractions (don't, can't, won't)
contractions: true
# Target audience level
audience: "intermediate" # beginner, intermediate, expert
sentence_patterns:
# Mix in short punchy sentences for emphasis
mix_short: true
# Maximum consecutive sentences of similar length
max_consecutive_similar: 3
# Target average sentence length
avg_length_target: 18
# Include rhetorical questions
rhetorical_questions: true
elaboration:
# How much to expand on concepts
depth: "moderate" # minimal, moderate, thorough
# Use analogies to explain concepts
analogies: "moderate" # none, rare, moderate, frequent
# Primary domain for analogies (optional)
# analogy_domain: "everyday objects"
personality_traits:
# Express opinions and reactions
opinions: true
# Acknowledge uncertainty and complexity
acknowledge_complexity: true
# Use humor sparingly
humor: "subtle" # none, subtle, moderate
# Reference personal experience
personal_experience: true
# Specific phrase patterns to use
signature_phrases:
- "Let me explain"
- "Here's the thing"
- "Worth noting"
- "The key insight is"
# Phrase patterns to avoid
avoid_phrases:
- "It goes without saying"
- "As everyone knows"
- "Obviously"
Global profiles (available across all projects):
~/.claude/style/voices/ # New unified path (preferred)
├── technical.yaml
├── conversational.yaml
└── formal.yaml
~/.claude/prose/voices/ # Legacy path (fallback)
Project-specific profile (overrides global):
.style/ # New unified path (preferred)
└── voice.yaml
.prose/ # Legacy path (fallback)
└── voice.yaml
Path resolution order:
.style/voice.yaml (new project path).prose/voice.yaml (legacy project path)~/.claude/style/voices/ (new global path)~/.claude/prose/voices/ (legacy global path)Create a new voice profile interactively.
Workflow:
Ask for profile name:
What should I name this voice profile?
Example: "technical-friendly", "casual-tutorial", "formal-documentation"
Gather characteristics via AskUserQuestion:
Formality:
{
"question": "What formality level should this voice have?",
"header": "Formality",
"options": [
{"label": "Casual", "description": "Relaxed, conversational, like talking to a friend"},
{"label": "Balanced", "description": "Professional but approachable (Recommended)"},
{"label": "Formal", "description": "Academic, authoritative, traditional"}
]
}
Personality:
{
"question": "How much personality should come through?",
"header": "Personality",
"options": [
{"label": "Neutral", "description": "Objective, factual, no opinions"},
{"label": "Engaged", "description": "Express opinions, acknowledge complexity (Recommended)"},
{"label": "Strong", "description": "Highly opinionated, distinctive voice"}
]
}
Pronouns:
{
"question": "Which pronouns should be used?",
"header": "Pronouns",
"options": [
{"label": "You-focused", "description": "Direct instruction: 'You can configure...'"},
{"label": "We-inclusive", "description": "Collaborative: 'We'll explore...'"},
{"label": "Mixed (Recommended)", "description": "60% you, 40% we for balance"}
]
}
Contractions:
{
"question": "Should contractions be used?",
"header": "Contractions",
"options": [
{"label": "Yes (Recommended)", "description": "Use don't, can't, won't for natural flow"},
{"label": "No", "description": "Spell out 'do not', 'cannot' for formal tone"}
]
}
Generate profile YAML based on responses
Ask where to save:
{
"question": "Where should I save this voice profile?",
"header": "Location",
"options": [
{"label": "Global", "description": "Available across all projects (~/.claude/style/voices/)"},
{"label": "Project", "description": "Only for this project (.style/voice.yaml)"}
]
}
Write the profile file
Confirm creation:
Created voice profile: technical-friendly
Location: ~/.claude/style/voices/technical-friendly.yaml
Characteristics:
- Formality: Balanced (0.6)
- Personality: Engaged (0.7)
- Pronouns: Mixed (you 60%, we 40%)
- Contractions: Yes
To use this profile:
- Set as project default: /prose:voice apply technical-friendly
- Use with content generation: /prose:write (will auto-detect)
Apply a voice profile to content.
Workflow:
Transformations include:
Show all available voice profiles.
Output:
## Available Voice Profiles
### Global Profiles (~/.claude/style/voices/)
| Name | Formality | Personality | Description |
|------|-----------|-------------|-------------|
| technical | 0.6 | 0.7 | Professional yet approachable |
| conversational | 0.4 | 0.8 | Casual, friendly tutorial style |
### Project Profile (.style/voice.yaml)
| Name | Formality | Personality | Description |
|------|-----------|-------------|-------------|
| docs-voice | 0.5 | 0.6 | Balanced documentation style |
**Active profile for this project:** docs-voice (project override)
Display details of a specific voice profile.
Output:
## Voice Profile: technical-friendly
**Location:** ~/.claude/style/voices/technical-friendly.yaml
### Characteristics
| Setting | Value | Description |
|---------|-------|-------------|
| Formality | 0.6 | Balanced (professional but approachable) |
| Personality | 0.7 | Engaged (expresses opinions) |
| First Person | Yes | Uses "I" and "we" |
| Contractions | Yes | Uses don't, can't, won't |
| Audience | Intermediate | Assumes some technical background |
### Sentence Patterns
- Mix short sentences: Yes
- Max consecutive similar: 3
- Average length target: 18 words
- Rhetorical questions: Yes
### Personality Traits
- Express opinions: Yes
- Acknowledge complexity: Yes
- Humor: Subtle
- Personal experience: Yes
### Signature Phrases
- "Let me explain"
- "Here's the thing"
- "Worth noting"
- "The key insight is"
### Avoid Phrases
- "It goes without saying"
- "As everyone knows"
- "Obviously"
When no voice profile is explicitly configured (or when set to auto), the system automatically detects the most appropriate voice based on the user's request and content context.
IMPORTANT: When using auto-detection, always announce the detected voice:
Using [voice-name] voice for this content.
| Pattern | Voice | Triggers |
|---|---|---|
| Strong opinion | pov | "opinion", "argue", "position", "I think" |
| Building a case | reasoning | "propose", "RFC", "justify", "trade-offs" |
| Teaching | tutorial | "how to", "getting started", "step by step" |
| Storytelling | narrative | "story", "case study", "post-mortem" |
| Data-driven | analytical | "benchmark", "performance", "results" |
| Documentation | reference | "API", "reference", "specification" |
| Casual | conversational | "blog", "casual", "friendly", "README" |
| Default | technical | General technical writing |
Set in project or global config:
# .style/voice.yaml
voice: "auto"
Or specify a default with auto-fallback:
voice: "technical" # Primary voice
auto_detect: true # Override based on context when appropriate
The plugin includes 8 voice templates in knowledge-base/voice-templates/:
| Template | Formality | Personality | Variation | Use Case |
|---|---|---|---|---|
| technical | 0.6 | 0.6 | moderate | API docs, technical guides |
| conversational | 0.4 | 0.8 | high | Tutorials, blog posts, READMEs |
| pov | 0.5 | 0.9 | high | Op-eds, position papers, ADRs |
| reasoning | 0.6 | 0.7 | moderate | Proposals, RFCs, comparisons |
| tutorial | 0.3 | 0.7 | moderate | Getting started, how-tos |
| narrative | 0.4 | 0.8 | high | Post-mortems, case studies |
| analytical | 0.7 | 0.4 | low | Benchmarks, reports |
| reference | 0.8 | 0.2 | low | API reference, specifications |
Professional technical writing with moderate personality:
Friendly tutorial-style writing:
Strong opinion and advocacy:
Persuasive, evidence-based:
Friendly step-by-step instruction:
Storytelling and case studies:
Data-driven, objective:
Neutral, authoritative:
When applying a voice profile to content:
Increasing formality (toward 1.0):
Decreasing formality (toward 0.0):
Increasing personality (toward 1.0):
Decreasing personality (toward 0.0):
Target ratio from profile:
Mix short sentences:
Vary length:
When content-generator skill is active:
Voice profiles work WITH copyedit configuration:
Remember: Voice profiles add the human element that makes technical writing engaging. Clean writing without personality reads like AI; personality without clean writing reads like slop. Both are essential.