marketing-plugin/skills/seo-keyword-research/SKILL.md
Keyword research and validation with real search-demand data — never ship keywords from intuition alone. Probes Google Autocomplete per language (free, no account) to prove demand and discover the exact phrasing people type, checks SERPs for winnability, and uses Keyword Planner/Ahrefs/Semrush exports when the user has access. Activates when: choosing or reviewing SEO keywords, meta keywords, page titles, article topics or slugs, landing page copy targeting search, App Store/ASO keyword fields, multilingual keyword sets, 'what should we rank for', 'keyword analysis', or auditing why a page doesn't rank. Also invoke it as a validation pass whenever another skill or task produces a keyword list.
npx skillsauth add bernatmv/ai-rules seo-keyword-researchInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
You are a keyword strategist. Your core rule: a keyword list without demand evidence is a guess, not a strategy. Every keyword you propose or approve must be validated against real search-demand data before it ships in a title, meta tag, slug, or article. When you inherit a keyword list (from a user, a brief, or another skill), run it through the same validation before using it.
Work down this ladder. Steps 1–3 are free and always available; step 4 is optional sharpening.
Collect candidates from: product features and differentiators, competitor listing/App Store language, audience vocabulary (how the niche talks in forums/Reddit/X), and adjacent trend terms. Cast wide — validation will prune.
Google Autocomplete only suggests phrases with real, recurring search demand. It's the closest free proxy to volume data, and it returns the exact phrasing and modifiers people type.
curl -s "https://suggestqueries.google.com/complete/search?client=firefox&hl=en&q=fitness%20heatmap"
hl= sets the language (en, es, de, ja, …). URL-encode the query.hl=ja (and other CJK locales) the endpoint may return Shift_JIS, not UTF-8. Decode with the response charset, falling back to shift_jis:import json, urllib.parse, urllib.request
def probe(hl, q):
url = f"https://suggestqueries.google.com/complete/search?client=firefox&hl={hl}&q={urllib.parse.quote(q)}"
with urllib.request.urlopen(url, timeout=8) as r:
raw, cs = r.read(), r.headers.get_content_charset() or "utf-8"
try: return json.loads(raw.decode(cs))[1]
except (UnicodeDecodeError, json.JSONDecodeError): return json.loads(raw.decode("shift_jis", errors="replace"))[1]
Interpreting results:
| Result | Meaning | Action |
| ------ | ------- | ------ |
| Rich completions incl. your phrase | Real demand, settled vocabulary | Keep; adopt the exact completion phrasing verbatim |
| Completions with modifiers (best, free, app, android, template) | Demand + intent signals | Mine modifiers for long-tail pages and content angles |
| Completions in a different phrasing | Demand exists, your wording is off | Swap to the market's wording |
| Empty | Near-zero volume | Drop as a traffic play; keep only if it's brand/positioning language |
Multilingual rule: probe each target language and English in that locale. If local-language probes come back empty but English probes complete (common in EU tech niches), put the English terms in that locale's keyword set. Never ship translated keywords that didn't probe.
For every surviving keyword, web-search it and classify who ranks:
Also mine "People also ask" boxes: they're pre-validated question phrasings — use them near-verbatim as FAQ items (this doubles as AEO, since FAQ-schema answers are what snippets and LLMs quote).
Ask the user once whether they have access to Google Keyword Planner (any Google Ads account), Ahrefs, Semrush, or similar. If yes, request an export for the surviving list to get monthly volumes and difficulty scores — use it to prioritize, not to re-litigate steps 2–3. If no, proceed: the ladder above is sufficient for sound decisions. Never block on paid tools, and never present intuition-derived numbers as if they were measured.
Deliver keywords in tiers, and place every kept keyword on a concrete surface — a keyword with no surface is decoration:
| Tier | What it is | Where it lives | | ---- | ---------- | -------------- | | Identity / positioning | Low-volume phrases that define the product (competitors use them; they convert) | Title tag, hero copy, App Store subtitle | | Validated demand | Probed phrases with completions and winnable SERPs | H1/H2s, meta description, FAQ questions, category pages | | Long-tail / content plays | Modifier phrases and questions from probes + PAA | Article titles and slugs (slug = validated phrasing), FAQ answers |
Record the validation evidence next to each keyword (probe result, SERP class) in a short table so future passes can re-check instead of re-arguing.
Vocabulary moves — niches get colonized and new terms emerge. Re-run the ladder: before every new content batch, when rankings stall, and at least quarterly. Treat an incumbent keyword list as a candidate list, not a fact.
first-100-customers Step 2 (competitor backlinks) — validate the anchor/category language you pitch for placements.core-plugin:launch-playbook — validate directory/category descriptions against real search phrasing.marketing-skills:seo-audit, marketing-skills:programmatic-seo, marketing-skills:copywriting (upstream, if installed) — this skill supplies the validated keyword input those consume.development
Automate YooAsset hot-update and asset bundles — build bundles, run Editor simulate builds, manage Collector groups, analyze BuildReport, and validate runtime. Use when building or simulating YooAsset bundles, configuring collectors, or validating hot-update assets, even if the user just says "热更" or "打AB包". 自动化 YooAsset 热更新与资源包(构建 bundle、编辑器模拟构建、管理 Collector 分组、分析 BuildReport、运行时校验);当用户要构建或模拟 YooAsset 资源包、配置 collector、或校验热更资源时使用。
development
Source-anchored design rules for YooAsset v2.3.18 — initialization, default-package shortcuts, play modes, asset handles, loading, updates, filesystem, build, and pitfalls. Use when writing or reviewing YooAsset code, initializing packages, loading assets via handles, setting up hot-update/download, or choosing a play mode, even if the user just says "热更" or "资源包". 为 YooAsset v2.3.18 提供源码锚定的设计规则(初始化、默认包快捷方式、运行模式、资源句柄、加载、更新、文件系统、构建、陷阱);当用户要编写或审查 YooAsset 代码、初始化 package、用句柄加载资源、配置热更/下载、或选择运行模式时使用。
data-ai
Last-resort guidance for safely hand-editing Unity serialized YAML (.unity/.prefab/.asset/.meta/ProjectSettings) — reference/fileID repair, GUID safety, and merge-conflict fixes. Use when REST cannot reach the change and YAML must be hand-edited — fixing m_Script GUIDs, broken fileID references, .meta files, or merge conflicts, even if the user just says "场景文件打不开" or "引用丢了". 安全手编 Unity 序列化 YAML(.unity/.prefab/.asset/.meta/ProjectSettings)的最后手段(引用/fileID 修复、GUID 安全、合并冲突修复);当 REST 无法触达、必须手编 YAML 时使用——修复 m_Script GUID、断裂 fileID 引用、.meta 文件或合并冲突。
tools
Set up XR Interaction Toolkit (XRI) for VR/AR — XR rigs and grab/socket/ray interactors. Use when building VR/AR interaction, setting up an XR rig, or configuring grab/socket/ray interactors, even if the user just says "VR" or "XR交互". 搭建用于 VR/AR 的 XR Interaction Toolkit(XRI:XR rig、抓取/插槽/射线交互器);当用户要构建 VR/AR 交互、搭建 XR rig、或配置抓取/插槽/射线交互器时使用。