From competitive-research
Run a thorough weekly competitive feature analysis on the current codebase and produce a ranked, evidence-backed list of features the product is missing. Use this skill whenever the user asks for competitive research, competitor analysis, feature ideas, gap analysis, product roadmap input, "what are competitors doing," "what should we build next," "what features are we missing," weekly product strategy review, or anything similar — even when the user doesn't explicitly say the word "competitive." Also use it for tasks framed as "look at competitors and tell me what to build" or "help me figure out what to add to my product." Auto-discovers product identity, JTBDs, features, and constraints from the codebase, so it works zero-config.
How this skill is triggered — by the user, by Claude, or both
Slash command
/competitive-research:competitive-researchThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
A recurring product-management workflow that combines codebase introspection, web research, and structured frameworks (Jobs-to-be-Done, Kano, RICE) to produce a ranked list of features the product is missing.
A recurring product-management workflow that combines codebase introspection, web research, and structured frameworks (Jobs-to-be-Done, Kano, RICE) to produce a ranked list of features the product is missing.
This skill is intended to be run periodically — typically weekly. It maintains state in ./competitive-research/ so each run dedupes against prior ones and surfaces what's genuinely new since last time.
The user just runs the skill. There is no required configuration. Auto-discover everything from the codebase. Only ask the user for input if a prior run wrote a competitive-research/overrides.yaml and they want to update it.
If the user wants to provide hints (target user, known competitors, strategic constraints, etc.) before running, point them at /competitive-research:setup — a sibling skill that walks them through the override questions interactively and writes the YAML file. They can also edit ./competitive-research/overrides.yaml directly.
If the user wants to override auto-discovery, look for ./competitive-research/overrides.yaml with any of these optional fields:
product_name_override: ""
product_url_override: ""
target_user_override: ""
extra_known_competitors: []
strategic_constraints_override: ""
monorepo_scope: ""
Anything not in the file gets auto-discovered. This is the right default — pushing config files on the user defeats the point of the skill.
Act as a senior product manager + competitive intelligence analyst + product marketer rolled into one. Be specific, be skeptical, avoid consultant-speak. Every recommendation should pass the test: "would a sharp PM find this specific and actionable, or roll their eyes?"
The frameworks to apply (Christensen's Jobs-to-be-Done, Moore's positioning, Kano classification, Ulwick's outcome-driven innovation, RICE scoring) are detailed in references/frameworks.md. Read that file before scoring features in Phase 5.
The workflow has 8 phases. Print a one-paragraph plan first, then execute end-to-end without stopping for approval. Don't ask clarifying questions — the codebase is the source of truth.
This is the single most important phase. Skipping it or doing it shallowly causes every later phase to fail. The detailed signal-by-signal guide is in references/codebase-discovery.md. Read that file before starting Phase 0 — it lists exact files to check, shell commands to run, and fallback rules for when signals are missing.
Reuse check first: if ./competitive-research/runs/YYYY-MM-DD/product-dossier.md already exists for today (likely written by a prior /competitive-research:preview run), read it and skip the regeneration step. Same for ./competitive-research/competitors.yaml — if Phase 2 already populated it today, reuse rather than redo. The preview skill exists so users can sanity-check Phase 0 + Phase 2 cheaply before the full analysis; honoring its output makes the round-trip fast.
The output of Phase 0 is ./competitive-research/runs/YYYY-MM-DD/product-dossier.md containing:
Create if missing:
./competitive-research/
├── runs/YYYY-MM-DD/
│ ├── raw-notes/
│ ├── evidence.md
│ ├── product-dossier.md # written in Phase 0
│ └── report.md
├── history/
│ └── seen-features.jsonl # append-only dedupe log
└── competitors.yaml # persistent competitor list
Load history/seen-features.jsonl and competitors.yaml if they exist.
Start from the in-repo competitors (Phase 0). Then find more via web search. A competitor is anything the target user might hire instead — including indirect substitutes like spreadsheets or doing nothing.
Categories to find:
Search G2, Capterra, Product Hunt, " alternatives to " queries, Reddit ("what do you use for X"), Hacker News "Show HN" archives, the YC company directory.
For each, capture: name, URL, one-liner, funding stage, rough pricing, approximate team/company size. Aim for 8–15 total. Save to competitors.yaml.
For each competitor, write a scratch file in raw-notes/ covering:
[PRAISE] or [COMPLAINT] with theme. Complaints are gold — they're the gaps to fill.Cite URLs for every claim. If a page is paywalled or signup-walled, skip rather than fabricate.
One markdown table:
Save in report.md.
Extract every feature we lack that at least one competitor has. Classify each through multiple lenses (full definitions in references/frameworks.md):
RICE (Reach × Impact × Confidence ÷ Effort) with explicit numbers and a one-line justification per dimension.
Strategic Fit (1–10) based on alignment with inferred constraints, whether it reinforces or dilutes positioning, and red-ocean (everyone shipping) vs. blue-ocean (everyone missing) dynamics.
Rank by RICE, then re-sort the top 15 by Strategic Fit for the final shortlist.
If history/seen-features.jsonl has prior entries, run the dedupe script:
python "${CLAUDE_PLUGIN_ROOT}/skills/competitive-research/scripts/dedupe_features.py" \
--new ./competitive-research/runs/YYYY-MM-DD/shortlist.json \
--history ./competitive-research/history/seen-features.jsonl
Write shortlist.json first (the Phase 6 ranked features as the JSON array shape documented in the script's docstring), then invoke. ${CLAUDE_PLUGIN_ROOT} resolves to this plugin's install directory regardless of where the user installed it from.
The script does string-level matching and outputs likely matches. For each candidate match, make a final semantic call yourself ("dark mode" and "dark theme support" are the same; "real-time sync" and "real-time collaboration" are not).
Apply outcome status filtering. For every match against a historical entry, look up that entry's status field in seen-features.jsonl. Apply these rules before tagging:
status: shipped or status: wontfix → drop the new candidate from the shortlist entirely. Don't re-suggest things the user already shipped or explicitly killed. Note in a comment why it was dropped.status: in-progress → drop from the shortlist; mention in the report's "Already in flight" sub-section: "X is in progress (since [date]) — competitors [Y, Z] also have it now."status: rejected → keep on the shortlist, tag [REVISITED], and explain what specifically changed since the rejection (new competitor adoption, new user evidence, changed strategic constraint). Reference the original rejection_reason from the history entry.status: unmarked or absent → use the time-based logic below.For unmarked matches:
[NEW] — first time recommended (no historical match)[RECURRING — first suggested YYYY-MM-DD] — proposed before; note what's changed (e.g., "now 3 competitors ship it, up from 1")[REVISITED] — previously dismissed but circumstances changed; explain whyAppend every newly shortlisted feature to seen-features.jsonl with date, name, normalized description, and scores. Do not set a status field — the user marks status via /competitive-research:track.
Write ./competitive-research/runs/YYYY-MM-DD/report.md using the template in references/report-template.md.
The report has 8 sections; the template specifies what goes in each. Do not invent your own structure — the consistent format makes weekly reports comparable.
Also write report.json alongside report.md. The structured shortlist enables tooling integrations (Linear/Jira/Notion ingestion, dashboards, longitudinal analysis). The JSON schema is documented at the bottom of references/report-template.md. Mirror the markdown shortlist exactly — same ranking, same scores, same evidence. JSON is the machine-readable view of the same content; never let them diverge.
Before printing the TL;DR, check the report against this list. If any check fails, revise.
Print to the chat:
report.md./competitive-research/overrides.yaml before next week's run (e.g., "I inferred your target user is solo founders on Shopify — confirm or correct in target_user_override")npx claudepluginhub dharrishub/competitive-research-skill --plugin competitive-researchCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.