[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6H3JVE06PMJ7FDFZNYS94NB":3,"skill-same:01M6H3JVE06PMJ7FDFZNYS94NB":129},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":26,"publishedAt":47,"linkOnly":48,"markdownContent":49,"markdownBody":50,"frontMatter":51,"refName":52,"commitSha":53,"skillDirectory":54,"forksCount":55,"repositoryHtmlUrl":56,"repositoryHomepageUrl":6,"ownerHtmlUrl":57,"ownerBlogUrl":58,"ownerDescription":59,"updatedAt":60,"install":61,"resources":74},"01M6H3JVE06PMJ7FDFZNYS94NB","oma-market",null,"Market research skill for pain-point extraction, trend detection, competitor positioning, and discovery across community sources (Reddit, HN, Bluesky, Mastodon, GitHub Issues, web). Routes via oma-search transport, deterministic CLI compute, intent-auto SWOT\u002FPorter's 5F\u002FPESTEL frameworks. Use for market research, pain point analysis, trend detection, competitor research, user complaints, voice-of-customer, 시장조사, 사용자 페인, 트렌드, 경쟁구도.","first-fluke\u002Fmapple","first-fluke","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F245837028?v=4","01M6H3H0BFDYMTTET3QPVDG1BZ","First Fluke","01M6H3H0FHPW2AZF69J06PS57T",1,"AGPL-3.0","https:\u002F\u002Fgithub.com\u002Ffirst-fluke\u002Fmapple\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Foma-market\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000021","资料检索与研究","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],"oma market","Market","intent","for","pestel","sources","trend","across","positioning","deterministic","hn","bluesky","cli","community","auto","analysis","search","issues","github issues","customer","2026-11-10 10:12:30",false,"---\nname: oma-market\ndescription: \"Market research skill for pain-point extraction, trend detection, competitor positioning, and discovery across community sources (Reddit, HN, Bluesky, Mastodon, GitHub Issues, web). Routes via oma-search transport, deterministic CLI compute, intent-auto SWOT\u002FPorter's 5F\u002FPESTEL frameworks. Use for market research, pain point analysis, trend detection, competitor research, user complaints, voice-of-customer, 시장조사, 사용자 페인, 트렌드, 경쟁구도.\"\n---\n\n# Market Research Agent - Community Signal Intelligence\n\n## Scheduling\n\n### Goal\nClassify user intent into pain \u002F trend \u002F competitor \u002F discovery, fan-out to community sources via `oma search fetch`, score and cluster findings with deterministic CLI compute, auto-apply strategic frameworks, and emit a single LAW-compliant markdown brief.\n\n### Intent signature\n- User asks about pain points, user complaints, or voice-of-customer signals for a product or category.\n- User asks what is trending, growing, or declining in a space this week or month.\n- User asks how one product compares to another in community sentiment or positioning.\n- User asks for discovery or exploratory market research on a topic.\n\n### When to use\n- Extracting real user pain points from community posts (Reddit, HN, GitHub Issues, Bluesky, Mastodon)\n- Detecting trends in a product category over a time window (7d \u002F 30d \u002F 90d \u002F 180d)\n- Competitor sentiment analysis and SWOT positioning\n- Open-ended discovery research across multiple sources\n\n### When NOT to use\n- General web research without market framing -> use oma-search directly\n- Single-source queries only -> use `oma search fetch` standalone\n- Delta tracking or trend velocity over time (v2 feature) -> defer\n- Live dashboards or scheduled monitoring -> out of scope (v1 one-shot only)\n\n### Expected inputs\n- Topic string and optional `--intent pain|trend|competitor|discovery`\n- Optional `--window 7d|30d|90d|180d` (default: `30d`)\n- Optional `--sources \u003Clist>` to override defaults\n- Optional `--vs \u003Centity>` for competitor COMPARISON mode\n- Optional `--frameworks auto|none|swot,5f,pestel`\n\n### Expected outputs\n- Single markdown brief at `.agents\u002Fresults\u002Fmarket\u002F{topic-slug}-{YYYYMMDD}.md`\n- Badge first-line, `What we learned:` body opener (or COMPARISON title), engine footer\n- No raw evidence dump; no Sources block; no em-dash; no `##` in body (framework\u002FCOMPARISON sections excepted)\n\n### Dependencies\n- `oma-search` for all fetches (`oma search fetch --only api`); never fetches directly\n- Serena `trust-registry-cache` (read-only); Trust Registry labels inherited from oma-search\n- `resources\u002Fintent-rules.md`, `resources\u002Foperator-packs\u002F`, `resources\u002Foutput-laws.md`\n\n### Control-flow features\n- Branches by classified intent, window, source availability, and env key presence\n- detect-trap gate before harvest (exit 2 on broad\u002Fambiguous topic, exit 4 on invalid)\n- Paid sources (X, TikTok, Instagram, YouTube, Perplexity) auto-skip when env key absent\n- Framework auto-toggle by intent (see Routes table)\n\n## Structural Flow\n\n### Entry\n1. Run `oma market detect-trap \"\u003Ctopic>\"` to preflight the query.\n2. Classify or confirm intent from user prompt or `--intent` flag.\n3. Select operator pack and framework set for the intent.\n\n### Scenes\n1. **PREPARE**: Parse topic and flags; run detect-trap; resolve intent, operator pack, window.\n2. **ACT**: Build per-source `oma search fetch` URLs with operator pack query expansion.\n3. **ACQUIRE**: Fan-out harvest via `oma market harvest` (parallel, per-source-limit 12, cache TTL 15m).\n4. **VERIFY**: Score, fuse, and cluster candidates; validate JSON at each pipe stage.\n5. **FINALIZE**: Render LAW-compliant markdown brief; run self-check; write to output path.\n\n### Transitions\n- If detect-trap exits 2 (REFUSE), surface reframe suggestion and halt.\n- If all sources blocked, exit 2 with per-source diagnostics.\n- If partial harvest failure, proceed; render annotates \"coverage: N\u002FM sources\".\n- If zero clusters, emit preview message and suggest wider window.\n- If `--vs \u003Centity>` flag is present, switch to COMPARISON template.\n\n### Failure and recovery\n- detect-trap exit 2: surface REFUSE reason and suggested reframe; do not proceed to harvest.\n- Network timeout (exit 6): report and suggest `--window` reduction or `--no-cache`.\n- Invalid JSON from any pipe stage: exit 4 with offending line in stderr.\n- Render LAW self-check violation: strip or regenerate; exit 1 only if regeneration also fails.\n- FS permission denied at write: exit 5.\n\n### Exit\n- Success: brief file written; first 50 lines previewed; engine footer present.\n- Partial success: source failures and framework skips are explicit in footer and stderr.\n\n## Logical Operations\n\n### Actions\n| Action | SSL primitive | Evidence |\n|--------|---------------|----------|\n| Run detect-trap preflight | `VALIDATE` | Topic arg, trap pattern rules |\n| Classify intent | `SELECT` | Intent rules, user flags |\n| Select operator pack | `SELECT` | `resources\u002Foperator-packs\u002F` |\n| Fan-out harvest | `CALL_TOOL` | `oma market harvest` -> `oma search fetch` |\n| Score candidates | `INFER` | Engagement weights, freshness, intent blends |\n| Fuse and deduplicate | `INFER` | URL canonicalize, RRF k=60, author cap |\n| Cluster by entity overlap | `INFER` | Overlap coefficient >= 0.4, MMR lambda=0.75 |\n| Select frameworks | `SELECT` | Intent-to-framework toggle table |\n| Render and self-check | `WRITE` | Output LAWs, framework templates |\n| Write brief | `WRITE` | `.agents\u002Fresults\u002Fmarket\u002F` |\n| Report preview | `NOTIFY` | First 50 lines of brief |\n\n### Tools and instruments\n- `oma market detect-trap` (preflight gate)\n- `oma market harvest` (delegates to `oma search fetch --only api`)\n- `oma market score` (engagement weights, log1p, intent blends)\n- `oma market fuse` (URL canonical, RRF, diversity guard)\n- `oma market cluster` (entity overlap, MMR)\n- `oma market render` (md\u002Fjson, LAW self-check, file write)\n\n### Canonical command path\n```bash\nTOPIC=\"VS Code pain points\"\noma market detect-trap \"$TOPIC\" \\\n  && oma market harvest \"vscode (broken OR bug OR migrate OR quit OR slow)\" \\\n       --sources reddit,hn,bluesky,mastodon,github-issues --window 30d \\\n       --operator-pack pain \\\n  | oma market score --intent pain \\\n  | oma market fuse \\\n  | oma market cluster \\\n  | oma market render --format md --intent pain --frameworks auto\n```\n\n### Resource scope\n| Scope | Resource target |\n|-------|-----------------|\n| `NETWORK` | Community sources via `oma search fetch` (reddit, hn, bluesky, mastodon, github-issues, grounding) |\n| `LOCAL_FS` | Brief output at `.agents\u002Fresults\u002Fmarket\u002F`; cache at `~\u002F.cache\u002Foma\u002Fmarket\u002F` |\n| `PROCESS` | `oma market` subcommands; `oma search fetch` |\n| `MEMORY` | Intent classification, operator pack selection, cluster summaries |\n\n### Preconditions\n- Topic is non-empty and passes detect-trap (not demographic-shopping, not single-noun-too-broad).\n- At least one keyless source is reachable (reddit, hn, bluesky, mastodon, github-issues, or grounding).\n\n### Effects and side effects\n- Writes brief markdown to `.agents\u002Fresults\u002Fmarket\u002F{topic-slug}-{YYYYMMDD}.md`.\n- Populates local cache at `~\u002F.cache\u002Foma\u002Fmarket\u002F{sha1-hash}\u002Fresult.json` (TTL 15m).\n- Reads Serena `trust-registry-cache` (no write).\n\n### Guardrails\n1. **detect-trap first**: never harvest without preflight; `--force` bypasses only in test mode.\n2. **Delegate all fetches**: `harvest` calls `oma search fetch --only api`; no direct platform HTTP.\n3. **Trust labels read-only**: no re-scoring; Trust Registry ownership stays with `oma-search`.\n4. **Paid sources auto-skip**: drop silently with `[INFO]` stderr if env key absent; never error.\n5. **LAW self-check mandatory**: render runs self-check before file write; `--no-self-check` for debug only.\n6. **No raw evidence dump**: cluster internals (scores, item counts) stay in JSON output; markdown body paraphrases.\n7. **Stdout pure JSON per stage**: each pipe stage (except render) emits valid JSON only; stderr for warnings.\n8. **No Serena writes in v1**: `trust-registry-cache` is read-only; write authority stays with `oma-search`.\n\n### Routes\n\n| Intent | Operator pack | Auto frameworks | Notes |\n|--------|--------------|-----------------|-------|\n| `pain` | `resources\u002Foperator-packs\u002Fpain.md` | SWOT | Weights: engagement 0.40, freshness 0.30, quality 0.30 |\n| `trend` | none (optional: `resources\u002Foperator-packs\u002Fpositive.md` for pain\u002Fpositive contrast) | SWOT | Weights: freshness 0.50, engagement 0.30, quality 0.20 |\n| `competitor` | `resources\u002Foperator-packs\u002Fcompetitor.md` | SWOT + Porter's 5F (v1.1 stub) | Weights: relevance 0.35, engagement 0.35, quality 0.30; `--vs` enables COMPARISON template |\n| `discovery` | `resources\u002Foperator-packs\u002Fdiscovery.md` | SWOT + PESTEL (v1.1 stub) | Weights: relevance 0.45, engagement 0.30, quality 0.25 |\n\nPorter's 5F and PESTEL: the CLI renders empty framework slots; the host LLM fills them using the analyst prompts in `resources\u002Fframeworks\u002Fporters-5f.md` and `pestel.md` (execution-protocol Step 6).\n\n### Default Workflow\n1. **Preflight**: `oma market detect-trap` exits 0 or halts.\n2. **Harvest**: fan-out to keyless sources with operator-pack query; paid sources conditional on env keys.\n3. **Score**: apply intent-specific engagement weights and log1p normalization.\n4. **Fuse**: URL-canonicalize, deduplicate, RRF k=60, per-author cap \u003C= 3.\n5. **Cluster**: entity overlap coefficient >= 0.4, MMR lambda=0.75, \u003C= 3 representatives.\n6. **Render**: select frameworks, synthesize brief, run LAW self-check, write file.\n\n### Invocation\n\n#### Standalone\n```\n\u002Foma-market \"Next.js pain points\" --intent pain --window 30d\n\u002Foma-market \"AI coding tools trend\" --intent trend\n\u002Foma-market \"Cursor vs Windsurf\" --intent competitor --vs Windsurf\n\u002Foma-market \"developer productivity market\" --intent discovery\n```\n\n#### Shared (from other skills or workflows)\nPass the rendered brief path (`.agents\u002Fresults\u002Fmarket\u002F{slug}-{YYYYMMDD}.md`) as a `--use-market-research` arg to Brainstorm or PM workflows. The brief is a static file; the calling skill reads it directly.\n\n## References\n- Intent classification: `resources\u002Fintent-rules.md`\n- Operator packs: `resources\u002Foperator-packs\u002F` (pain.md, positive.md, competitor.md, discovery.md)\n- Frameworks: `resources\u002Fframeworks\u002F` (swot.md, porters-5f.md, pestel.md — analyst prompts the host LLM fills into the rendered slots)\n- Execution steps: `resources\u002Fexecution-protocol.md`\n- Output LAWs and self-check rules: `resources\u002Foutput-laws.md`\n- Input\u002Foutput examples: `resources\u002Fexamples.md`\n- Pre-flight checklist: `resources\u002Fchecklist.md`\n- Error recovery: `resources\u002Ferror-playbook.md`\n- Context loading: `..\u002F_shared\u002Fcore\u002Fcontext-loading.md`\n- Lessons learned: `..\u002F_shared\u002Fcore\u002Flessons-learned.md`\n","# Market Research Agent - Community Signal Intelligence\n\n## Scheduling\n\n### Goal\nClassify user intent into pain \u002F trend \u002F competitor \u002F discovery, fan-out to community sources via `oma search fetch`, score and cluster findings with deterministic CLI compute, auto-apply strategic frameworks, and emit a single LAW-compliant markdown brief.\n\n### Intent signature\n- User asks about pain points, user complaints, or voice-of-customer signals for a product or category.\n- User asks what is trending, growing, or declining in a space this week or month.\n- User asks how one product compares to another in community sentiment or positioning.\n- User asks for discovery or exploratory market research on a topic.\n\n### When to use\n- Extracting real user pain points from community posts (Reddit, HN, GitHub Issues, Bluesky, Mastodon)\n- Detecting trends in a product category over a time window (7d \u002F 30d \u002F 90d \u002F 180d)\n- Competitor sentiment analysis and SWOT positioning\n- Open-ended discovery research across multiple sources\n\n### When NOT to use\n- General web research without market framing -> use oma-search directly\n- Single-source queries only -> use `oma search fetch` standalone\n- Delta tracking or trend velocity over time (v2 feature) -> defer\n- Live dashboards or scheduled monitoring -> out of scope (v1 one-shot only)\n\n### Expected inputs\n- Topic string and optional `--intent pain|trend|competitor|discovery`\n- Optional `--window 7d|30d|90d|180d` (default: `30d`)\n- Optional `--sources \u003Clist>` to override defaults\n- Optional `--vs \u003Centity>` for competitor COMPARISON mode\n- Optional `--frameworks auto|none|swot,5f,pestel`\n\n### Expected outputs\n- Single markdown brief at `.agents\u002Fresults\u002Fmarket\u002F{topic-slug}-{YYYYMMDD}.md`\n- Badge first-line, `What we learned:` body opener (or COMPARISON title), engine footer\n- No raw evidence dump; no Sources block; no em-dash; no `##` in body (framework\u002FCOMPARISON sections excepted)\n\n### Dependencies\n- `oma-search` for all fetches (`oma search fetch --only api`); never fetches directly\n- Serena `trust-registry-cache` (read-only); Trust Registry labels inherited from oma-search\n- `resources\u002Fintent-rules.md`, `resources\u002Foperator-packs\u002F`, `resources\u002Foutput-laws.md`\n\n### Control-flow features\n- Branches by classified intent, window, source availability, and env key presence\n- detect-trap gate before harvest (exit 2 on broad\u002Fambiguous topic, exit 4 on invalid)\n- Paid sources (X, TikTok, Instagram, YouTube, Perplexity) auto-skip when env key absent\n- Framework auto-toggle by intent (see Routes table)\n\n## Structural Flow\n\n### Entry\n1. Run `oma market detect-trap \"\u003Ctopic>\"` to preflight the query.\n2. Classify or confirm intent from user prompt or `--intent` flag.\n3. Select operator pack and framework set for the intent.\n\n### Scenes\n1. **PREPARE**: Parse topic and flags; run detect-trap; resolve intent, operator pack, window.\n2. **ACT**: Build per-source `oma search fetch` URLs with operator pack query expansion.\n3. **ACQUIRE**: Fan-out harvest via `oma market harvest` (parallel, per-source-limit 12, cache TTL 15m).\n4. **VERIFY**: Score, fuse, and cluster candidates; validate JSON at each pipe stage.\n5. **FINALIZE**: Render LAW-compliant markdown brief; run self-check; write to output path.\n\n### Transitions\n- If detect-trap exits 2 (REFUSE), surface reframe suggestion and halt.\n- If all sources blocked, exit 2 with per-source diagnostics.\n- If partial harvest failure, proceed; render annotates \"coverage: N\u002FM sources\".\n- If zero clusters, emit preview message and suggest wider window.\n- If `--vs \u003Centity>` flag is present, switch to COMPARISON template.\n\n### Failure and recovery\n- detect-trap exit 2: surface REFUSE reason and suggested reframe; do not proceed to harvest.\n- Network timeout (exit 6): report and suggest `--window` reduction or `--no-cache`.\n- Invalid JSON from any pipe stage: exit 4 with offending line in stderr.\n- Render LAW self-check violation: strip or regenerate; exit 1 only if regeneration also fails.\n- FS permission denied at write: exit 5.\n\n### Exit\n- Success: brief file written; first 50 lines previewed; engine footer present.\n- Partial success: source failures and framework skips are explicit in footer and stderr.\n\n## Logical Operations\n\n### Actions\n| Action | SSL primitive | Evidence |\n|--------|---------------|----------|\n| Run detect-trap preflight | `VALIDATE` | Topic arg, trap pattern rules |\n| Classify intent | `SELECT` | Intent rules, user flags |\n| Select operator pack | `SELECT` | `resources\u002Foperator-packs\u002F` |\n| Fan-out harvest | `CALL_TOOL` | `oma market harvest` -> `oma search fetch` |\n| Score candidates | `INFER` | Engagement weights, freshness, intent blends |\n| Fuse and deduplicate | `INFER` | URL canonicalize, RRF k=60, author cap |\n| Cluster by entity overlap | `INFER` | Overlap coefficient >= 0.4, MMR lambda=0.75 |\n| Select frameworks | `SELECT` | Intent-to-framework toggle table |\n| Render and self-check | `WRITE` | Output LAWs, framework templates |\n| Write brief | `WRITE` | `.agents\u002Fresults\u002Fmarket\u002F` |\n| Report preview | `NOTIFY` | First 50 lines of brief |\n\n### Tools and instruments\n- `oma market detect-trap` (preflight gate)\n- `oma market harvest` (delegates to `oma search fetch --only api`)\n- `oma market score` (engagement weights, log1p, intent blends)\n- `oma market fuse` (URL canonical, RRF, diversity guard)\n- `oma market cluster` (entity overlap, MMR)\n- `oma market render` (md\u002Fjson, LAW self-check, file write)\n\n### Canonical command path\n```bash\nTOPIC=\"VS Code pain points\"\noma market detect-trap \"$TOPIC\" \\\n  && oma market harvest \"vscode (broken OR bug OR migrate OR quit OR slow)\" \\\n       --sources reddit,hn,bluesky,mastodon,github-issues --window 30d \\\n       --operator-pack pain \\\n  | oma market score --intent pain \\\n  | oma market fuse \\\n  | oma market cluster \\\n  | oma market render --format md --intent pain --frameworks auto\n```\n\n### Resource scope\n| Scope | Resource target |\n|-------|-----------------|\n| `NETWORK` | Community sources via `oma search fetch` (reddit, hn, bluesky, mastodon, github-issues, grounding) |\n| `LOCAL_FS` | Brief output at `.agents\u002Fresults\u002Fmarket\u002F`; cache at `~\u002F.cache\u002Foma\u002Fmarket\u002F` |\n| `PROCESS` | `oma market` subcommands; `oma search fetch` |\n| `MEMORY` | Intent classification, operator pack selection, cluster summaries |\n\n### Preconditions\n- Topic is non-empty and passes detect-trap (not demographic-shopping, not single-noun-too-broad).\n- At least one keyless source is reachable (reddit, hn, bluesky, mastodon, github-issues, or grounding).\n\n### Effects and side effects\n- Writes brief markdown to `.agents\u002Fresults\u002Fmarket\u002F{topic-slug}-{YYYYMMDD}.md`.\n- Populates local cache at `~\u002F.cache\u002Foma\u002Fmarket\u002F{sha1-hash}\u002Fresult.json` (TTL 15m).\n- Reads Serena `trust-registry-cache` (no write).\n\n### Guardrails\n1. **detect-trap first**: never harvest without preflight; `--force` bypasses only in test mode.\n2. **Delegate all fetches**: `harvest` calls `oma search fetch --only api`; no direct platform HTTP.\n3. **Trust labels read-only**: no re-scoring; Trust Registry ownership stays with `oma-search`.\n4. **Paid sources auto-skip**: drop silently with `[INFO]` stderr if env key absent; never error.\n5. **LAW self-check mandatory**: render runs self-check before file write; `--no-self-check` for debug only.\n6. **No raw evidence dump**: cluster internals (scores, item counts) stay in JSON output; markdown body paraphrases.\n7. **Stdout pure JSON per stage**: each pipe stage (except render) emits valid JSON only; stderr for warnings.\n8. **No Serena writes in v1**: `trust-registry-cache` is read-only; write authority stays with `oma-search`.\n\n### Routes\n\n| Intent | Operator pack | Auto frameworks | Notes |\n|--------|--------------|-----------------|-------|\n| `pain` | `resources\u002Foperator-packs\u002Fpain.md` | SWOT | Weights: engagement 0.40, freshness 0.30, quality 0.30 |\n| `trend` | none (optional: `resources\u002Foperator-packs\u002Fpositive.md` for pain\u002Fpositive contrast) | SWOT | Weights: freshness 0.50, engagement 0.30, quality 0.20 |\n| `competitor` | `resources\u002Foperator-packs\u002Fcompetitor.md` | SWOT + Porter's 5F (v1.1 stub) | Weights: relevance 0.35, engagement 0.35, quality 0.30; `--vs` enables COMPARISON template |\n| `discovery` | `resources\u002Foperator-packs\u002Fdiscovery.md` | SWOT + PESTEL (v1.1 stub) | Weights: relevance 0.45, engagement 0.30, quality 0.25 |\n\nPorter's 5F and PESTEL: the CLI renders empty framework slots; the host LLM fills them using the analyst prompts in `resources\u002Fframeworks\u002Fporters-5f.md` and `pestel.md` (execution-protocol Step 6).\n\n### Default Workflow\n1. **Preflight**: `oma market detect-trap` exits 0 or halts.\n2. **Harvest**: fan-out to keyless sources with operator-pack query; paid sources conditional on env keys.\n3. **Score**: apply intent-specific engagement weights and log1p normalization.\n4. **Fuse**: URL-canonicalize, deduplicate, RRF k=60, per-author cap \u003C= 3.\n5. **Cluster**: entity overlap coefficient >= 0.4, MMR lambda=0.75, \u003C= 3 representatives.\n6. **Render**: select frameworks, synthesize brief, run LAW self-check, write file.\n\n### Invocation\n\n#### Standalone\n```\n\u002Foma-market \"Next.js pain points\" --intent pain --window 30d\n\u002Foma-market \"AI coding tools trend\" --intent trend\n\u002Foma-market \"Cursor vs Windsurf\" --intent competitor --vs Windsurf\n\u002Foma-market \"developer productivity market\" --intent discovery\n```\n\n#### Shared (from other skills or workflows)\nPass the rendered brief path (`.agents\u002Fresults\u002Fmarket\u002F{slug}-{YYYYMMDD}.md`) as a `--use-market-research` arg to Brainstorm or PM workflows. The brief is a static file; the calling skill reads it directly.\n\n## References\n- Intent classification: `resources\u002Fintent-rules.md`\n- Operator packs: `resources\u002Foperator-packs\u002F` (pain.md, positive.md, competitor.md, discovery.md)\n- Frameworks: `resources\u002Fframeworks\u002F` (swot.md, porters-5f.md, pestel.md — analyst prompts the host LLM fills into the rendered slots)\n- Execution steps: `resources\u002Fexecution-protocol.md`\n- Output LAWs and self-check rules: `resources\u002Foutput-laws.md`\n- Input\u002Foutput examples: `resources\u002Fexamples.md`\n- Pre-flight checklist: `resources\u002Fchecklist.md`\n- Error recovery: `resources\u002Ferror-playbook.md`\n- Context loading: `..\u002F_shared\u002Fcore\u002Fcontext-loading.md`\n- Lessons learned: `..\u002F_shared\u002Fcore\u002Flessons-learned.md`\n",{"name":5,"description":7},"main","faa5b71f133b677d6ce9fda180c32274524b8be8",".agents\u002Fskills\u002Foma-market",0,"https:\u002F\u002Fgithub.com\u002Ffirst-fluke\u002Fmapple","https:\u002F\u002Fgithub.com\u002Ffirst-fluke","https:\u002F\u002Ffirstfluke.com","An engineering-first collective building scalable, AI-native software and infrastructure.","2026-06-20 23:18:56",{"source":8,"skillName":5,"commands":62,"prompt":72,"zipAvailable":73},[63,66,69],{"tool":64,"command":65},"npx","npx skills add first-fluke\u002Fmapple --skill oma-market",{"tool":67,"command":68},"bunx","bunx skills add first-fluke\u002Fmapple --skill oma-market",{"tool":70,"command":71},"pnpm","pnpm dlx skills add first-fluke\u002Fmapple --skill oma-market","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Ffirst-fluke\u002Fmapple\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Foma-market\u002FSKILL.md",true,[75,81,85,89,93,97,101,105,109,113,117,121,125],{"path":76,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":79,"sourceHtmlUrl":80},"resources\u002Fchecklist.md","REFERENCE","参考文档",1256,"https:\u002F\u002Fgithub.com\u002Ffirst-fluke\u002Fmapple\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Foma-market\u002Fresources\u002Fchecklist.md",{"path":82,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":83,"sourceHtmlUrl":84},"resources\u002Ferror-playbook.md",2537,"https:\u002F\u002Fgithub.com\u002Ffirst-fluke\u002Fmapple\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Foma-market\u002Fresources\u002Ferror-playbook.md",{"path":86,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":87,"sourceHtmlUrl":88},"resources\u002Fexamples.md",9519,"https:\u002F\u002Fgithub.com\u002Ffirst-fluke\u002Fmapple\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Foma-market\u002Fresources\u002Fexamples.md",{"path":90,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":91,"sourceHtmlUrl":92},"resources\u002Fexecution-protocol.md",4114,"https:\u002F\u002Fgithub.com\u002Ffirst-fluke\u002Fmapple\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Foma-market\u002Fresources\u002Fexecution-protocol.md",{"path":94,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":95,"sourceHtmlUrl":96},"resources\u002Fframeworks\u002Fpestel.md",2928,"https:\u002F\u002Fgithub.com\u002Ffirst-fluke\u002Fmapple\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Foma-market\u002Fresources\u002Fframeworks\u002Fpestel.md",{"path":98,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":99,"sourceHtmlUrl":100},"resources\u002Fframeworks\u002Fporters-5f.md",2925,"https:\u002F\u002Fgithub.com\u002Ffirst-fluke\u002Fmapple\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Foma-market\u002Fresources\u002Fframeworks\u002Fporters-5f.md",{"path":102,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":103,"sourceHtmlUrl":104},"resources\u002Fframeworks\u002Fswot.md",2510,"https:\u002F\u002Fgithub.com\u002Ffirst-fluke\u002Fmapple\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Foma-market\u002Fresources\u002Fframeworks\u002Fswot.md",{"path":106,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":107,"sourceHtmlUrl":108},"resources\u002Fintent-rules.md",3177,"https:\u002F\u002Fgithub.com\u002Ffirst-fluke\u002Fmapple\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Foma-market\u002Fresources\u002Fintent-rules.md",{"path":110,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":111,"sourceHtmlUrl":112},"resources\u002Foperator-packs\u002Fcompetitor.md",1287,"https:\u002F\u002Fgithub.com\u002Ffirst-fluke\u002Fmapple\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Foma-market\u002Fresources\u002Foperator-packs\u002Fcompetitor.md",{"path":114,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":115,"sourceHtmlUrl":116},"resources\u002Foperator-packs\u002Fdiscovery.md",1248,"https:\u002F\u002Fgithub.com\u002Ffirst-fluke\u002Fmapple\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Foma-market\u002Fresources\u002Foperator-packs\u002Fdiscovery.md",{"path":118,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":119,"sourceHtmlUrl":120},"resources\u002Foperator-packs\u002Fpain.md",1476,"https:\u002F\u002Fgithub.com\u002Ffirst-fluke\u002Fmapple\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Foma-market\u002Fresources\u002Foperator-packs\u002Fpain.md",{"path":122,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":123,"sourceHtmlUrl":124},"resources\u002Foperator-packs\u002Fpositive.md",1252,"https:\u002F\u002Fgithub.com\u002Ffirst-fluke\u002Fmapple\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Foma-market\u002Fresources\u002Foperator-packs\u002Fpositive.md",{"path":126,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":127,"sourceHtmlUrl":128},"resources\u002Foutput-laws.md",5529,"https:\u002F\u002Fgithub.com\u002Ffirst-fluke\u002Fmapple\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Foma-market\u002Fresources\u002Foutput-laws.md",[130,136,146,152,159,168],{"skillNo":131,"name":132,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":133,"categories":134,"keywords":135,"publishedAt":47},"01M6H3TQ55F8DE50S0AR3J44MG","work","https:\u002F\u002Fgithub.com\u002Ffirst-fluke\u002Fmapple\u002Fblob\u002Fmain\u002F.qwen\u002Fskills\u002Fwork\u002FSKILL.md",[],[132],{"skillNo":137,"name":138,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":139,"categories":140,"keywords":144,"publishedAt":47},"01M6H3TMBRRDMJMRENBJH8P4V9","video","https:\u002F\u002Fgithub.com\u002Ffirst-fluke\u002Fmapple\u002Fblob\u002Fmain\u002F.qwen\u002Fskills\u002Fvideo\u002FSKILL.md",[141],{"categoryNo":142,"categoryName":143,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",[145],"Video",{"skillNo":147,"name":148,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":149,"categories":150,"keywords":151,"publishedAt":47},"01M6H3TH7EMW9YEX66GB83C1GF","ultrawork","https:\u002F\u002Fgithub.com\u002Ffirst-fluke\u002Fmapple\u002Fblob\u002Fmain\u002F.qwen\u002Fskills\u002Fultrawork\u002FSKILL.md",[],[148],{"skillNo":153,"name":154,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":155,"categories":156,"keywords":157,"publishedAt":47},"01M6H3TEHMS3Y8KR2GA1R6K1KV","tools","https:\u002F\u002Fgithub.com\u002Ffirst-fluke\u002Fmapple\u002Fblob\u002Fmain\u002F.qwen\u002Fskills\u002Ftools\u002FSKILL.md",[],[158],"Tools",{"skillNo":160,"name":161,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":162,"categories":163,"keywords":164,"publishedAt":47},"01M6H3TC4Z8XVX21DJB7SSG24M","stack-set","https:\u002F\u002Fgithub.com\u002Ffirst-fluke\u002Fmapple\u002Fblob\u002Fmain\u002F.qwen\u002Fskills\u002Fstack-set\u002FSKILL.md",[],[165,166,167],"SET","stack","stack set",{"skillNo":169,"name":170,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":171,"categories":172,"keywords":173,"publishedAt":47},"01M6H3T8SPSFYERV58YKAS5W9D","scm","https:\u002F\u002Fgithub.com\u002Ffirst-fluke\u002Fmapple\u002Fblob\u002Fmain\u002F.qwen\u002Fskills\u002Fscm\u002FSKILL.md",[],[170]]