@opendirectory.dev/skills 0.1.37 → 0.1.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/registry.json +8 -0
- package/skills/map-your-market/.env.example +3 -0
- package/skills/map-your-market/README.md +147 -0
- package/skills/map-your-market/SKILL.md +469 -0
- package/skills/map-your-market/evals/evals.json +102 -0
- package/skills/map-your-market/references/icp-signals.md +90 -0
- package/skills/map-your-market/references/pain-scoring.md +85 -0
- package/skills/map-your-market/references/subreddit-map.md +58 -0
- package/skills/map-your-market/scripts/fetch.py +710 -0
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"id": "eval_001",
|
|
4
|
+
"name": "Known competitive category -- devops tools",
|
|
5
|
+
"description": "Full pipeline run on a well-established category with many competitors. Verifies subreddit detection, pain clustering, ICP profiling, market map, and positioning framework all work end-to-end.",
|
|
6
|
+
"input": {
|
|
7
|
+
"prompt": "Map my market: I build developer observability tools. Competitors: Datadog, Grafana, New Relic",
|
|
8
|
+
"env": {}
|
|
9
|
+
},
|
|
10
|
+
"expected_behavior": [
|
|
11
|
+
"Detects subreddits: r/devops, r/sysadmin, r/kubernetes (or similar infrastructure communities)",
|
|
12
|
+
"Searches Reddit with queries: 'developer observability', 'Datadog', 'Grafana', 'New Relic', 'observability alternative'",
|
|
13
|
+
"Finds 30+ Reddit signals and 20+ HN signals",
|
|
14
|
+
"G2 scrape returns 5+ vendors for 'developer-observability' or similar slug",
|
|
15
|
+
"GitHub Issues search finds issues on Datadog or Grafana GitHub repos",
|
|
16
|
+
"Pain clusters include at least: cost/pricing, complexity, alert fatigue",
|
|
17
|
+
"ICP identified as DevOps engineers or SREs from subreddit distribution",
|
|
18
|
+
"Market size assessed as competitive and growing (many vendors + active discussion)",
|
|
19
|
+
"Positioning angles use verbatim language from the pain data",
|
|
20
|
+
"No em dashes in output",
|
|
21
|
+
"No banned words in output",
|
|
22
|
+
"All pain quotes exist in raw_pains JSON"
|
|
23
|
+
],
|
|
24
|
+
"expected_output": "Full market map with 5+ pain clusters, ICP card citing specific subreddits, market map with 3+ vendors, 3 messaging angles using market language. Saved to docs/market-maps/."
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"id": "eval_002",
|
|
28
|
+
"name": "Niche category with thin data",
|
|
29
|
+
"description": "Very niche category that returns fewer than 10 pain signals. Verifies graceful stop with no fabricated content.",
|
|
30
|
+
"input": {
|
|
31
|
+
"prompt": "Map my market: quantum cryptography key distribution middleware",
|
|
32
|
+
"env": {}
|
|
33
|
+
},
|
|
34
|
+
"expected_behavior": [
|
|
35
|
+
"Runs search queries for 'quantum cryptography key distribution middleware'",
|
|
36
|
+
"Returns fewer than 10 total signals",
|
|
37
|
+
"Stops at Step 3 with message: 'Fewer than 10 pain signals found for this category. The market may be too niche for Reddit/HN coverage, or the category keywords need adjustment. Try broader keywords or add competitor names.'",
|
|
38
|
+
"Does NOT proceed to clustering or ICP profiling",
|
|
39
|
+
"Does NOT fabricate pain points or invent community discussion",
|
|
40
|
+
"Does NOT write an output file with empty or invented data"
|
|
41
|
+
],
|
|
42
|
+
"expected_output": "Graceful stop message with suggestion to use broader keywords. No output file created."
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": "eval_003",
|
|
46
|
+
"name": "Competitor names only -- no category keyword",
|
|
47
|
+
"description": "User provides only competitor names. Skill must infer the category and run the full pipeline.",
|
|
48
|
+
"input": {
|
|
49
|
+
"prompt": "Map my market. My competitors are: Stripe, Braintree, Adyen",
|
|
50
|
+
"env": {}
|
|
51
|
+
},
|
|
52
|
+
"expected_behavior": [
|
|
53
|
+
"Infers category as 'payments' or 'payment processing' from competitor names",
|
|
54
|
+
"Detects subreddits: r/webdev, r/programming, r/entrepreneur, r/ecommerce",
|
|
55
|
+
"Runs full pipeline with inferred category",
|
|
56
|
+
"Competitor searches find posts mentioning 'Stripe pricing', 'Braintree alternative', etc.",
|
|
57
|
+
"Pain clusters include pricing, integration complexity, international payments",
|
|
58
|
+
"ICP includes developers and founders from subreddit distribution",
|
|
59
|
+
"Positioning framework uses language from payment-related pain posts"
|
|
60
|
+
],
|
|
61
|
+
"expected_output": "Full market map with inferred category clearly labeled. ICP and pains anchored to payment-space subreddits."
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"id": "eval_004",
|
|
65
|
+
"name": "Product description only -- no category or competitors",
|
|
66
|
+
"description": "User provides only a product description. Skill must extract category keywords and run full pipeline.",
|
|
67
|
+
"input": {
|
|
68
|
+
"prompt": "Map my market. I'm building a tool that helps small HR teams automate employee onboarding paperwork.",
|
|
69
|
+
"env": {}
|
|
70
|
+
},
|
|
71
|
+
"expected_behavior": [
|
|
72
|
+
"Extracts category keywords: 'HR automation' or 'employee onboarding' from description",
|
|
73
|
+
"No competitor names provided -- GitHub Issues search runs on category query only",
|
|
74
|
+
"Detects subreddits: r/humanresources, r/smallbusiness, r/remotework",
|
|
75
|
+
"Finds pain signals about HR paperwork, onboarding complexity, compliance",
|
|
76
|
+
"ICP identified as HR managers at small companies from subreddit distribution",
|
|
77
|
+
"Market map shows whatever vendors G2 returns for HR or onboarding category",
|
|
78
|
+
"Positioning angles speak to HR manager language, not engineering language"
|
|
79
|
+
],
|
|
80
|
+
"expected_output": "Market map anchored to HR/onboarding space. ICP as HR practitioners at SMBs. Pain themes around compliance, time cost, employee experience."
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"id": "eval_005",
|
|
84
|
+
"name": "Very competitive category -- CRM",
|
|
85
|
+
"description": "Highly saturated market with 100+ vendors on G2 and hundreds of Reddit posts. Verifies top-60 filtering works and market saturation is noted in positioning.",
|
|
86
|
+
"input": {
|
|
87
|
+
"prompt": "Map my market. Category: CRM software. Competitors: Salesforce, HubSpot, Pipedrive",
|
|
88
|
+
"env": {}
|
|
89
|
+
},
|
|
90
|
+
"expected_behavior": [
|
|
91
|
+
"Finds 100+ total pain signals",
|
|
92
|
+
"Script returns all signals but AI clustering receives only top 60 by pain_score",
|
|
93
|
+
"Pain clusters include: Salesforce pricing, complexity, migration difficulty, sales rep adoption",
|
|
94
|
+
"ICP segmented: enterprise (Salesforce complaints) vs SMB (HubSpot complaints) noted as distinct segments",
|
|
95
|
+
"G2 scrape returns 50+ vendors",
|
|
96
|
+
"Market size assessment notes saturation: many vendors, mature market",
|
|
97
|
+
"Positioning angles focus on differentiation from incumbents, not parity",
|
|
98
|
+
"Output notes: 'Market is saturated -- positioning must address why NOT the big players'"
|
|
99
|
+
],
|
|
100
|
+
"expected_output": "Market map with clear saturation signal. ICP segmented by company size. Positioning anchored to gaps in incumbent offerings, not feature lists."
|
|
101
|
+
}
|
|
102
|
+
]
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# ICP Signal Extraction Reference
|
|
2
|
+
|
|
3
|
+
Used by SKILL.md Step 5 to identify who is posting about these pains -- not just what they say.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## The ICP Is In the Metadata
|
|
8
|
+
|
|
9
|
+
Most ICP research focuses on post content. The higher-signal data is in the metadata:
|
|
10
|
+
|
|
11
|
+
| Signal | What it tells you |
|
|
12
|
+
|---|---|
|
|
13
|
+
| Subreddit | Role/function of the person (r/devops = DevOps engineer, r/SaaS = SaaS founder) |
|
|
14
|
+
| Post flair | Self-declared role or context within the community |
|
|
15
|
+
| GitHub org type | Organization = professional context, individual = personal use |
|
|
16
|
+
| HN bio | Often shows company affiliation and seniority |
|
|
17
|
+
| Post time | Work hours posts = professional pain, evening posts = side-project or consumer |
|
|
18
|
+
| Account age | Older accounts = established practitioners, new = emerging problem awareness |
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Subreddit to ICP Role Mapping
|
|
23
|
+
|
|
24
|
+
| Subreddit | Likely ICP role | Company size signal |
|
|
25
|
+
|---|---|---|
|
|
26
|
+
| r/devops | DevOps engineer, SRE, platform engineer | Mid to large |
|
|
27
|
+
| r/sysadmin | Sysadmin, IT ops, infrastructure | SMB to mid-market |
|
|
28
|
+
| r/ExperiencedDevs | Senior+ software engineer | Any |
|
|
29
|
+
| r/SaaS | SaaS founder, product manager | Early stage |
|
|
30
|
+
| r/startups | Founder, early employee | Pre-seed to Series A |
|
|
31
|
+
| r/entrepreneur | Solo founder, small business owner | SMB |
|
|
32
|
+
| r/microsaas | Solo founder, indie hacker | Tiny/bootstrapped |
|
|
33
|
+
| r/dataengineering | Data engineer, analytics engineer | Mid to large |
|
|
34
|
+
| r/datascience | Data scientist, ML engineer | Any |
|
|
35
|
+
| r/MachineLearning | ML researcher, ML engineer | Research or large tech |
|
|
36
|
+
| r/webdev | Frontend/fullstack dev, indie hacker | Any |
|
|
37
|
+
| r/sales | Account exec, SDR, sales leader | Any |
|
|
38
|
+
| r/humanresources | HR manager, CHRO | SMB to mid-market |
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Pain Concentration = ICP Confidence
|
|
43
|
+
|
|
44
|
+
The ICP is most reliable when the same pain appears in MULTIPLE subreddits that map to the same role:
|
|
45
|
+
|
|
46
|
+
- Pain X appears in r/devops (89 posts) AND r/sysadmin (67 posts): ICP = infrastructure/ops practitioners (high confidence)
|
|
47
|
+
- Pain X appears in r/startups (12 posts) AND r/SaaS (8 posts): ICP = early-stage founders (medium confidence)
|
|
48
|
+
- Pain X appears in r/programming (5 posts): ICP unknown, likely developer but context unclear (low confidence)
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Language Patterns to Extract
|
|
53
|
+
|
|
54
|
+
When reading posts for ICP, look for:
|
|
55
|
+
|
|
56
|
+
**Job title mentions:**
|
|
57
|
+
- "As a DevOps lead at a 200-person company..."
|
|
58
|
+
- "We're a small team of 3 engineers..."
|
|
59
|
+
- "I manage infrastructure for..."
|
|
60
|
+
|
|
61
|
+
**Company stage signals:**
|
|
62
|
+
- "We just Series A'd..."
|
|
63
|
+
- "We're bootstrapped, so..."
|
|
64
|
+
- "Our startup..."
|
|
65
|
+
- "At my enterprise job..."
|
|
66
|
+
|
|
67
|
+
**Existing tools mentioned:**
|
|
68
|
+
- "We use X but hate..."
|
|
69
|
+
- "Switched from X to Y but..."
|
|
70
|
+
- "X is too expensive at our scale"
|
|
71
|
+
|
|
72
|
+
**Decision context:**
|
|
73
|
+
- "I'm evaluating..."
|
|
74
|
+
- "My manager wants me to..."
|
|
75
|
+
- "We're building a business case for..."
|
|
76
|
+
- "I own the tooling decision..."
|
|
77
|
+
|
|
78
|
+
These phrases should appear in the ICP section's "what they say" field as verbatim quotes.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## ICP Confidence Levels
|
|
83
|
+
|
|
84
|
+
| Confidence | Criteria |
|
|
85
|
+
|---|---|
|
|
86
|
+
| High | 3+ subreddits with 20+ posts each, consistent role signals, multiple verbatim role mentions |
|
|
87
|
+
| Medium | 2 subreddits with 10+ posts each, or 1 subreddit with strong signal |
|
|
88
|
+
| Low | Single subreddit, < 10 total signals, or mixed/unclear role signals |
|
|
89
|
+
|
|
90
|
+
Always report the confidence level in the ICP section. Do not present a low-confidence ICP as definitive.
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Pain Scoring Reference
|
|
2
|
+
|
|
3
|
+
Used by `scripts/fetch.py` to score pain signals by source, engagement, and recency.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## The Problem with Raw Signal Counts
|
|
8
|
+
|
|
9
|
+
Reddit returns 1,000+ posts for a popular category. Most are:
|
|
10
|
+
- Old posts with no engagement (1 upvote, 0 comments)
|
|
11
|
+
- Tangentially related discussions
|
|
12
|
+
- Vendor promotions disguised as questions
|
|
13
|
+
- Solved problems with no recurring pattern
|
|
14
|
+
|
|
15
|
+
Pain score separates high-signal complaints (hundreds of upvotes, still unresolved) from noise.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Scoring Formula
|
|
20
|
+
|
|
21
|
+
```python
|
|
22
|
+
# Base signal -- weighted by source type
|
|
23
|
+
if source == "github_issue":
|
|
24
|
+
base = reactions * 3 # explicit developer vote, hardest to fake
|
|
25
|
+
elif source == "reddit":
|
|
26
|
+
base = score + (num_comments * 0.3) # upvotes + discussion weight
|
|
27
|
+
elif source == "hn":
|
|
28
|
+
base = points + (num_comments * 0.3) # same structure
|
|
29
|
+
|
|
30
|
+
# Recency decay -- recent pain is more actionable
|
|
31
|
+
days_old = (today - created_at).days
|
|
32
|
+
if days_old < 30: recency = 1.0 # full weight
|
|
33
|
+
elif days_old < 90: recency = 0.85 # slight decay
|
|
34
|
+
elif days_old < 180: recency = 0.7 # moderate decay
|
|
35
|
+
else: recency = 0.5 # older signals still count, just less
|
|
36
|
+
|
|
37
|
+
pain_score = round(base * recency, 1)
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Why GitHub Issues Score 3x Higher
|
|
43
|
+
|
|
44
|
+
A GitHub issue reaction means:
|
|
45
|
+
- A developer went to the effort of finding the issue
|
|
46
|
+
- They deliberately clicked +1 to signal "me too"
|
|
47
|
+
- They are an active user with a specific production problem
|
|
48
|
+
- The signal is public and permanent
|
|
49
|
+
|
|
50
|
+
A Reddit upvote is one click while scrolling. A GitHub +1 is intentional endorsement from a practitioner.
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## Score Tiers
|
|
55
|
+
|
|
56
|
+
| Score | Signal Level | What it means |
|
|
57
|
+
|---|---|---|
|
|
58
|
+
| >= 200 | Critical | Widespread, high-intensity pain. Top cluster material. |
|
|
59
|
+
| 50-199 | High | Clear pain pattern with real engagement. Include in analysis. |
|
|
60
|
+
| 10-49 | Medium | Valid signal, lower confidence. Include in counts, use carefully for quotes. |
|
|
61
|
+
| 2-9 | Low | Noise floor. Filtered out before clustering. |
|
|
62
|
+
| < 2 | Noise | Excluded. |
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Cluster Scoring
|
|
67
|
+
|
|
68
|
+
When clustering pains into themes, the cluster's total score is the sum of all signal pain_scores in the cluster:
|
|
69
|
+
|
|
70
|
+
```python
|
|
71
|
+
cluster_score = sum(signal["pain_score"] for signal in cluster_signals)
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
A cluster with 5 signals of pain_score 100 each (total: 500) outranks a cluster with 30 signals of pain_score 5 each (total: 150).
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Source Weights Summary
|
|
79
|
+
|
|
80
|
+
| Source | What a "vote" means | Weight |
|
|
81
|
+
|---|---|---|
|
|
82
|
+
| GitHub Issue reactions | Deliberate +1 from a practitioner | 3x |
|
|
83
|
+
| Reddit upvotes | Passive scroll vote | 1x |
|
|
84
|
+
| HN points | Upvote from a technical audience | 1x |
|
|
85
|
+
| Comments (any source) | Discussion signal (includes off-topic) | 0.3x |
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Subreddit Map
|
|
2
|
+
|
|
3
|
+
Used by `scripts/fetch.py` to auto-detect relevant subreddits from the category keyword.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Category to Subreddit Mapping
|
|
8
|
+
|
|
9
|
+
| Category Keyword | Subreddits |
|
|
10
|
+
|---|---|
|
|
11
|
+
| devops | r/devops, r/sysadmin, r/aws, r/kubernetes, r/docker |
|
|
12
|
+
| observability | r/devops, r/sysadmin, r/dataengineering, r/CloudArchitects |
|
|
13
|
+
| monitoring | r/devops, r/sysadmin, r/networking, r/aws |
|
|
14
|
+
| analytics | r/analytics, r/dataengineering, r/datascience, r/BusinessIntelligence |
|
|
15
|
+
| b2b | r/startups, r/entrepreneur, r/SaaS, r/smallbusiness |
|
|
16
|
+
| saas | r/SaaS, r/startups, r/entrepreneur, r/microsaas |
|
|
17
|
+
| developer | r/programming, r/webdev, r/ExperiencedDevs, r/devops |
|
|
18
|
+
| developer tools | r/programming, r/webdev, r/devops, r/ExperiencedDevs |
|
|
19
|
+
| api | r/webdev, r/programming, r/devops, r/node |
|
|
20
|
+
| security | r/netsec, r/cybersecurity, r/devops, r/sysadmin |
|
|
21
|
+
| data | r/dataengineering, r/datascience, r/analytics, r/BusinessIntelligence |
|
|
22
|
+
| database | r/dataengineering, r/Database, r/PostgreSQL, r/learnprogramming |
|
|
23
|
+
| auth | r/webdev, r/programming, r/netsec, r/node |
|
|
24
|
+
| payments | r/webdev, r/programming, r/entrepreneur, r/ecommerce |
|
|
25
|
+
| ecommerce | r/ecommerce, r/entrepreneur, r/shopify, r/startups |
|
|
26
|
+
| marketing | r/marketing, r/digital_marketing, r/entrepreneur, r/startups |
|
|
27
|
+
| crm | r/sales, r/salesforce, r/entrepreneur, r/smallbusiness |
|
|
28
|
+
| sales | r/sales, r/entrepreneur, r/startups, r/smallbusiness |
|
|
29
|
+
| hr | r/humanresources, r/remotework, r/startups, r/smallbusiness |
|
|
30
|
+
| finance | r/personalfinance, r/accounting, r/startups, r/smallbusiness |
|
|
31
|
+
| healthcare | r/healthIT, r/medicine, r/startups, r/technology |
|
|
32
|
+
| ai | r/MachineLearning, r/artificial, r/ChatGPT, r/learnmachinelearning |
|
|
33
|
+
| ml | r/MachineLearning, r/learnmachinelearning, r/datascience, r/artificial |
|
|
34
|
+
| llm | r/MachineLearning, r/artificial, r/ChatGPT, r/LocalLLaMA |
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Fallback (no category match)
|
|
39
|
+
|
|
40
|
+
If no keywords match: use `r/programming`, `r/webdev`, `r/technology`, `r/startups`, `r/entrepreneur`.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Inference from Competitor Names
|
|
45
|
+
|
|
46
|
+
If competitor names are provided but no category:
|
|
47
|
+
|
|
48
|
+
| Competitor keyword | Inferred subreddits |
|
|
49
|
+
|---|---|
|
|
50
|
+
| data, log, metric, monitor, trace | observability subreddits |
|
|
51
|
+
| pay, stripe, billing | payments subreddits |
|
|
52
|
+
| db, sql, postgres, mongo | database subreddits |
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Cap: 8 subreddits maximum per run
|
|
57
|
+
|
|
58
|
+
Too many subreddits increases noise and request count. Cap at 8, prioritizing the highest-specificity match.
|