@opendirectory.dev/skills 0.1.35 → 0.1.36

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,119 @@
1
+ [
2
+ {
3
+ "id": "eval_001",
4
+ "name": "Mixed package list: scoped + unscoped, breakout + steady + declining",
5
+ "description": "A list of packages across different growth stages and including one scoped package. Validates full pipeline: scoped URL encoding, velocity ranking, only breakout/watching packages get GitHub enrichment, correct tier classification.",
6
+ "input": {
7
+ "prompt": "Find leads from these npm packages: esbuild, @hono/hono, lodash, zod, deprecated-old-pkg. We build a TypeScript developer tooling platform.",
8
+ "env": {
9
+ "GITHUB_TOKEN": "set"
10
+ }
11
+ },
12
+ "expected_behavior": [
13
+ "Parses 5 package names including scoped @hono/hono",
14
+ "Step 3 URL-encodes @hono/hono as %40hono%2Fhono for the npm API call",
15
+ "Fetches 12 weeks of daily download data per package",
16
+ "Step 4 computes velocity scores using (growth_ratio * acceleration * noise_factor * 100) formula",
17
+ "Packages sorted by velocity_score descending in output",
18
+ "Only breakout and watching packages have GitHub profiles fetched in Step 5",
19
+ "lodash classified as 'established' (>500K/week) -- no GitHub enrichment attempted",
20
+ "deprecated-old-pkg shows low or declining velocity -- classified as 'steady' or 'too_early'",
21
+ "Lead briefs name the specific package and TypeScript developer tooling context",
22
+ "Suggested first messages are specific to each maintainer's package -- not generic",
23
+ "Output saved to docs/npm-leads/[date].md",
24
+ "No em dashes anywhere in output"
25
+ ],
26
+ "expected_output": "Velocity leaderboard with 5 packages, lead briefs for breakout/watching packages only, scoped package correctly handled, suggested messages reference TypeScript developer tooling context"
27
+ },
28
+ {
29
+ "id": "eval_002",
30
+ "name": "Single breakout package: full lead brief with GitHub and Twitter",
31
+ "description": "A single package in clear breakout trajectory (1K to 15K weekly over 8 weeks). Validates that the full 8-step pipeline runs, a lead brief is generated, and GitHub + Twitter contact info is correctly sourced from the API.",
32
+ "input": {
33
+ "prompt": "Analyze npm momentum for: zod",
34
+ "env": {
35
+ "GITHUB_TOKEN": "set"
36
+ }
37
+ },
38
+ "expected_behavior": [
39
+ "Fetches 12 weeks of download data for zod",
40
+ "Computes velocity score and classifies tier",
41
+ "Step 5 fetches npm registry metadata: description, keywords, maintainers, repository URL",
42
+ "Extracts GitHub owner from repository.url field",
43
+ "Fetches GitHub user profile for extracted owner",
44
+ "lead brief growth_summary uses exact numbers from npm API -- not rounded or modified",
45
+ "maintainer_handle comes from GitHub API response username field",
46
+ "twitter field uses twitter_username from GitHub API -- writes 'not found on GitHub' if field is null",
47
+ "why_now references specific weeks and growth numbers from the data",
48
+ "suggested_message names zod specifically and does not use placeholder text",
49
+ "Self-QA step verifies GitHub handle was in API response before including in output"
50
+ ],
51
+ "expected_output": "Full lead brief for zod with exact download numbers, verified GitHub handle, Twitter if set on GitHub profile, specific why_now and suggested_message"
52
+ },
53
+ {
54
+ "id": "eval_003",
55
+ "name": "Package that does not exist: continues with remaining packages",
56
+ "description": "One package name in the list does not exist on npm (returns 404). Validates that the skill notes it in data_quality_flags and continues analyzing the remaining packages without aborting.",
57
+ "input": {
58
+ "prompt": "Track npm trends for: vite, this-package-does-not-exist-xyz123, esbuild",
59
+ "env": {
60
+ "GITHUB_TOKEN": "set"
61
+ }
62
+ },
63
+ "expected_behavior": [
64
+ "Step 3 gets 404 from npm API for 'this-package-does-not-exist-xyz123'",
65
+ "Skill does NOT abort -- continues with vite and esbuild",
66
+ "Not-found package gets status='not_found' in scored data with velocity_score=0",
67
+ "data_quality_flags includes note about the 404 package",
68
+ "Output presents velocity leaderboard for vite and esbuild",
69
+ "Output section shows which package was skipped and why",
70
+ "No crash or incomplete output due to the missing package"
71
+ ],
72
+ "expected_output": "Velocity leaderboard for 2 packages (vite, esbuild), data_quality_flags noting the 404, no crash or abort"
73
+ },
74
+ {
75
+ "id": "eval_004",
76
+ "name": "GITHUB_TOKEN missing, rate limit hit during Step 5",
77
+ "description": "No GITHUB_TOKEN is set and the unauthenticated rate limit (60/hr) is exhausted partway through Step 5. Validates graceful degradation: presents velocity leaderboard from npm data, skips remaining GitHub enrichments, flags in data_quality_flags.",
78
+ "input": {
79
+ "prompt": "Find breakout npm packages: pkg-a, pkg-b, pkg-c, pkg-d, pkg-e, pkg-f, pkg-g, pkg-h, pkg-i, pkg-j, pkg-k",
80
+ "env": {
81
+ "GITHUB_TOKEN": "not set"
82
+ }
83
+ },
84
+ "expected_behavior": [
85
+ "Step 1 warns about 60 req/hr unauthenticated limit",
86
+ "Step 5 begins GitHub profile fetches for breakout/watching packages",
87
+ "After some fetches, X-RateLimit-Remaining drops to 5 or below",
88
+ "Skill detects gh_rate_remaining <= 5 and stops further GitHub enrichments",
89
+ "Skill does NOT abort the whole run",
90
+ "Packages enriched before the rate limit hit have GitHub data",
91
+ "Packages after the rate limit hit have github_users=[] in their profile",
92
+ "data_quality_flags includes note about GitHub rate limit hit and how many profiles were skipped",
93
+ "Velocity leaderboard is complete (from npm data, unaffected by GitHub rate limit)",
94
+ "Lead briefs for packages without GitHub data show 'GitHub profile: not found' instead of invented data"
95
+ ],
96
+ "expected_output": "Complete velocity leaderboard, partial GitHub enrichment, data_quality_flags noting rate limit hit, no invented contact info for un-enriched packages"
97
+ },
98
+ {
99
+ "id": "eval_005",
100
+ "name": "All packages below noise floor: graceful stop at Step 4",
101
+ "description": "All provided packages have fewer than 500 weekly downloads. Validates the graceful stop at Step 4 with a clear message -- no GitHub enrichment or lead briefs are attempted.",
102
+ "input": {
103
+ "prompt": "Analyze these npm packages: my-tiny-util, another-small-pkg, micro-helper-lib",
104
+ "env": {
105
+ "GITHUB_TOKEN": "set"
106
+ }
107
+ },
108
+ "expected_behavior": [
109
+ "Step 3 fetches download data for all 3 packages",
110
+ "Step 4 computes velocity scores -- all packages get tier='too_early' (recent_4_avg < 500)",
111
+ "Step 4 detects no breakout and no watching packages",
112
+ "Stops at Step 4 with message: 'All packages are below the 500 weekly downloads threshold for reliable velocity analysis. Try packages with more community adoption.'",
113
+ "Does NOT proceed to Step 5 (no GitHub enrichment attempted)",
114
+ "Does NOT generate lead briefs",
115
+ "Output shows the download numbers for each package so the user understands why they were below threshold"
116
+ ],
117
+ "expected_output": "Graceful stop at Step 4 with download counts, clear threshold explanation, no partial output or GitHub API calls"
118
+ }
119
+ ]
@@ -0,0 +1,163 @@
1
+ # Outreach Timing Reference
2
+
3
+ Used by SKILL.md Step 6 to guide AI generation of lead briefs and outreach messages. The right timing and angle depends on where the maintainer is in their growth arc.
4
+
5
+ ---
6
+
7
+ ## Why Timing Is Everything
8
+
9
+ A developer who just crossed 1,000 weekly downloads on their package is experiencing something new: real, sustained organic adoption. They are probably:
10
+ - Watching the download counter more closely than usual
11
+ - Starting to get GitHub issues from people they have never met
12
+ - Wondering if they should write docs or a blog post
13
+ - Not yet thinking about monetization, partnerships, or DevRel relationships
14
+
15
+ This is the window. A relevant, specific message from a company that actually understands what they built lands completely differently than it would 6 months later when they have speaking requests, Twitter DMs from recruiters, and three other companies already in their inbox.
16
+
17
+ ---
18
+
19
+ ## Outreach by Growth Stage
20
+
21
+ ### Stage 1: First Traction (500 to 3,000/week)
22
+
23
+ The maintainer is in "is this real?" territory. Downloads are clearly growing but they may still be wondering if it is a fluke.
24
+
25
+ **What works:**
26
+ - Acknowledge the specific thing they built, not just "your project"
27
+ - Ask for feedback or perspective -- they are not famous enough yet to expect sponsorships or partnerships
28
+ - Peer-to-peer framing: "We're building X and we noticed your package solves Y for the same developers"
29
+ - Low-commitment ask: feedback, a question, or just an introduction
30
+
31
+ **What does not work:**
32
+ - "We'd love to partner with you" (too big for where they are)
33
+ - "We noticed your package is growing fast" without specifics (sounds like a bot)
34
+ - Pitching them immediately before establishing relevance
35
+
36
+ **Template:**
37
+ ```
38
+ Subject: [package-name] -- quick question from a builder in your space
39
+
40
+ We use [package-name] for [specific use case] and noticed it's been growing fast.
41
+ We build [brief description] for the same developers.
42
+ [Specific observation about their package or a genuine question about their design decision]
43
+ No ask yet -- just wanted to say it's a well-built tool.
44
+ [Name]
45
+ ```
46
+
47
+ ---
48
+
49
+ ### Stage 2: Clear Breakout (3,000 to 20,000/week)
50
+
51
+ The maintainer now knows the growth is real. They are getting more issues, maybe some contributions, possibly a few people asking about commercial support.
52
+
53
+ **What works:**
54
+ - Naming the inflection: "You've gone from X to Y downloads in 8 weeks -- that puts you in rare company"
55
+ - Connecting their growth to a specific audience you both serve
56
+ - A concrete proposal: integration, co-marketing, or early access to something relevant to their users
57
+ - Flattery that is specific: quote something from their README or a design decision that shows you read it
58
+
59
+ **What does not work:**
60
+ - Vague partnership offers without a specific benefit
61
+ - Asking them to promote your product in their README cold
62
+ - Not mentioning their package by name
63
+
64
+ **Template:**
65
+ ```
66
+ Subject: [package-name] -- [specific angle in 6 words]
67
+
68
+ [Package-name] went from [X] to [Y] downloads over the last 8 weeks.
69
+ We build [product] for [same developer segment] and have been using it for [specific use case].
70
+ [One sentence connecting their package's growth to why you're reaching out now]
71
+ [Specific ask: integration conversation, early access, 20-minute call, or feedback request]
72
+ [Name]
73
+ ```
74
+
75
+ ---
76
+
77
+ ### Stage 3: Established Breakout (20,000 to 100,000/week)
78
+
79
+ The maintainer is now a recognized figure in their sub-community. They have probably been featured somewhere, have hundreds of GitHub stars, and are starting to think about sustainability.
80
+
81
+ **What works:**
82
+ - Direct business value: sponsorship, paid integration, commercial use case
83
+ - "We have [N] customers using your package" -- this legitimizes you and signals commercial interest
84
+ - Conference, podcast, or content collaboration (they are now building a reputation)
85
+ - Concrete numbers: "We could get you in front of 5,000 of your target users"
86
+
87
+ **What does not work:**
88
+ - Pure outreach without a business angle (they are getting enough of that)
89
+ - Asking for free consulting or feedback without offering something in return
90
+ - Generic partnership language
91
+
92
+ **Template:**
93
+ ```
94
+ Subject: [package-name] -- [N] of our customers use it
95
+
96
+ We have [N] teams using [package-name] through [your product].
97
+ We build [product] for [developer segment] and your package is a core dependency for [specific workflow].
98
+ [Specific proposal: integration, sponsorship, co-marketing, conference slot, or collaboration]
99
+ [One-line ask: call, intro, or yes/no question]
100
+ [Name]
101
+ ```
102
+
103
+ ---
104
+
105
+ ## The Verbatim Quote Technique
106
+
107
+ The single highest-signal move in any outreach message is quoting something specific from their project -- README language, a design decision they wrote about, a specific feature name.
108
+
109
+ **Without quote:**
110
+ > "We noticed you built a validation library and we think there's a fit."
111
+
112
+ **With quote:**
113
+ > "Your README says 'Zod's goal is to eliminate duplicative type declarations' -- that's exactly the problem our users have when they adopt TypeScript on a legacy codebase. We built something adjacent for the API layer."
114
+
115
+ The quote proves you read it. It also filters you out of the 95% of outreach that clearly does not. A developer who has been sending bug fixes to a project at midnight will respond to someone who clearly understood what they were building.
116
+
117
+ ---
118
+
119
+ ## Finding the Right Angle Based on Package Category
120
+
121
+ Use the keywords and description from the npm registry to match the outreach angle to the package type.
122
+
123
+ | Package Category | Best Angle |
124
+ |---|---|
125
+ | Build tools / bundlers | Performance, DX, CI integration time, large codebase support |
126
+ | Validation / schema | Type safety, form handling, API contract enforcement |
127
+ | HTTP / API clients | Multi-environment support, retry logic, error handling |
128
+ | Testing utilities | Coverage, speed, snapshot behavior |
129
+ | State management | Scale, debugging, SSR support |
130
+ | CLI tools | Scripting workflows, automation, team adoption |
131
+ | Database / ORM | Migration pain, type inference, query complexity |
132
+ | Auth / security | Compliance, session management, multi-provider support |
133
+
134
+ The suggested first message should reference the specific category and connect it to what the person reaching out actually builds.
135
+
136
+ ---
137
+
138
+ ## What to Never Write
139
+
140
+ Regardless of growth stage or package category, these phrases signal a template and get ignored:
141
+
142
+ - "I came across your project" -- too generic
143
+ - "I'm a huge fan of your work" -- unverifiable and sounds like a bot
144
+ - "We'd love to explore synergies" -- says nothing
145
+ - "Your package is powerful" -- the word "powerful" is on every cold email
146
+ - "I know you're busy" -- everyone is busy; mentioning it wastes a line
147
+ - "Just wanted to reach out" -- there is always a reason; state it
148
+ - "Feel free to ignore this" -- they will
149
+ - Any subject line over 8 words
150
+
151
+ The outreach hook that works is: specific thing they built + specific reason you noticed it now (the growth inflection) + specific reason you are the right person to reach out. Three sentences. Under 100 words total.
152
+
153
+ ---
154
+
155
+ ## Following Up
156
+
157
+ If there is no response after 7 days, one follow-up is acceptable. The follow-up should not repeat the pitch -- it should add new information:
158
+
159
+ - A new data point: "Your downloads crossed [milestone] since I last wrote"
160
+ - A new connection: "I saw you mentioned [topic] in [place] -- that's exactly what we're solving"
161
+ - A direct question instead of a pitch: "Are you thinking about [specific pain point] yet?"
162
+
163
+ Two messages with no response means the timing is wrong. Do not send a third. Revisit in 90 days if the package keeps growing.
@@ -0,0 +1,136 @@
1
+ # Velocity Scoring Reference
2
+
3
+ Used by SKILL.md Step 4 to classify npm packages by growth trajectory. The velocity score identifies packages in the hockey-stick growth phase, not just packages with high download volumes.
4
+
5
+ ---
6
+
7
+ ## The Problem with Raw Downloads
8
+
9
+ If you rank npm packages by raw weekly downloads, the top results are always React, lodash, TypeScript, and axios. These packages are not leads. Their maintainers are already famous, already overwhelmed with outreach, and already well beyond the "catch them early" window.
10
+
11
+ The signal is relative growth -- a package going from 1,000 to 8,000 weekly downloads over 8 weeks is more interesting than React at 50 million, because:
12
+ 1. The maintainer just crossed an inflection point -- they are building an audience now
13
+ 2. They are not yet famous -- your outreach lands in a less-crowded inbox
14
+ 3. Their growth signals that developers are finding value in what they built -- that is the same developer segment you are trying to reach
15
+
16
+ ---
17
+
18
+ ## The Velocity Score Formula
19
+
20
+ ```python
21
+ recent_4 = sum(weeks[-4:]) / 4 # average of last 4 weeks
22
+ prior_4 = sum(weeks[-8:-4]) / 4 # average of prior 4 weeks
23
+ recent_2 = sum(weeks[-2:]) / 2 # last 2 weeks (acceleration check)
24
+ mid_2 = sum(weeks[-4:-2]) / 2 # previous 2 weeks (acceleration baseline)
25
+
26
+ growth_ratio = recent_4 / max(prior_4, 1)
27
+ acceleration = recent_2 / max(mid_2, 1)
28
+
29
+ # Sweet spot multiplier
30
+ if recent_4 < 500:
31
+ noise_factor = max(recent_4 / 500, 0.1) # penalize noise floor
32
+ elif recent_4 > 500_000:
33
+ noise_factor = max(500_000 / recent_4, 0.1) # penalize established giants
34
+ else:
35
+ noise_factor = 1.0
36
+
37
+ velocity_score = growth_ratio * acceleration * noise_factor * 100
38
+ ```
39
+
40
+ **Why three components:**
41
+
42
+ - `growth_ratio`: Is the package getting more downloads recently than before? A ratio of 2.0 means double the average downloads in the recent 4 weeks vs the prior 4.
43
+ - `acceleration`: Is growth speeding up? A ratio of 1.2 means the last 2 weeks were 20% higher than the 2 weeks before that. This distinguishes a sustained breakout from a one-week spike.
44
+ - `noise_factor`: The sweet spot correction. Packages under 500/week are statistically unreliable (one viral tweet can quadruple downloads). Packages over 500K/week grow slowly by necessity -- a 10% growth at that scale represents millions of new downloads but looks small as a ratio.
45
+
46
+ ---
47
+
48
+ ## Score Interpretation
49
+
50
+ | Velocity Score | What it means |
51
+ |---|---|
52
+ | > 150 | Exceptional breakout. Growth is fast and accelerating. The maintainer is in a phase they probably have not experienced before. |
53
+ | 80-150 | Clear breakout. Consistent multi-week growth with acceleration. Strong lead candidate. |
54
+ | 40-80 | Watching. Growing but not at breakout pace. Worth monitoring -- may cross into breakout in 4-8 weeks. |
55
+ | 10-40 | Steady. Growing slowly or holding volume. Not a near-term lead from growth signals alone. |
56
+ | < 10 | Declining or flat. May have had growth earlier, but current trend is neutral or down. |
57
+
58
+ ---
59
+
60
+ ## Tier Definitions
61
+
62
+ | Tier | Criteria | Action |
63
+ |---|---|---|
64
+ | `breakout` | velocity_score > 80 AND 500 < recent_4 < 500,000 | Generate full lead brief + outreach message |
65
+ | `watching` | velocity_score > 40 | Generate lead brief, flag as "not yet breakout" |
66
+ | `steady` | velocity_score 10-40 | Show in leaderboard, no lead brief |
67
+ | `established` | recent_4 >= 500,000 | Show in leaderboard, note scale ceiling on velocity |
68
+ | `too_early` | recent_4 < 500 | Note download count, suggest revisiting when above 500/week |
69
+ | `insufficient_data` | fewer than 4 weeks of data | Skip velocity calculation entirely |
70
+
71
+ ---
72
+
73
+ ## The Sweet Spot: 500 to 500,000 Weekly Downloads
74
+
75
+ **Below 500/week:** A single blog post, a tweet from a developer with 10K followers, or a single CI pipeline at a large company can temporarily push a package from 50 to 300 downloads. This is not a trend -- it is a random event. The velocity score for these packages is unreliable and should not drive outreach decisions.
76
+
77
+ **500 to 10,000/week:** This is where breakout discovery is most valuable. The package has real organic adoption, the maintainer is seeing real growth for possibly the first time, and the audience is still small enough that outreach from a relevant company feels meaningful rather than corporate.
78
+
79
+ **10,000 to 100,000/week:** Still strong territory. The maintainer is probably getting some attention now but is not yet the subject of conference talks and podcast interviews. Still a good window.
80
+
81
+ **100,000 to 500,000/week:** The package is well-established. The maintainer likely has some reputation in the ecosystem. Outreach still works but requires a stronger angle -- you are not the first person to notice them.
82
+
83
+ **Above 500,000/week:** These are the top 0.1% of npm packages. Their maintainers are public figures in the developer ecosystem. The "before they are famous" window has closed.
84
+
85
+ ---
86
+
87
+ ## Acceleration Matters More Than You Expect
88
+
89
+ A package with `growth_ratio = 2.0` but `acceleration = 0.7` means: it doubled over 8 weeks, but the growth is actually slowing down. The last 2 weeks were slower than the 2 weeks before. This could be:
90
+ - A spike fading (viral moment passing)
91
+ - Growth plateauing after an initial launch burst
92
+ - A product that got attention but is not retaining users who try it
93
+
94
+ A package with `growth_ratio = 1.5` and `acceleration = 1.4` means: 50% growth over 8 weeks and the last 2 weeks were 40% higher than the prior 2. This is a package that is still accelerating. The inflection may not have happened yet.
95
+
96
+ The velocity formula weights both. A package that is growing AND accelerating gets a higher score than one that grew quickly but is now decelerating.
97
+
98
+ ---
99
+
100
+ ## Common Misclassifications
101
+
102
+ **Spike then flat:** A package gets 5,000 downloads in one week (from a tweet or Product Hunt feature) and then returns to 200/week. If the spike is in the recent_4 window, it will inflate the velocity score. Check the weekly trend array -- if it shows a single high spike rather than a steady incline, the breakout classification is unreliable.
103
+
104
+ **New package (fewer than 8 weeks old):** A new package going from 0 to 800 in its first 4 weeks will have a high growth_ratio (prior_4 is near 0). The formula guards against this with `max(prior_4, 1)`, which keeps the ratio from being infinity but can still produce inflated scores. The insufficient_data tier handles packages with fewer than 4 full weeks.
105
+
106
+ **Seasonal packages:** Some packages (tax filing tools, holiday card generators) have predictable annual spikes. If the analysis runs during the spike season, the velocity score will be high. The 12-week window partially mitigates this but does not eliminate it.
107
+
108
+ ---
109
+
110
+ ## What a Real Breakout Looks Like (Weekly Trend)
111
+
112
+ Genuine sustained breakout:
113
+ ```
114
+ Week 1: 1,200
115
+ Week 2: 1,400
116
+ Week 3: 1,900
117
+ Week 4: 2,800
118
+ Week 5: 3,900
119
+ Week 6: 5,200
120
+ Week 7: 6,800
121
+ Week 8: 8,900
122
+ ```
123
+
124
+ Spike-and-flat (not a breakout):
125
+ ```
126
+ Week 1: 800
127
+ Week 2: 850
128
+ Week 3: 12,400 <-- viral tweet or HN post
129
+ Week 4: 900
130
+ Week 5: 950
131
+ Week 6: 1,000
132
+ Week 7: 980
133
+ Week 8: 1,050
134
+ ```
135
+
136
+ The trend array in the output lets you visually distinguish these patterns. A good velocity score combined with a consistent upward trend array is the strongest signal.