Design rigorous A/B tests with hypotheses, variants, metrics, and sample size calculations.
日本語の概要は準備中です。原文の説明を表示しています。
Generates a fully structured SEO content **outline** (not a finished brief) and exports it as a formatted .docx Word document. The output is a skeleton for a writer to fill in — section headings, topic prompts, angles — not pre-written paragraphs. Use this skill whenever a user provides a blog title, focus keyword, domain URL, or any combination of those and asks to generate an outline, brief, blog brief, SEO brief, article structure, or content plan. Also trigger when the user says "create a brief for X", "generate an outline for [topic]", "make a content brief", "I need a brief for [URL or keyword]", or pastes a title and asks what the structure should look like. This skill handles input validation, domain analysis, keyword enrichment, audience inference, archetype-aware section selection, and full .docx generation — always use it rather than writing ad-hoc outlines.
インストールする前に、エージェントに与えられる指示の中身を確認できます。
Generates a content outline as a formatted .docx file. The output is a skeleton — section headings, short topic prompts, angles for each section — that a writer fills in with their own conclusions, numbers, and prose.
This is an outline generator, not a brief generator. If your output reads like an article in note form, you've gone too far. Read references/section-rules.md before generating anything.
The DOCX is always produced by running scripts/generate-brief.py. Do not reimplement the renderer. Do not write inline docx code. Assemble the config JSON and run the script.
| Field | Required | Notes |
|---|---|---|
title | ✅ | Blog post title. Warn if > 70 chars. |
focus_keyword | ✅ | Primary keyword |
sitemap_url | ✅ | Full sitemap URL, e.g. https://firefly.ai/sitemap.xml. domain_url is derived from this automatically. |
word_count_range | ✅ | e.g. 1500-2000 |
target_intent | ✅ | Informational, Commercial, Transactional, or Navigational |
target_product | ⬜ | Product name — triggers a product integration section if provided |
secondary_keywords | ⬜ | Pre-supplied list; skip generation if provided |
title: non-empty; warn (don't block) if > 70 charsfocus_keyword: non-emptysitemap_url: non-empty, starts with http:// or https:// (accept any path — .xml, .xml.gz, or extensionless dynamic URLs are all valid)word_count_range: two positive integers separated by - (e.g. 1500-2000)target_intent: one of Informational, Commercial, Transactional, Navigational (case-insensitive)Derive two values from sitemap_url:
domain_url — strip the path to get the origin, e.g. https://firefly.ai/sitemap.xml → https://firefly.ai. Used in the config JSON.domain_hostname — strip the protocol too, e.g. https://firefly.ai → firefly.ai. Used in tool calls that require a bare hostname (e.g. site:firefly.ai).Stop and report all validation errors before proceeding.
Read references/section-rules.md in full now. It contains:
topic_summary, no Writer Directives box, TLDR carries 2–3 topic pointers)Do not skip this step. Generating without reading the rules produces brief-style output every time.
DataForSEO tools are deferred — load them before calling. Call tool_search(query="on_page content parsing") at the start of this step.
Call web_fetch on sitemap_url.
<loc> tags) → extract every <loc> URL. These are your site URLs.dataforseo:serp_organic_live_advanced with keyword="site:{domain_hostname}" (e.g. site:firefly.ai) to get all indexed URLs.Cap at 20 URLs. If more exist, prioritise: homepage → product/use-case pages → blog/resource pages.
For each URL from 3a, call dataforseo:on_page_content_parsing with enable_javascript: true.
This returns fully rendered page text — headings, body copy, product descriptions, etc. Collect all output.
If a page fails (bot protection, timeout), skip it and continue — do not abort.
From the homepage content parsed in 3b, extract:
<title> → meta_title<meta name="description"> content → meta_descriptionSurface character count advisories if outside recommended ranges:
meta_title outside 50–60 chars → "Note: fetched meta title is N chars (recommended: 50–60)."meta_description outside 150–160 chars → "Note: fetched meta description is N chars (recommended: 150–160)."These are passed into the config as meta_title and meta_description and rendered in the metadata table.
From all parsed page content, extract and store:
Store as domain_context. Do not render domain_context in the output document. If all fetches fail, set domain_context = null and continue.
Based on the title pattern, pick one of:
If multiple seem to fit, use the defaults from section-rules.md. If still unclear, ask the user.
Announce the chosen archetype to the user before generating — one line, e.g. "Detected archetype: How-to. Generating outline with intro → strategies → case studies → implementation → FAQs." Let them override if they disagree.
Fetch USA monthly search volumes for the focus keyword and each secondary keyword using DataForSEO.
DataForSEO tools are deferred — load them before calling.
tool_search(query="keyword search volume google ads") to load the DataForSEO keyword tools.dataforseo:kw_data_google_ads_search_volume with the full list of keywords (focus + all secondaries) in a single call. Use location_code for the USA (2840).search_volume field for each keyword.3400 → "3,400"). Volumes under 1,000 stay as plain digits (e.g. "500", "30"). Volume of 0 should be rendered as "0", not "N/A" — it's a real datapoint."N/A" and continue. Don't abort the whole run.tool_search returns no DataForSEO tools (connector not installed), set every volume to "N/A" and surface a one-line warning: "DataForSEO connector not available — keyword volumes set to N/A."Never omit the volume field on any keyword. Every row must have one.
Flag volume mismatches. If the focus keyword's volume is more than 10× smaller than any secondary keyword's volume, tell the user before generating: "Note: your focus keyword has volume X, but secondary keyword Y has volume Z. Consider whether Y should be the focus." Let them decide; don't auto-swap.
Store as:
"focus_keyword_volume": "2,400",
"secondary_keywords": [
{ "keyword": "disaster recovery plan", "volume": "1,900" },
{ "keyword": "cloud DR strategy", "volume": "N/A" }
]
If no secondary keywords were supplied, generate 5 by combining base terms from the focus keyword, top domain key terms, and modifiers ("best practices", "guide", "checklist", "for teams", current year). Then fetch volumes for them the same way.
Use the section set for the archetype you chose in Step 4. Do not force every topic into a how-to template. A listicle has no Problem or Case Studies section. A comparison has no Implementation steps.
Each section object shape:
{
"heading": "H2",
"title": "Section Title",
"rules": ["short topic prompt 1", "short topic prompt 2"],
"subsections": [
{
"heading": "H3",
"title": "Subsection Title",
"rules": ["..."],
"subsections": []
}
]
}
Fields removed from the previous schema (do not use):
topic_summarydirectivesvisualfaqsrules); the writer drafts answers.Bullets in rules follow the hard rules in section-rules.md:
Length follows substance, not a fixed cap. Use as many bullets as the section honestly needs — 2 if 2, 9 if 9. The "typical ranges" in section-rules.md are orientation, not limits. Padding to hit a target number is wrong; truncating to hit one is also wrong.
TLDR section: include a TLDR heading with 2–3 short topic pointers (each ≤ 12 words) that name what the writer should cover in the TLDR. Pointers are topics, not finished takeaways. Pull from the article's central tension, the main shift the reader should make, and the practical next step. See the TLDR section in references/section-rules.md for good/bad examples.
FAQs section: Use the rules field with a list of question strings — questions only, no answers. The writer drafts the actual answers. Each question is one bullet. Focus on how questions are framed: concrete and action-oriented ("How do I install a Claude skill?"), not abstract ("How does Claude decide which skill to invoke?"). All user-supplied keywords (focus + each secondary) must appear naturally across the question set — paraphrased into something a real searcher would type, never keyword-stuffed. Typically 5–8 questions but no fixed cap. See the FAQs section in section-rules.md for examples.
Before assembling the config, walk the outline and verify (this is from section-rules.md):
topic_summary, directives, or faqs fields present? → Strip if present. FAQ questions live in rules as flat bullets."How do I install...", "What is the difference between..."), not abstract ("How does Claude decide...")? → Rewrite vague ones.If all 12 pass, proceed.
Write the complete config to /home/claude/brief-config.json:
{
"title": "...",
"focus_keyword": "...",
"focus_keyword_volume": "N/A",
"domain_url": "...",
"word_count_range": "...",
"target_intent": "...",
"target_product": "...",
"archetype": "how_to",
"meta_title": "...",
"meta_description": "...",
"secondary_keywords": [
{ "keyword": "...", "volume": "N/A" }
],
"output_path": "/mnt/user-data/outputs/outline-{file_slug}.docx",
"outline": [ ... ]
}
Slug note: Two slugs are generated internally:
focus_keyword, e.g. "cloud disaster recovery" → cloud-disaster-recovery.title, e.g. "How Do Platform Teams Implement Cloud Disaster Recovery" → outline-how-do-platform-teams-implement-cloud-disaster-recovery.docx.The output_path in the config should reflect the title-based file slug.
Do not include domain_context in the config. It informs generation upstream; it never appears in the rendered doc.
python /path/to/skill/scripts/generate-brief.py --config /home/claude/brief-config.json
The script handles all DOCX rendering. Do not write any docx code yourself.
If the script exits non-zero, report the error from stdout/stderr and show the outline as plain text as a fallback.
Call present_files with the output path. Report:
✅ Outline generated: outline-{file_slug}.docx
Archetype: {archetype}
Slug (URL): {url_slug} (from focus keyword)
Slug (file): {file_slug} (from title)
Audience: {audience}
Focus KW: {focus_keyword} ({volume})
Secondary KWs: {kw} ({vol}), ...
Sections: {N} sections
The script produces a .docx with:
focus_keyword, not the title. Focus keyword and each secondary keyword get their own row with volume in col 3 (amber background). Domain and Domain Context rows are NOT included in the table.heading field renders as [H2] or [H3] grey label prefix + heading text. rules render as bullet points. No topic_summary block, no Writer Directives box — those have been removed from the format.references/section-rules.md — Outline-first rules, archetypes, per-section rules, good/bad examples. Read in Step 2 before doing anything else.scripts/generate-brief.py — The DOCX renderer. Always run this. Never reimplement it.examples/ — Canonical good outlines, for reference only. Read these to calibrate bullet length, density, and tone — not to copy section structure, headings, or topics. The archetype rules in references/section-rules.md decide structure for the current topic. Never use an example outline as a template for the user's outline, even if the topic looks similar.まだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
Design rigorous A/B tests with hypotheses, variants, metrics, and sample size calculations.
日本語の概要は準備中です。原文の説明を表示しています。
When the user wants to plan, design, or implement an A/B test or experiment, or build a growth experimentation program. Also use when the user mentions "A/B test," "split test," "experiment," "test this change," "variant copy," "multivariate test," "hypothesis," "should I test this," "which version is better," "test two versions," "statistical significance," "how long should I run this test," "growth experiments," "experiment velocity," "experiment backlog," "ICE score," "experimentation program," or "experiment playbook." Use this whenever someone is comparing two approaches and wants to measure which performs better, or when they want to build a systematic experimentation practice. For tracking implementation, see analytics. For page-level conversion optimization, see cro.
日本語の概要は準備中です。原文の説明を表示しています。
Format CVs for academic positions with publications, grants, and teaching
日本語の概要は準備中です。原文の説明を表示しています。
Conduct a comprehensive accessibility audit against WCAG guidelines with severity ratings and remediation steps.
日本語の概要は準備中です。原文の説明を表示しています。
Create accessibility testing plans covering assistive technologies and WCAG criteria.
日本語の概要は準備中です。原文の説明を表示しています。
When the user wants to generate, iterate, or scale ad creative — headlines, descriptions, primary text, or full ad variations — for any paid advertising platform. Also use when the user mentions 'ad copy variations,' 'ad creative,' 'generate headlines,' 'RSA headlines,' 'bulk ad copy,' 'ad iterations,' 'creative testing,' 'ad performance optimization,' 'write me some ads,' 'Facebook ad copy,' 'Google ad headlines,' 'LinkedIn ad text,' or 'I need more ad variations.' Use this whenever someone needs to produce ad copy at scale or iterate on existing ads. For campaign strategy and targeting, see ads. For landing page copy, see copywriting.
日本語の概要は準備中です。原文の説明を表示しています。