Market research skill for pain-point extraction, trend detection, competitor positioning, and discovery across community sources (Reddit, HN, Bluesky, Mastodon, GitHub Issues, web). Built-in harvest fetchers, deterministic CLI compute, intent-auto SWOT/Porter's 5F/PESTEL frameworks. Use for market research, pain point analysis, trend detection, competitor research, user complaints, voice-of-customer, 시장조사, 사용자 페인, 트렌드, 경쟁구도.
npx skills add https://github.com/first-fluke/oh-my-agent --skill oma-market
Classify user intent into pain / trend / competitor / discovery, fan-out to community sources via oma market harvest, score and cluster findings with deterministic CLI compute, auto-apply strategic frameworks, and emit a single LAW-compliant markdown brief.
oma search fetch standalone--intent pain|trend|competitor|discovery--window 7d|30d|90d|180d (default: 30d)--sources <list> to override defaults--vs <entity> for competitor COMPARISON mode--frameworks auto|none|swot,5f,pestel--sites <list> (grounding site: filters, e.g. Naver/tistory/brunch for ko locale), --query-strict (post-filters results to those whose title contains every whitespace-separated query token)--window is explicitly pinned. Disable with --no-widen; force it on even with a pinned window via --widen-on-thin; tune the thin-corpus cutoff with --widen-threshold <n>..agents/results/market/{topic-slug}-{YYYYMMDD}.mdWhat we learned: body opener (or COMPARISON title), engine footer## in body (framework/COMPARISON sections excepted)oma market harvest built-in per-source fetchers (all network I/O stays inside harvest)resources/intent-rules.md, resources/operator-packs/, resources/output-laws.mdyt-dlp is installedoma market detect-trap "<topic>" to preflight the query.--intent flag.oma market harvest (parallel, per-source-limit 12, cache TTL 15m).--vs <entity> flag is present, switch to COMPARISON template.sources_failed; harvest exits 2 only when all sources fail.| Action | SSL primitive | Evidence |
|--------|---------------|----------|
| Run detect-trap preflight | VALIDATE | Topic arg, trap pattern rules |
| Classify intent | SELECT | Intent rules, user flags |
| Select operator pack | SELECT | resources/operator-packs/ |
| Fan-out harvest | CALL_TOOL | oma market harvest built-in per-source fetchers |
| Score candidates | INFER | Engagement weights, freshness, intent blends |
| Fuse and deduplicate | INFER | URL canonicalize, RRF k=60, author cap |
| Cluster by entity overlap | INFER | Overlap coefficient >= 0.4, MMR lambda=0.75 |
| Select frameworks | SELECT | Intent-to-framework toggle table |
| Render and self-check | WRITE | Output LAWs, framework templates |
| Write brief | WRITE | .agents/results/market/ |
| Report preview | NOTIFY | First 50 lines of brief |
oma market detect-trap (preflight gate)oma market discover-competitors (auto-discover peer entities for a topic; feeds --vs in competitor mode)oma market harvest (fan-out via built-in per-source fetchers)oma market score (engagement weights, log1p, intent blends)oma market fuse (URL canonical, RRF, diversity guard)oma market cluster (entity overlap, MMR)oma market render (md/json, LAW self-check, file write)TOPIC="VS Code pain points"
oma market detect-trap "$TOPIC" \
&& oma market harvest "vscode (broken OR bug OR migrate OR quit OR slow)" \
--sources reddit,hn,bluesky,mastodon,github,grounding --window 30d \
--operator-pack pain \
| oma market score --intent pain \
| oma market fuse \
| oma market cluster \
| oma market render --format md --intent pain --frameworks auto
| Scope | Resource target |
|-------|-----------------|
| NETWORK | Community sources via harvest's built-in fetchers (reddit, hn, bluesky, mastodon, github, grounding; youtube via yt-dlp) |
| LOCAL_FS | Brief output at .agents/results/market/; cache at ~/.cache/oma/market-research/ |
| PROCESS | oma market subcommands |
| MEMORY | Intent classification, operator pack selection, cluster summaries |
.agents/results/market/{topic-slug}-{YYYYMMDD}.md.~/.cache/oma/market-research/{sha256-16hex}/result.json (TTL 15m).--force bypasses the trap gate unconditionally; use it only after the user explicitly reconfirms a refused topic.oma market harvest's per-source fetchers; no direct platform HTTP from other stages or the agent.[harvest] <source> skipped: stderr notice when the env key is absent; never a hard error. X/TikTok/Instagram/Perplexity fetchers are deferred stubs pending integration and land in sources_failed even when keyed.--no-self-check for debug only.| Intent | Operator pack | Auto frameworks | Notes |
|--------|--------------|-----------------|-------|
| pain | resources/operator-packs/pain.md | SWOT | Weights: engagement 0.40, freshness 0.30, quality 0.30 |
| trend | none (optional: resources/operator-packs/positive.md for pain/positive contrast) | SWOT | Weights: freshness 0.50, engagement 0.30, quality 0.20 |
| competitor | resources/operator-packs/competitor.md | SWOT + Porter's 5F | Weights: relevance 0.35, engagement 0.35, quality 0.30; --vs enables COMPARISON template; discover-competitors can suggest the --vs entity |
| discovery | resources/operator-packs/discovery.md | SWOT + PESTEL | Weights: relevance 0.45, engagement 0.30, quality 0.25 |
Porter's 5F and PESTEL: the CLI renders complete labeled framework skeletons (all 5 forces / all 6 dimensions); the host LLM fills them using the analyst prompts in resources/frameworks/porters-5f.md and pestel.md (execution-protocol Step 6).
oma market detect-trap exits 0 or halts./oma-market "Next.js pain points" --intent pain --window 30d
/oma-market "AI coding tools trend" --intent trend
/oma-market "Cursor vs Windsurf" --intent competitor --vs Windsurf
/oma-market "developer productivity market" --intent discovery
The rendered brief is a static file at .agents/results/market/{slug}-{YYYYMMDD}.md. Brainstorm or PM workflows consume it by reading that path directly — there is no intake flag to pass.
resources/intent-rules.mdresources/operator-packs/ (pain.md, positive.md, competitor.md, discovery.md)resources/frameworks/ (swot.md, porters-5f.md, pestel.md — analyst prompts the host LLM fills into the rendered slots)resources/execution-protocol.mdresources/output-laws.mdresources/examples.mdresources/checklist.mdresources/error-playbook.md../_shared/core/context-loading.md../_shared/core/lessons-learned.mdPython library for working with DICOM (Digital Imaging and Communications in Medicine) files. Use this skill when reading, writing, or modifying medical imaging data in DICOM format, extracting pixel data from medical images (CT, MRI, X-ray, ultrasound), anonymizing DICOM files, working with DICOM metadata and tags, converting DICOM images to other formats, handling compressed DICOM data, or processing medical imaging datasets. Applies to tasks involving medical image analysis, PACS systems, radiology workflows, and healthcare imaging applications.
Python library for working with DICOM (Digital Imaging and Communications in Medicine) files. Use this skill when reading, writing, or modifying medical imaging data in DICOM format, extracting pixel data from medical images (CT, MRI, X-ray, ultrasound), anonymizing DICOM files, working with DICOM metadata and tags, converting DICOM images to other formats, handling compressed DICOM data, or processing medical imaging datasets. Applies to tasks involving medical image analysis, PACS systems, radiology workflows, and healthcare imaging applications.
Best practices for Remotion - Video creation in React
Generate AI-powered podcast-style audio narratives using Azure OpenAI's GPT Realtime Mini model via WebSocket. Use when building text-to-speech features, audio narrative generation, podcast creation from content, or integrating with Azure OpenAI Realtime API for real audio output. Covers full-stack implementation from React frontend to Python FastAPI backend with WebSocket streaming.
Best practices for Remotion - Video creation in React
Port an existing Remotion (React) composition''s source to HyperFrames HTML. Use ONLY on an explicit ask to port/convert/migrate/translate a Remotion source — one-way, Remotion-only. A passing Remotion mention, reference-only code, or "make something like my Remotion video" is a fresh build (/general-video). Unclear → /hyperframes.
Use this skill when building applications with Gemini API hosted models, including Gemini and Gemma 4, working with multimodal content (text, images, audio, video), implementing function calling, using structured outputs, or needing current model specifications. Covers SDK usage...
Turn error logs, screenshots, voice notes, and rough bug reports into crisp, developer-ready GitHub issues with repro steps, impact, and evidence.
Take first-fluke/oma-market from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.