@opendirectory.dev/skills 0.1.41 → 0.1.43

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.
@@ -0,0 +1,120 @@
1
+ [
2
+ {
3
+ "id": "eval_001",
4
+ "name": "B2B SaaS developer tool -- full happy path",
5
+ "description": "A CI/CD developer tool with Firecrawl available. Validates the full 10-step workflow: fetch, competitor discovery, user confirmation, 3-track PR research, channel tiering, journalist lookup, cold pitch drafts, and saved output.",
6
+ "input": {
7
+ "prompt": "Find my PR targets: https://buildkite.com",
8
+ "env": {
9
+ "TAVILY_API_KEY": "set",
10
+ "FIRECRAWL_API_KEY": "set"
11
+ }
12
+ },
13
+ "expected_behavior": [
14
+ "Fetches product page via Firecrawl",
15
+ "Product analysis: taxonomy maps to software > DevTools > CI/CD automation",
16
+ "Phase 1 discovers 5 CI/CD or DevTools competitors (e.g. CircleCI, GitHub Actions, GitLab CI, Harness, Drone)",
17
+ "Step 5 shows competitor list and pauses for user confirmation",
18
+ "Phase 2 runs 3-track search (editorial, podcast, community) for all 5 confirmed competitors = 15 searches",
19
+ "Step 7 pattern analysis produces tier_1_channels with at least 1 tech editorial (TechCrunch, InfoQ, The New Stack, etc.)",
20
+ "Step 8 journalist lookup runs for each Tier 1 editorial channel",
21
+ "Cold pitch drafts reference buildkite.com-specific differentiators from the fetched page",
22
+ "Output saved to docs/pr-intel/buildkite-[date].md",
23
+ "No em dashes in output",
24
+ "No banned buzzwords in cold pitches"
25
+ ],
26
+ "expected_output": "Full PR intel report with Tier 1 deep dives, cold pitch drafts with subject lines, Tier 2 quick hits, 3 bonus hooks, saved to docs/pr-intel/"
27
+ },
28
+ {
29
+ "id": "eval_002",
30
+ "name": "Consumer social app -- different publication set, no B2B enterprise press",
31
+ "description": "A consumer mobile social app. Validates that the skill maps to consumer taxonomy, finds consumer-focused competitors, and surfaces consumer press (not enterprise publications).",
32
+ "input": {
33
+ "prompt": "Find PR targets for: https://www.bereal.com",
34
+ "env": {
35
+ "TAVILY_API_KEY": "set",
36
+ "FIRECRAWL_API_KEY": "set"
37
+ }
38
+ },
39
+ "expected_behavior": [
40
+ "Fetches product page successfully",
41
+ "Taxonomy maps to consumer > social media (NOT B2B SaaS or DevTools)",
42
+ "Competitors are consumer social apps (Snapchat, Instagram, VSCO, Locket, etc.)",
43
+ "Track A editorial results come from consumer press (The Verge, Mashable, TechCrunch consumer, Wired lifestyle)",
44
+ "No B2B enterprise publications (e.g. VentureBeat enterprise, InfoQ, The New Stack) appear in Tier 1",
45
+ "Track C community results include consumer subreddits (r/technology, r/socialmedia, etc.)",
46
+ "Cold pitch drafts reference consumer social angles (authenticity, Gen Z, photo sharing), not enterprise ROI",
47
+ "At least 1 podcast found in results (tech culture or consumer tech podcast)"
48
+ ],
49
+ "expected_output": "PR intel report with consumer-focused editorial, podcast, and community channels -- no enterprise B2B publications in Tier 1"
50
+ },
51
+ {
52
+ "id": "eval_003",
53
+ "name": "Description-only input (no URL) -- skips fetch, uses description for analysis",
54
+ "description": "User pastes a product description with no URL. Validates that Steps 3-4 are skipped and competitor discovery uses the pasted description as the product context.",
55
+ "input": {
56
+ "prompt": "Find PR targets for my startup. We make AI-powered code review tools for enterprise engineering teams. Seed stage, US-focused.",
57
+ "env": {
58
+ "TAVILY_API_KEY": "set",
59
+ "FIRECRAWL_API_KEY": "not set"
60
+ }
61
+ },
62
+ "expected_behavior": [
63
+ "Detects no URL in the input",
64
+ "Skips Step 3: no fetch attempt is made",
65
+ "Skips the Firecrawl/Tavily extract path entirely",
66
+ "AI derives product analysis from the description: taxonomy maps to software > DevTools > code review automation",
67
+ "competitor discovery query uses description-derived taxonomy",
68
+ "Competitors are AI code review tools (CodeRabbit, Reviewpad, SonarQube, Codacy, Snyk Code, etc.)",
69
+ "Full 3-track PR research runs normally using discovered competitors",
70
+ "data_quality_flags in output includes note: 'Product analysis from user description, not live page'",
71
+ "Stage noted as 'Seed (stated by user)' in analysis"
72
+ ],
73
+ "expected_output": "Full PR intel using description-derived taxonomy, with data_quality_flags noting source"
74
+ },
75
+ {
76
+ "id": "eval_004",
77
+ "name": "User edits competitor list at Step 5 -- edited list used for Phase 2",
78
+ "description": "Validates that when the user removes a competitor and adds a custom one at the confirmation step, Phase 2 runs on the edited list, not the original discovered list.",
79
+ "input": {
80
+ "prompt": "Find PR targets: https://linear.app",
81
+ "user_edits_competitors_at_step_5": true,
82
+ "edit_description": "Remove one discovered competitor, add 'Shortcut' as custom addition",
83
+ "env": {
84
+ "TAVILY_API_KEY": "set",
85
+ "FIRECRAWL_API_KEY": "set"
86
+ }
87
+ },
88
+ "expected_behavior": [
89
+ "Phase 1 discovers 5 competitors and shows them",
90
+ "Step 5 presents the list and waits for confirmation",
91
+ "AI updates /tmp/cprf-competitors-confirmed.json with the EDITED list (including user-added competitor)",
92
+ "Phase 2 uses the edited confirmed list (not the original discovered list)",
93
+ "The user-added competitor ('Shortcut') appears in /tmp/cprf-competitors-confirmed.json",
94
+ "PR research runs for exactly the edited set",
95
+ "Track results for user-added competitor appear in /tmp/cprf-pr-raw.json"
96
+ ],
97
+ "expected_output": "PR intel based on the user-confirmed (edited) competitor list, not the originally discovered candidates"
98
+ },
99
+ {
100
+ "id": "eval_005",
101
+ "name": "TAVILY_API_KEY missing -- immediate stop at Step 1",
102
+ "description": "Validates that the skill stops at Step 1 with exact setup instructions when Tavily key is absent.",
103
+ "input": {
104
+ "prompt": "Find PR targets: https://notion.so",
105
+ "env": {
106
+ "TAVILY_API_KEY": "not set",
107
+ "FIRECRAWL_API_KEY": "set"
108
+ }
109
+ },
110
+ "expected_behavior": [
111
+ "Step 1 detects TAVILY_API_KEY is missing",
112
+ "Stops immediately at Step 1",
113
+ "Tells the user: 'TAVILY_API_KEY is required to research competitor press coverage and journalist contacts. There is no fallback for this. Get it at app.tavily.com. Free tier: 1000 credits/month (about 40 full runs). Add it to your .env file.'",
114
+ "Does NOT fetch the product page",
115
+ "Does NOT run any Tavily searches",
116
+ "Does NOT attempt competitor discovery or PR research"
117
+ ],
118
+ "expected_output": "Immediate stop at Step 1 with exact error message including the URL to get the key. No partial output generated."
119
+ }
120
+ ]
@@ -0,0 +1,119 @@
1
+ # Pitch Guide
2
+
3
+ ## Cold Email Structure (Editorial)
4
+
5
+ A cold pitch to a journalist has two fields: `subject` (the subject line) and `body` (the email body, 3-4 sentences). The body has four parts. Each part is one sentence.
6
+
7
+ 1. **Hook** -- Why this journalist, why now. Reference a specific piece they wrote and connect it to your category.
8
+ 2. **What you do** -- One sentence: what the product does, for whom, the core value. No buzzwords.
9
+ 3. **Why it fits their beat** -- The specific angle that matches how they covered your competitors. Use the angle extracted from the search results, not a generic claim.
10
+ 4. **Ask** -- A concrete, low-commitment request: a 15-minute call, or "happy to send more if it's useful."
11
+
12
+ **Total length: under 150 words.** Journalists receive dozens of pitches per day. Shorter is always better.
13
+
14
+ ---
15
+
16
+ ## Subject Line Formulas
17
+
18
+ The subject line is the most important part of the email. It determines whether it gets opened.
19
+
20
+ **Formula A -- Journalist + Topic + Angle:**
21
+ `[First name]: [topic they cover] + [your specific angle]`
22
+ Example: `Maya: developer tooling + CI/CD without YAML config`
23
+
24
+ **Formula B -- Reference their past coverage:**
25
+ `Following up on your [competitor] piece`
26
+ Example: `Following up on your Buildkite funding piece`
27
+
28
+ **Formula C -- Category observation:**
29
+ `[Observation about category trend] -- [company name]`
30
+ Example: `Shift-left testing is becoming standard -- here's what we're seeing`
31
+
32
+ **Avoid:**
33
+ - Generic: "Exciting opportunity", "Partnership proposal", "Press inquiry"
34
+ - Clickbait: "You won't believe...", "URGENT:", "Quick question"
35
+ - Overly personal: "I've been following your work for years..."
36
+
37
+ ---
38
+
39
+ ## Podcast Pitch Specifics
40
+
41
+ A podcast pitch is shorter and more conversational than a journalist pitch.
42
+
43
+ **Structure:**
44
+ 1. Reference a specific episode they did that relates to your category (1 sentence)
45
+ 2. Propose a specific topic or talking point for an episode -- not just "interview me" (1-2 sentences)
46
+ 3. One-line credibility: why you're the right person to speak on this (metrics, background, or unique angle)
47
+ 4. Optional: propose an episode title
48
+
49
+ **Length:** 3-5 sentences. Podcast hosts read these on phones between recordings.
50
+
51
+ **Example:**
52
+ > "Your episode with the Harness founder on platform engineering was one I kept coming back to. I'm building a zero-config CI/CD tool for teams that hate YAML and have some data on where pipeline complexity kills developer velocity. Happy to propose a few angles if useful."
53
+
54
+ ---
55
+
56
+ ## Story Angle Extraction
57
+
58
+ A story angle is the framing the journalist used to make the story newsworthy. Extract it from the article title in the search results -- do not infer from AI training knowledge.
59
+
60
+ **Common angle types and how to identify them from titles:**
61
+
62
+ | Angle type | Title pattern |
63
+ |---|---|
64
+ | Funding announcement | "raises $X", "closes $X Series Y", "secures funding" |
65
+ | Product launch | "launches", "introduces", "releases", "now available" |
66
+ | Founder story | "How [Name] built", "[Name]'s journey", "from [X] to [Y]" |
67
+ | Category creation | "the future of X", "why X is changing Y", "the rise of X" |
68
+ | Trend piece | "Why more companies are...", "The shift to...", "2024 state of X" |
69
+ | Customer story | "How [Company] uses X to Y", "[Company] cut Z by W% with X" |
70
+ | Partnership or acquisition | "partners with", "acquires", "joins forces" |
71
+
72
+ When drafting a cold pitch: use the same angle type that got the competitor featured. If TechCrunch covered three competitors with funding announcements, pitch your funding (or next milestone) story.
73
+
74
+ If no clear angle type matches, use: "coverage story" as a neutral fallback.
75
+
76
+ ---
77
+
78
+ ## Forbidden Phrases
79
+
80
+ Never include these in a cold pitch draft. They are instant delete signals.
81
+
82
+ **Opening lines:**
83
+ - "I hope this email finds you well"
84
+ - "I'm reaching out because..."
85
+ - "I wanted to share..."
86
+ - "I thought you might be interested in..."
87
+ - "My name is [Name] and I..."
88
+
89
+ **Buzzwords:**
90
+ - powerful, seamless, innovative, game-changing, revolutionary, disruptive
91
+ - cutting-edge, best-in-class, world-class, next-generation
92
+ - excited to announce, thrilled to share, proud to introduce
93
+ - leverage, synergy, paradigm shift, holistic, robust
94
+
95
+ **Vague claims:**
96
+ - "fastest growing" (without a number)
97
+ - "trusted by thousands" (without a number)
98
+ - "leading provider" (without evidence)
99
+ - "unique solution" (explain why instead)
100
+
101
+ ---
102
+
103
+ ## Bonus Hook Identification
104
+
105
+ Bonus hooks are story angles NOT used by any of the researched competitors. To identify them:
106
+
107
+ 1. List all story angle types found in the competitor PR search results
108
+ 2. List the angles that are present in the product analysis but NOT in the competitor coverage
109
+ 3. These gaps are potential first-mover angles for the user's product
110
+
111
+ **Example:** If all competitors were covered with funding announcements, but the user's product has a strong open-source community angle that no competitor has leaned into -- that's a bonus hook.
112
+
113
+ Common underused angles:
114
+ - Bootstrapped / no-VC angle (if relevant)
115
+ - Open source release or contribution
116
+ - Customer data / original research
117
+ - Category naming (creating a new term for what the space does)
118
+ - Contrarian take on a common assumption in the industry
119
+ - Founder background that makes this company uniquely credible
@@ -0,0 +1,81 @@
1
+ # PR Channel Types
2
+
3
+ ## The Three Tracks
4
+
5
+ ### Track A: Editorial / News
6
+ A journalist or staff writer published a piece about the company. The piece has a byline and appeared on a publication's website.
7
+
8
+ **How to identify from a Tavily result:**
9
+ - URL contains a known publication domain: `techcrunch.com`, `forbes.com`, `wired.com`, `theverge.com`, `venturebeat.com`, `infoq.com`, `thenewstack.io`, `businessinsider.com`, `fastcompany.com`, `inc.com`
10
+ - Title format: "Company X Raises $Y", "How Company X is Changing Z", "Company X Launches...", "[Name] Profile: ..."
11
+ - Content includes phrases like "reported", "according to", "the company said", "in an interview"
12
+
13
+ **Why it matters for outreach:**
14
+ Editorial coverage is the hardest to get but the most credible. Journalists have a beat -- they cover a specific domain -- so a pitch that fits their beat history gets read. The goal is not to pitch the publication; it's to pitch the specific journalist who already covers your category.
15
+
16
+ **Approach method:** Cold email with a subject line tailored to their beat. Keep it under 150 words. Reference a specific piece they wrote.
17
+
18
+ ---
19
+
20
+ ### Track B: Podcasts
21
+ A founder or executive appeared as a guest on a podcast episode to discuss their product, vision, or category.
22
+
23
+ **How to identify from a Tavily result:**
24
+ - URL contains: `podcasts.apple.com`, `open.spotify.com/episode`, `overcast.fm`, `pca.st`, `pod.link`, `buzzsprout.com`, `anchor.fm`, `transistor.fm`
25
+ - Title format: "Ep 123: [Name] on building X", "[Name] interviews founder of Y", "How [Company] bootstrapped to $1M ARR"
26
+ - A specific podcast name appears consistently: "Indie Hackers", "How I Built This", "The SaaS Podcast", "My First Million", "Acquired", "Lenny's Podcast"
27
+ - Content describes a long-form conversation, not a news article
28
+
29
+ **Why it matters for outreach:**
30
+ Podcast hosts are warmer than journalists -- they talk to founders for 30-60 minutes per episode and often have a loyal audience in a specific niche. A show that has featured 3 of your competitors has already built audience trust in your category. The pitch is shorter and more conversational than an editorial pitch.
31
+
32
+ **Approach method:** Short, casual pitch. Reference a specific episode they did in your space. Propose a concrete angle or talking point, not just "interview me about my startup."
33
+
34
+ ---
35
+
36
+ ### Track C: Communities
37
+ The company was discussed, featured, or launched on a community platform -- discussion threads, upvotes, launch pages.
38
+
39
+ **How to identify from a Tavily result:**
40
+ - URL domain: `reddit.com/r/`, `news.ycombinator.com`, `producthunt.com`, `indiehackers.com`, `dev.to`, `hashnode.com`, `discord.gg` (less common in search results)
41
+ - HN titles: "Show HN: [Company]" or "Ask HN: ..." with Company mentioned
42
+ - Reddit titles: discuss, review, recommendation thread mentioning competitor
43
+ - ProductHunt: `/posts/[company-name]` URL, "The best tool for X"
44
+
45
+ **Why it matters for outreach:**
46
+ Communities are earned, not pitched. You cannot pay or email your way in -- but you can post authentically. Subreddits and HN threads about your category are places where the audience already congregates. A ProductHunt launch in the right community can drive more trial signups than a Forbes article.
47
+
48
+ **Approach method:** Not an email pitch. Launch on ProductHunt. Post genuinely on relevant subreddits (follow community rules, no spam). For HN: "Show HN" post when you have something real to show.
49
+
50
+ ---
51
+
52
+ ## Normalizing URLs to Domains
53
+
54
+ When building the channel frequency map (Step 7), normalize all result URLs to their root domain so variants of the same publication are grouped:
55
+
56
+ | Raw URL | Root domain |
57
+ |---|---|
58
+ | `techcrunch.com/2024/01/company-raises-x` | `techcrunch.com` |
59
+ | `www.techcrunch.com/startups/...` | `techcrunch.com` |
60
+ | `open.spotify.com/episode/abc123` | `spotify.com (podcast)` |
61
+ | `podcasts.apple.com/us/podcast/...` | `apple podcasts` |
62
+ | `news.ycombinator.com/item?id=123` | `news.ycombinator.com` |
63
+ | `reddit.com/r/devops/comments/...` | `reddit.com/r/devops` |
64
+ | `producthunt.com/posts/company-name` | `producthunt.com` |
65
+
66
+ Reddit: preserve the subreddit level (`reddit.com/r/devops` not just `reddit.com`) because different subreddits serve different audiences.
67
+
68
+ Podcasts hosted on Spotify or Apple: use the show name, not the platform domain, as the channel identifier. The platform is just the delivery mechanism.
69
+
70
+ ---
71
+
72
+ ## Channel Type to Approach Method
73
+
74
+ | Channel Type | Approach Method | Notes |
75
+ |---|---|---|
76
+ | Editorial | Cold email to journalist | Find journalist name via Step 8 lookup |
77
+ | Podcast | Pitch email to host or show booking email | Often listed on show website |
78
+ | Community (ProductHunt) | Launch on ProductHunt | Schedule for Tuesday AM PT |
79
+ | Community (Reddit) | Authentic post or comment in thread | No overt pitching; add value |
80
+ | Community (HN) | Show HN post | Must have working product |
81
+ | Newsletter | Reply to the author's last issue | Most newsletters have personal reply addresses |
@@ -0,0 +1,91 @@
1
+ # Channel Tier Scoring
2
+
3
+ ## Core Tiering Rule
4
+
5
+ Channels are tiered by how many of the 5 researched competitors appeared in that channel's coverage.
6
+
7
+ | Tier | Threshold | What it means |
8
+ |---|---|---|
9
+ | Tier 1 | 3 or more competitors | Proven beat for this space. The journalist/host actively covers this category. Highest-value targets. |
10
+ | Tier 2 | Exactly 2 competitors | Warm lead. Some demonstrated interest in the category. Worth pursuing after Tier 1. |
11
+ | Tier 3 | Exactly 1 competitor | Discovery list only. May be a one-off or a niche fit. No deep dive or pitch draft required. |
12
+
13
+ ## Counting Rules
14
+
15
+ - Count each **root domain** once per competitor, regardless of how many articles appeared from that domain.
16
+ - Example: 3 TechCrunch articles about the same competitor = TechCrunch counts as 1 for that competitor.
17
+ - Count across all three tracks (editorial, podcast, community).
18
+ - A channel can be Tier 1 through a mix of tracks -- e.g., TechCrunch appears in Track A for 3 different competitors.
19
+ - If the same channel appears across multiple tracks for the same competitor, it still counts as 1 for that competitor.
20
+
21
+ ## Override Rules
22
+
23
+ **Tier 2 -> Tier 1 override:**
24
+ If a Tier 2 channel is the dominant podcast for the space (estimated >100k listeners, or the most prominent show in the category), elevate it to Tier 1. This override exists because audience quality matters more than raw frequency for podcasts.
25
+
26
+ Signals for override eligibility:
27
+ - The podcast name is well-known in the category (e.g., "Acquired", "My First Million", "Lenny's Podcast" for B2B SaaS)
28
+ - The episode title implies a deep-dive format (1+ hour, not a news brief)
29
+ - Search results show a consistent pattern of category founders as guests
30
+
31
+ **Geography filter:**
32
+ - If the product's geography is US: deprioritize EU-only publications (Financial Times, TechCrunch EU section, Sifted). They can appear in Tier 3 but should not be elevated to Tier 1 or 2.
33
+ - If the product's geography is Europe: deprioritize US-only niche press. Major US outlets (TechCrunch, Forbes) are still relevant as they cover global companies.
34
+ - If geography is Global: no filter applied.
35
+
36
+ **Community deduplication:**
37
+ Reddit and Hacker News count as separate channels. `reddit.com/r/devops` and `reddit.com/r/programming` count as separate channels (different audiences). ProductHunt is its own channel.
38
+
39
+ ## What Goes in Each Tier's Output Section
40
+
41
+ **Tier 1 -- Deep dives:**
42
+ Each Tier 1 channel gets a full section in the output:
43
+ - Channel name, type, frequency count, which competitors appeared
44
+ - Evidence URLs from search results
45
+ - Story angle type extracted from titles
46
+ - Journalist/host name + beat (from Step 8 lookup, or "not found in search data")
47
+ - Approach method
48
+ - Cold pitch draft: subject line + 3-4 sentence body
49
+
50
+ **Tier 2 -- Quick hits table:**
51
+ A summary table: channel name, which competitors appeared, URL.
52
+ No journalist lookup. No pitch draft. User can follow up manually.
53
+
54
+ **Tier 3 -- Discovery list:**
55
+ A bullet list: channel name + URL only.
56
+ No analysis. Just awareness that coverage exists.
57
+
58
+ ## Channel Frequency Map Construction (Step 7)
59
+
60
+ To build the frequency map:
61
+
62
+ 1. Collect all result URLs from `/tmp/cprf-pr-raw.json` for all competitors.
63
+ 2. For each result URL, extract the root domain (normalize per `pr-channel-types.md`).
64
+ 3. Build a set per competitor: which root domains appeared in their results?
65
+ 4. Count how many competitors each domain appears in.
66
+ 5. Sort by count descending. Domains with count >= 3 are Tier 1. Count == 2 are Tier 2. Count == 1 are Tier 3.
67
+
68
+ **Example frequency map:**
69
+ ```
70
+ techcrunch.com: 4 competitors (Tier 1)
71
+ news.ycombinator.com: 4 competitors (Tier 1)
72
+ producthunt.com: 3 competitors (Tier 1)
73
+ infoq.com: 2 competitors (Tier 2)
74
+ thenewstack.io: 2 competitors (Tier 2)
75
+ devops.com: 1 competitor (Tier 3)
76
+ reddit.com/r/devops: 1 competitor (Tier 3)
77
+ ```
78
+
79
+ ## Maximum Output Limits
80
+
81
+ To keep the output actionable (not overwhelming):
82
+
83
+ - Tier 1 deep dives: maximum 7 channels
84
+ - Tier 2 quick hits: maximum 10 channels
85
+ - Tier 3 discovery: maximum 15 channels (list only)
86
+ - Bonus hooks: exactly 3
87
+
88
+ If more channels qualify for a tier than the limit, prioritize by:
89
+ 1. Highest frequency count
90
+ 2. For equal counts: editorial > podcast > community
91
+ 3. For still-equal: alphabetical by domain name (deterministic)