원클릭으로
cf-style-guide
Import brand voice profiles from documents or URLs. Use when setting up or updating a brand.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Import brand voice profiles from documents or URLs. Use when setting up or updating a brand.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Process multiple content pieces through a prioritized, checkpointed queue with progress tracking and per-piece quality gates
Add a custom MCP connector — connect any API or service to ContentForge via .mcp.json configuration.
Track content quality scores, pipeline timing, and compliance trends with insights and alerts.
Audit content library for freshness decay, coverage gaps, and optimization opportunities.
Generate research-backed content briefs with keywords, competitors, intent, and SEO strategy from a topic.
Plan content calendars with scheduling, deadlines, team assignments, and Google Calendar sync.
| name | cf-style-guide |
| description | Import brand voice profiles from documents or URLs. Use when setting up or updating a brand. |
| argument-hint | [brand-name or URL] |
| effort | medium |
Import brand voice profiles from existing style guide documents, URLs, or manual input. Extracts tone, formality, personality traits, writing style, approved/banned terminology, and compliance guardrails into a structured brand profile JSON that the ContentForge pipeline uses for every piece of content it produces.
Use /contentforge:cf-style-guide when:
For creating a brand profile from scratch (no existing style guide), use /contentforge:brand-setup with interactive mode.
For using an existing brand profile, just reference it by name in /contentforge:create-content --brand=BrandName.
brand-registry-template.json schemaMinimum Required:
--brand= across all skills)Style Guide Source (one of):
Import Scope:
/contentforge:cf-style-guide AcmeMed --source=https://acmemed.com/brand-guidelines
/contentforge:cf-style-guide AcmeMed --source=./AcmeMed-Style-Guide.docx
/contentforge:cf-style-guide AcmeMed --source=https://www.notion.so/acme/Brand-Guidelines-abc123
/contentforge:cf-style-guide AcmeMed --source=https://acmemed.com/terminology --scope=terminology
/contentforge:cf-style-guide AcmeMed --source=./compliance-requirements.pdf --scope=guardrails
/contentforge:cf-style-guide AcmeMed --source=manual
Prompts you for:
/contentforge:cf-style-guide AcmeMed --source=https://acmemed.com/updated-guidelines --update
Merges new information into the existing profile without overwriting unchanged fields.
Before parsing any new source, check whether this brand already has a profile saved in Drive from a previous session. This is critical in Cowork because the sandbox FS is recycled — without this check, every Cowork session would re-create the same brand from scratch.
python {scripts_dir}/drive-sync-state.py --action read-config
If the config returns configured: false OR environment != "cowork-sandbox", skip to Step 1 (this is the local-mode flow).
If the config returns configured: true AND a Drive MCP is available in your tool list:
{drive_root_folder_name}/_brands/{brand-slug}/profile.json~/.claude-marketing/{brand-slug}/Brand-Guidelines/{BrandName}-brand-profile.json (the canonical local profile path)python {scripts_dir}/drive-sync-state.py --action profile-mark-downloaded \
--brand "{brand}" --drive-file-id "<id>" --content-hash "sha256:<hash>"
{brand} from Drive (last updated {timestamp}). Skipping new setup. To update voice/terminology, run /contentforge:cf-style-guide --update {brand}."After Step 6 saves the profile locally, check if it needs uploading:
python {scripts_dir}/drive-sync-state.py --action profile-needs-upload --brand "{brand}"
If needs_upload: true AND Cowork+Drive is configured AND a Drive MCP is available:
~/.claude-marketing/{brand-slug}/Brand-Guidelines/{BrandName}-brand-profile.json to {drive_root}/_brands/{brand-slug}/profile.json (create the folder structure if missing).python {scripts_dir}/drive-sync-state.py --action profile-mark-uploaded \
--brand "{brand}" --drive-file-id "<id>" --drive-url "<url>"
{drive_url} (persists across sessions and is team-shareable)."If local-mode (no Cowork config), skip — the profile is fine where it is on the host filesystem.
From URL:
From Document (.docx/.pdf):
From Manual Input:
Example:
Style Guide Loaded
================================================================
Source: https://acmemed.com/brand-guidelines
Page Title: "AcmeMed Brand Voice & Content Guidelines"
Sections Found: 8
1. Brand Overview
2. Voice & Tone
3. Writing Style
4. Approved Terminology
5. Banned Terms & Phrases
6. Regulatory Compliance
7. Visual Identity (skipped — not relevant to content)
8. Social Media Guidelines
Content Length: 4,200 words
Parsing: Complete
================================================================
Analyze the style guide to identify voice and tone patterns.
Extraction Categories:
Tone:
Formality Level (1-5):
1 = Very Casual (slang OK, first person, contractions)
2 = Casual (contractions OK, approachable, some humor)
3 = Balanced (professional but warm, contractions selective)
4 = Formal (no contractions, third person preferred, structured)
5 = Very Formal (academic, no contractions, passive voice OK)
Personality Traits (3-5 adjectives):
Writing Style Patterns:
Example Output:
Voice Characteristics Extracted
================================================================
Tone:
Primary: Authoritative
Secondary: Empathetic
By Content Type:
Article: Authoritative + data-driven
Blog: Authoritative + approachable
Whitepaper: Authoritative + academic
Formality: 4 (Formal)
No contractions in articles/whitepapers
Contractions OK in blog posts only
Personality Traits: data-driven, trustworthy, innovative, empathetic, precise
Writing Style:
Sentence Length: Medium (15-25 words average)
Paragraphs: 3-5 sentences
Voice: Active (90%+)
Person: Third person for articles, second person for blogs
Rhetorical Questions: Sparingly (1-2 per piece max)
Statistics: Heavy use, always cited
Storytelling: Patient stories as examples (anonymized)
Confidence: 92% (style guide was explicit about most elements)
================================================================
Parse approved and banned terminology from the style guide.
Terminology Categories:
Approved Terms:
Banned Terms:
Conditional Terms:
Example Output:
Terminology Extracted
================================================================
Approved Terms (47 total):
Brand Terms:
"AcmeMed" (never "Acme Med" or "ACMEMED")
"AcmeDiagnostics" (product name, always capitalized)
"AcmeCare Platform" (full name on first use, "the Platform" after)
Industry Terms:
"healthcare" (one word, not "health care")
"precision medicine" (preferred over "personalized medicine")
"clinical decision support" (preferred over "clinical AI")
"value-based care" (preferred over "value-driven care")
Acronyms:
"AI" — Artificial Intelligence (expand on first use)
"EMR" — Electronic Medical Record (expand on first use)
"HIPAA" — never expand (universally known in target audience)
Banned Terms (23 total):
"revolutionary" — overpromising, use "innovative" instead
"breakthrough" — overpromising, use "advancement" instead
"cure" — regulatory risk, use "treatment" or "therapy"
"guaranteed" — compliance violation in healthcare
"CompetitorX", "CompetitorY" — no competitor mentions
"patients love it" — unsubstantiated claim
"cutting-edge" — cliche, use specific technology descriptions
... (16 more)
Conditional Terms (8 total):
"FDA-cleared" — only for products with actual FDA clearance
"clinically validated" — only with citation to clinical trial
"reduces costs" — only with specific percentage and source
================================================================
Extract guardrails, disclaimers, and regulatory requirements.
Guardrail Categories:
Required Disclaimers:
Prohibited Claims:
Compliance Rules:
Sensitivity Guidelines:
Example Output:
Compliance Requirements Extracted
================================================================
Required Disclaimers (4):
1. All articles: "This content is for informational purposes only
and does not constitute medical advice."
2. Product mentions: "AcmeDiagnostics is pending FDA clearance
for [specific use case]." (update status quarterly)
3. Patient stories: "Patient names and identifying details have
been changed to protect privacy."
4. Clinical data: "Results may vary. Clinical outcomes depend
on individual patient factors."
Prohibited Claims (6):
1. No efficacy claims without peer-reviewed citation
2. No "FDA-approved" (use "FDA-cleared" for 510(k) devices)
3. No cost savings claims without specific study reference
4. No comparison claims vs competitors
5. No absolute claims ("best", "only", "first") without qualification
6. No patient testimonials as efficacy evidence
Compliance Rules:
HIPAA: Never include PHI (Protected Health Information)
FDA: Follow 510(k) promotional guidelines for device content
FTC: Disclose any sponsored or partnership content
Sensitivity Guidelines:
Language: Person-first (e.g., "patients with diabetes" not "diabetics")
Imagery descriptions: Diverse, inclusive, respectful
Avoid: Military metaphors for disease ("battle cancer", "fight disease")
Confidence: 96% (compliance section was highly structured)
================================================================
Create the structured JSON profile.
Schema — follow config/brand-registry-template.json exactly. Its top-level sections are:
brand_name, industry, company_info, voice, terminology, citation_rules, guardrails, content_patterns, seo_preferences, target_audience, quality_thresholds, tracking, google_integration, knowledge_vault_config, data_sources, output_preferences, visual_identity, content_pillars, competitor_analysis, notification_preferences, metadata.
Fill the sections your import scope covers; leave the rest as template defaults. The excerpt below shows only the sections this skill populates — it is not the full schema.
SYNTHETIC EXAMPLE (excerpt):
{
"brand_name": "AcmeMed",
"industry": "Healthcare",
"voice": {
"primary_tone": "authoritative",
"secondary_tone": "empathetic",
"formality_level": 4,
"personality_traits": ["data-driven", "trustworthy", "innovative", "empathetic", "precise"],
"tone_by_content_type": {
"article": "authoritative + data-driven",
"blog": "authoritative + approachable",
"whitepaper": "authoritative + academic",
"faq": "clear + helpful",
"research_paper": "academic + precise"
}
},
"content_patterns": {
"sentence_length": "medium",
"paragraph_length": "3-5 sentences",
"active_voice_target": 90,
"person": {
"article": "third",
"blog": "second",
"whitepaper": "third"
},
"contractions": {
"article": false,
"blog": true,
"whitepaper": false
},
"rhetorical_questions": "sparingly",
"statistics_usage": "heavy",
"storytelling": "patient stories, anonymized"
},
"terminology": {
"approved": [
{"term": "AcmeMed", "note": "Never 'Acme Med' or 'ACMEMED'"},
{"term": "healthcare", "note": "One word, not 'health care'"},
{"term": "precision medicine", "note": "Preferred over 'personalized medicine'"}
],
"banned": [
{"term": "revolutionary", "replacement": "innovative"},
{"term": "breakthrough", "replacement": "advancement"},
{"term": "cure", "replacement": "treatment or therapy"},
{"term": "guaranteed", "note": "Compliance violation in healthcare"}
],
"conditional": [
{"term": "FDA-cleared", "condition": "Only for products with actual FDA clearance"},
{"term": "clinically validated", "condition": "Only with citation to clinical trial"}
],
"acronyms": [
{"acronym": "AI", "expansion": "Artificial Intelligence", "expand_on_first_use": true},
{"acronym": "HIPAA", "expansion": "Health Insurance Portability and Accountability Act", "expand_on_first_use": false}
]
},
"guardrails": {
"required_disclaimers": [
{"context": "all_articles", "text": "This content is for informational purposes only and does not constitute medical advice."},
{"context": "product_mentions", "text": "AcmeDiagnostics is pending FDA clearance for [specific use case]."}
],
"prohibited_claims": [
"No efficacy claims without peer-reviewed citation",
"No 'FDA-approved' — use 'FDA-cleared' for 510(k) devices",
"No cost savings claims without specific study reference"
],
"compliance": {
"hipaa": "Never include PHI",
"fda": "Follow 510(k) promotional guidelines",
"ftc": "Disclose sponsored or partnership content"
},
"sensitivity": {
"language": "person-first",
"avoid_metaphors": ["military metaphors for disease"],
"inclusivity": "diverse, respectful, representative"
}
},
"metadata": {
"industry": "Healthcare",
"sub_industry": "Health Technology / Medical Devices",
"target_audiences": ["Healthcare Executives", "Clinical Decision Makers", "Health System IT Leaders"],
"content_types_supported": ["article", "blog", "whitepaper", "faq", "research_paper"],
"import_confidence": 94
}
}
Save Profile:
~/.claude-marketing/{brand-slug}/Brand-Guidelines/{BrandName}-brand-profile.json — this is the path every other ContentForge skill reads{drive_root}/_brands/{brand-slug}/profile.json (see Step 6.5)Validation Checks:
Example Validation:
Brand Profile Validation
================================================================
Profile: AcmeMed v1.0.0
JSON Valid: Yes
Required Fields: 12/12 present
Voice Complete: Yes (tone, formality, personality, style)
Terminology: 47 approved, 23 banned, 8 conditional
Guardrails: 4 disclaimers, 6 prohibited claims, 3 compliance rules
Acronyms: 12 defined
Pipeline Compatibility Test:
Phase 3 (Drafting): Can apply voice settings — PASS
Phase 5 (Brand Compliance): Can check terminology — PASS
Phase 6 (SEO): No conflicts with SEO settings — PASS
Phase 6.5 (Humanizer): Can apply personality — PASS
Profile Saved:
Local: ~/.claude-marketing/acmemed/Brand-Guidelines/AcmeMed-brand-profile.json
Drive (Cowork mode): <drive_root>/_brands/acmemed/profile.json
Cache Hash: SHA256:a3f2c1... (for fast cache lookup)
Status: READY — Profile can be used with /contentforge:create-content --brand=AcmeMed
================================================================
Choose where ContentForge tracks quality scores and delivers output files. This step configures the tracking section of the brand profile.
Before offering the three-option menu, run two probes (same flow as commands/brand-setup.md, which is the canonical brand-setup document):
python scripts/plugin-metadata.py --section environment
python scripts/detect-drive-mcp.py
environment == "cowork-sandbox": the "Local" backend writes to the ephemeral Linux sandbox — files vanish at session end. A Drive route (Anthropic platform integration or a Pipedream/Composio/Zapier/Make Drive aggregator MCP) is effectively REQUIRED for persistent output. If a Drive MCP is visible in your tool list, confirm and use it (skip the menu). If not, warn the user and point them to Cowork → Settings → Integrations → Google Drive, or /contentforge:cf-cowork-setup.detect-drive-mcp.py returns recommended_path: "mcp": confirm the detected connector and go straight to the MCP-based Drive route — skip the service-account flow.recommended_path: "service_account": confirm the found credentials (client_email) and use the service-account route.recommended_path: "none" in local Claude Code: show the three-option menu below (Local is a fine default on a real host filesystem).Present the user with three options (only when G.0 found nothing):
Step G: Tracking & Delivery Backend
================================================================
Choose where ContentForge tracks quality scores and delivers
output files for this brand:
1. Google Sheets + Drive (Recommended if you have Google Workspace)
Tracks in Google Sheets, delivers .docx to Google Drive
Requires: Service account credentials (~5 min setup)
2. Airtable (Recommended for simplicity)
Tracks in Airtable, delivers .docx as record attachments
Requires: Personal Access Token (~2 min setup)
3. Local (No setup required)
Tracks in local JSON, delivers .docx to local filesystem
No auth needed, but no cloud access or collaboration
Your choice: ___
================================================================
If user picks Google Sheets + Drive:
~/.claude-marketing/google-credentials.json~/.claude-marketing/google-credentials.json"tracking": {
"backend": "google_sheets",
"google_sheets": {
"sheet_id": "{user-provided}",
"tab_name": "ContentForge Tracking",
"credentials_path": "~/.claude-marketing/google-credentials.json"
},
"google_drive": {
"folder_id": "{user-provided}",
"credentials_path": "~/.claude-marketing/google-credentials.json"
}
}
python {scripts_dir}/sheets-tracker.py --action init --sheet-id {sheet_id} to create the tracking schemaIf user picks Airtable:
AIRTABLE_TOKEN environment variable existsdata.records:read, data.records:write, schema.bases:read, schema.bases:write scopesAIRTABLE_TOKEN environment variableairtable.com/{base_id}/...)"tracking": {
"backend": "airtable",
"airtable": {
"base_id": "{user-provided}",
"table_name": "ContentForge Tracking"
}
}
python {scripts_dir}/airtable-tracker.py --action init --base-id {base_id} to create the tracking table with schemaIf user picks Local:
"tracking": {
"backend": "local",
"local": {
"tracking_dir": "~/.claude-marketing/{brand}/tracking"
}
}
python {scripts_dir}/local-tracker.py --action init --brand "{brand}" to create the tracking directory and initial tracking.jsonIf user skips Step G (presses enter without choosing or says "skip"):
"local" with a note:
Defaulted to local tracking. You can switch to Google Sheets or
Airtable anytime by running /contentforge:cf-switch-backend.
Example Output:
Tracking Backend Configured
================================================================
Backend: Airtable
Base ID: appXXXXXXXXXXXXXX
Table: ContentForge Tracking (created with 20-column schema)
Token: AIRTABLE_TOKEN detected
Tracking table initialized with columns:
requirement_id, brand, content_type, title, target_audience,
word_count_target, priority, status, created_at, started_at,
completed_at, quality_score, content_quality, citation_integrity,
brand_compliance, seo_performance, readability, actual_word_count,
output_file (Attachment), notes
To switch backends later: /contentforge:cf-switch-backend
================================================================
Ask the user about their target audience:
Who is the primary audience for this brand's content?
Please provide:
1. Job title/role (e.g., "VP of Engineering", "Marketing Manager", "Small business owner")
2. Industry/company size (e.g., "Enterprise SaaS, 1000+ employees")
3. Reading level (executive summary / professional / technical / general public)
4. Key pain points (what problems are they trying to solve?)
5. Goals (what outcomes do they want from reading your content?)
Optional: Secondary audience(s) if the brand targets multiple personas.
Store in target_audience.primary_persona with fields: title, industry, company_size, reading_level, pain_points (array), goals (array).
If user skips: Set target_audience.primary_persona to default generic persona and log warning.
Ask the user about competitors:
Who are your top 3-5 content competitors?
These are brands whose content ranks for the same keywords or targets the same audience.
For each competitor, provide:
- Name and URL
- What they do well in content (e.g., "great technical depth", "strong SEO")
- What they miss or do poorly (e.g., "no video content", "outdated stats")
This helps ContentForge differentiate your content from theirs.
Store in competitor_analysis.top_competitors array. Each entry: name, url, content_strengths (array), content_gaps (array).
If user skips: Leave empty but note: "Competitor analysis skipped — Phase 1 Research will still analyze SERP competitors, but won't have your strategic differentiation context."
Ask the user about content strategy:
What are your brand's core content pillars (topic areas you want to own)?
Examples:
- "AI in Healthcare" — our flagship thought leadership topic
- "Product Tutorials" — how-to content for our platform
- "Industry Trends" — quarterly market analysis
List 3-5 pillars with a brief description and target keywords for each.
Store in content_pillars array. Each entry: name, description, keywords (array), content_types (array).
If user skips: Leave empty. Content will be produced without pillar context.
Ask the user about brand visuals:
What are your brand's visual identity elements?
1. Brand colors:
- Primary color (hex, e.g., #0066CC)
- Secondary color (hex)
- Accent color (hex, optional)
2. Preferred image style: photorealistic / illustration / flat design / mixed
3. Logo description (brief text description — we don't store image files)
These are used for chart generation (Phase 3.5) and AI image prompts.
Store in visual_identity with fields: brand_colors (primary, secondary, accent), image_style, logo_description.
If user skips: Use defaults (primary: #0066CC, secondary: #FF6600) and note in profile.
The style guide import produces:
| Output | Description |
|---|---|
| Brand Profile JSON | Structured profile following brand-registry-template.json schema |
| Voice Summary | Human-readable summary of tone, formality, personality, style |
| Terminology Count | Total approved, banned, and conditional terms extracted |
| Guardrails List | Disclaimers, prohibited claims, compliance rules |
| Validation Status | Pipeline compatibility test results |
| Save Location | Where the profile was saved (Drive, Notion, local) |
Style Guide Import Complete
================================================================
Brand: AcmeMed
Source: https://acmemed.com/brand-guidelines
Import Scope: All (voice + terminology + guardrails)
Processing Time: 6 minutes
Results:
Voice: Authoritative + Empathetic, Formality 4/5
Personality: data-driven, trustworthy, innovative, empathetic, precise
Terminology: 47 approved, 23 banned, 8 conditional, 12 acronyms
Guardrails: 4 disclaimers, 6 prohibited claims, 3 compliance rules
Audience: {persona_title} at {company_size} ({reading_level})
Competitors: {count} competitors analyzed
Content Pillars: {count} pillars defined
Visual Identity: {primary_color} / {secondary_color} | Style: {image_style}
Import Confidence: 94%
Validation: PASS (all pipeline phases compatible)
Saved to:
Local: ~/.claude-marketing/acmemed/Brand-Guidelines/AcmeMed-brand-profile.json
Drive (Cowork mode): <drive_root>/_brands/acmemed/profile.json
Use with: /contentforge:create-content --brand=AcmeMed
================================================================
Without MCP connections, profiles are saved to the canonical local path ~/.claude-marketing/{brand-slug}/Brand-Guidelines/{BrandName}-brand-profile.json. Profiles can be manually shared by copying the JSON file. URL-based style guide import uses WebFetch (built-in), which works without any MCP connection.
Cause: Style guide doesn't have explicit voice/tone section, or the page structure is too unstructured.
Solution: Use --source=manual to provide voice characteristics interactively, then import terminology and guardrails from the document separately.
Cause: Terminology is embedded in prose rather than structured lists.
Solution: Check if the style guide has a terminology table or glossary section. If not, use --source=manual --scope=terminology to add terms interactively.
Cause: Page requires authentication (private Notion, Google Doc not published, login-required page). Solution: If the page is in Notion, use the Notion MCP to access it instead of URL fetch. For Google Docs, use the published web link (File > Share > Publish to Web). For login-required pages, download the page as .docx or .pdf and use the document source.
Cause: Terminology lists contain conflicts (same term in approved and banned lists) or the profile JSON is malformed.
Solution: Review the profile JSON for conflicts. Use --update mode to fix specific fields without reimporting the entire guide.
Cause: Style guide was vague, lacked structure, or covered primarily visual identity (not content voice). Solution: Supplement with manual input for low-confidence sections. The profile will flag which sections have low confidence so you know what to manually verify.
None. This skill uses deterministic parsing (document structure analysis, pattern matching for terminology, rule extraction for guardrails) combined with WebFetch for URL-based sources. No agent-based reasoning is needed since the extraction follows structured patterns.
Agent: None (deterministic parsing)
MCP: Google Drive (optional via Anthropic platform integration / Pipedream / Composio / Zapier / Make aggregator), Notion (optional)
Output: Brand profile JSON at ~/.claude-marketing/{brand-slug}/Brand-Guidelines/{BrandName}-brand-profile.json, voice summary, terminology count, guardrails list, validation status, tracking backend config