@opendirectory.dev/skills 0.1.36 → 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.
@@ -0,0 +1,108 @@
1
+ [
2
+ {
3
+ "id": "eval_001",
4
+ "name": "npm SDK with real company adopters",
5
+ "description": "Full pipeline run on a well-known npm SDK with 20+ public repos. Verifies company org detection, scoring, enrichment, and brief generation all work end-to-end.",
6
+ "input": {
7
+ "prompt": "Find who is using my SDK on GitHub: stripe",
8
+ "env": {
9
+ "GITHUB_TOKEN": "set"
10
+ }
11
+ },
12
+ "expected_behavior": [
13
+ "Detects ecosystem as npm from the SDK name",
14
+ "Builds 4 query patterns: require(\"stripe\"), require('stripe'), from \"stripe\", from 'stripe'",
15
+ "Fetches up to 100 results per pattern, deduplicates by repo full_name",
16
+ "Filters forks and repos whose name starts with 'stripe' as noise",
17
+ "Classifies repos with owner.type == Organization as company_org",
18
+ "Fetches full repo metadata, owner profile, and top contributors for non-noise repos",
19
+ "Computes adoption_score using formula from scoring-guide.md",
20
+ "AI generates adoption briefs for repos with score >= 80",
21
+ "Every repo in the brief exists in the raw code search results",
22
+ "Every company name comes from the GitHub org.name or user.company API field",
23
+ "Every contributor handle comes from the contributors API response",
24
+ "Saves output to docs/sdk-adopters/stripe-YYYY-MM-DD.md and .json"
25
+ ],
26
+ "expected_output": "Report with at least 1 company_org repo, adoption velocity metrics, and at least 1 adoption brief with company name, top contributor handle, and outreach message."
27
+ },
28
+ {
29
+ "id": "eval_002",
30
+ "name": "Python SDK ecosystem detection",
31
+ "description": "Verifies auto-detection of Python ecosystem from snake_case package name and correct query pattern construction.",
32
+ "input": {
33
+ "prompt": "Track adoption of my Python library: boto3",
34
+ "env": {
35
+ "GITHUB_TOKEN": "set"
36
+ }
37
+ },
38
+ "expected_behavior": [
39
+ "Detects ecosystem as python from snake_case name with no hyphens or slashes",
40
+ "Builds 3 query patterns: 'import boto3', 'from boto3 import', 'from boto3.'",
41
+ "Does NOT use npm-style require() patterns",
42
+ "Fetches results and deduplicates repos",
43
+ "Classifies repos by tier using the same scoring formula",
44
+ "Proceeds through Steps 4-8 normally"
45
+ ],
46
+ "expected_output": "Report showing Python repos importing boto3, with correct ecosystem label in the output header."
47
+ },
48
+ {
49
+ "id": "eval_003",
50
+ "name": "Very new SDK not yet indexed",
51
+ "description": "Handles the case where a brand-new SDK returns 0 results from GitHub code search because indexing takes 1-4 weeks.",
52
+ "input": {
53
+ "prompt": "Find who is using my new SDK: my-brand-new-sdk-2026",
54
+ "env": {
55
+ "GITHUB_TOKEN": "set"
56
+ }
57
+ },
58
+ "expected_behavior": [
59
+ "Runs code search queries successfully (no API error)",
60
+ "Receives 0 results from all pattern queries",
61
+ "Does NOT proceed to Steps 4-8",
62
+ "Stops with a clear message: 'No repos found importing my-brand-new-sdk-2026. GitHub code search indexing takes 1-4 weeks for new packages.'",
63
+ "Does not write any output files",
64
+ "Does not hallucinate any repo results"
65
+ ],
66
+ "expected_output": "Graceful stop message with indexing explanation. No output file created."
67
+ },
68
+ {
69
+ "id": "eval_004",
70
+ "name": "GITHUB_TOKEN missing",
71
+ "description": "Verifies the skill stops immediately at Step 1 when GITHUB_TOKEN is not set, with a clear actionable error message.",
72
+ "input": {
73
+ "prompt": "Who is using my SDK: express",
74
+ "env": {
75
+ "GITHUB_TOKEN": "not set"
76
+ }
77
+ },
78
+ "expected_behavior": [
79
+ "Step 1 setup check detects GITHUB_TOKEN is missing",
80
+ "Stops immediately with error: 'GITHUB_TOKEN is required for code search.'",
81
+ "Includes instruction: 'Add a token at github.com/settings/tokens (no scopes needed for public repos).'",
82
+ "Explains why: unauthenticated code search hits 3 req/min secondary rate limit",
83
+ "Does NOT proceed to Step 2 or any API calls",
84
+ "Exit code 1 (or equivalent failure signal)"
85
+ ],
86
+ "expected_output": "Error message at Step 1 with token setup instructions. No API calls made."
87
+ },
88
+ {
89
+ "id": "eval_005",
90
+ "name": "All results are tutorial noise",
91
+ "description": "Handles the case where code search returns results but all repos are tutorials, examples, or forks -- no production adopters.",
92
+ "input": {
93
+ "prompt": "Find who is using my SDK: todo-app",
94
+ "env": {
95
+ "GITHUB_TOKEN": "set"
96
+ }
97
+ },
98
+ "expected_behavior": [
99
+ "Runs code search and finds repos",
100
+ "Step 4 classification marks all repos as tutorial_noise (name/description contain tutorial keywords)",
101
+ "No repos remain after filtering tutorial_noise",
102
+ "Does NOT proceed to Step 5 enrichment or Step 6 AI brief generation",
103
+ "Stops with message: 'All repos found appear to be tutorials or examples. No production adopters detected in public GitHub.'",
104
+ "Does not hallucinate production users"
105
+ ],
106
+ "expected_output": "Graceful stop with explanation. Breakdown table shows tutorial_noise count but 0 company/solo repos."
107
+ }
108
+ ]
@@ -0,0 +1,183 @@
1
+ # Import Patterns Reference
2
+
3
+ Used by SKILL.md Step 3 to build GitHub code search queries per ecosystem.
4
+
5
+ ---
6
+
7
+ ## Ecosystem Detection
8
+
9
+ Auto-detect from the SDK name before falling back to user input:
10
+
11
+ | Signal | Ecosystem |
12
+ |---|---|
13
+ | Starts with `@` (e.g. `@clerk/nextjs`) | npm |
14
+ | Contains `-` and no `github.com/` (e.g. `react-query`) | npm |
15
+ | snake_case only, no `-` or `/` (e.g. `requests`, `boto3`) | python |
16
+ | Contains `github.com/` (e.g. `github.com/stripe/stripe-go`) | go |
17
+ | Contains `.` with no other signals (e.g. `org.springframework.boot`) | java |
18
+ | Ambiguous | ask the user |
19
+
20
+ ---
21
+
22
+ ## npm / Node.js
23
+
24
+ **Search patterns (run each as a separate code search query):**
25
+
26
+ ```
27
+ require("sdk-name")
28
+ require('sdk-name')
29
+ from "sdk-name"
30
+ from 'sdk-name'
31
+ ```
32
+
33
+ **Notes:**
34
+ - `from "sdk-name"` catches ES module default and named imports: `import foo from "sdk-name"` and `import { bar } from "sdk-name"`
35
+ - `require("sdk-name")` catches CommonJS usage
36
+ - Use the full package name including `@org/` prefix for scoped packages
37
+ - Do NOT search `"sdk-name"` as a bare string -- too many false positives in package.json files
38
+
39
+ **Example for `@clerk/nextjs`:**
40
+ ```
41
+ require("@clerk/nextjs")
42
+ from "@clerk/nextjs"
43
+ from '@clerk/nextjs'
44
+ ```
45
+
46
+ ---
47
+
48
+ ## Python
49
+
50
+ **Search patterns:**
51
+
52
+ ```
53
+ import sdk_name
54
+ from sdk_name import
55
+ from sdk_name.
56
+ ```
57
+
58
+ **Notes:**
59
+ - `from sdk_name.` catches submodule imports: `from requests.exceptions import`
60
+ - Use the PyPI package name (snake_case), not the import name if they differ
61
+ - Example: `Pillow` installs as `pillow` but imports as `PIL` -- search `from PIL import` not `import pillow`
62
+
63
+ **Example for `requests`:**
64
+ ```
65
+ import requests
66
+ from requests import
67
+ from requests.
68
+ ```
69
+
70
+ ---
71
+
72
+ ## Go
73
+
74
+ **Search patterns:**
75
+
76
+ ```
77
+ "github.com/org/sdk-name"
78
+ ```
79
+
80
+ **Notes:**
81
+ - Go imports use the full module path, not just the package name
82
+ - Include the full `github.com/org/sdk-name` path in quotes
83
+ - For major version suffixes, add the version: `"github.com/org/sdk-name/v2"`
84
+
85
+ **Example for `github.com/stripe/stripe-go`:**
86
+ ```
87
+ "github.com/stripe/stripe-go"
88
+ ```
89
+
90
+ ---
91
+
92
+ ## Ruby / RubyGems
93
+
94
+ **Search patterns:**
95
+
96
+ ```
97
+ require 'sdk-name'
98
+ require "sdk-name"
99
+ gem 'sdk-name'
100
+ ```
101
+
102
+ **Notes:**
103
+ - `gem 'sdk-name'` catches Gemfile declarations (projects listing the dependency)
104
+ - `require 'sdk-name'` catches runtime usage
105
+
106
+ ---
107
+
108
+ ## Rust / Cargo
109
+
110
+ **Search patterns:**
111
+
112
+ ```
113
+ sdk-name =
114
+ sdk_name =
115
+ ```
116
+
117
+ **Notes:**
118
+ - Search `Cargo.toml` files for the dependency declaration
119
+ - Add `filename:Cargo.toml` to the query to narrow results
120
+ - Cargo uses hyphens in package names but underscores in crate names -- search both
121
+
122
+ **Example for `tokio`:**
123
+ ```
124
+ tokio =
125
+ ```
126
+
127
+ ---
128
+
129
+ ## PHP / Composer
130
+
131
+ **Search patterns:**
132
+
133
+ ```
134
+ require 'vendor/sdk-name'
135
+ use VendorName\SdkName
136
+ ```
137
+
138
+ ---
139
+
140
+ ## Java / Maven
141
+
142
+ **Search patterns:**
143
+
144
+ ```
145
+ import com.vendor.sdkname
146
+ <artifactId>sdk-name</artifactId>
147
+ ```
148
+
149
+ **Notes:**
150
+ - Maven/Gradle projects declare dependencies in `pom.xml` or `build.gradle`
151
+ - `<artifactId>sdk-name</artifactId>` catches Maven declarations
152
+ - Add `filename:pom.xml` to the query to narrow to Maven projects
153
+
154
+ ---
155
+
156
+ ## Generic Fallback
157
+
158
+ If the ecosystem is unclear, use the bare SDK name as the search query. This catches any file that mentions the name but produces more false positives. Always filter by file extension or language qualifier when possible:
159
+
160
+ ```
161
+ sdk-name language:javascript
162
+ sdk-name language:python
163
+ sdk-name language:typescript
164
+ ```
165
+
166
+ ---
167
+
168
+ ## Query Limit Budget
169
+
170
+ GitHub code search rate limit: 10 requests/minute (authenticated).
171
+
172
+ - npm: 4 queries
173
+ - Python: 3 queries
174
+ - Go: 1 query
175
+ - Ruby: 3 queries
176
+ - Generic: 1-3 queries
177
+
178
+ Sleep 6 seconds between queries to stay within 10 req/min.
179
+
180
+ Total scan time per ecosystem:
181
+ - npm: ~24 seconds (4 queries x 6s)
182
+ - Python: ~18 seconds (3 queries x 6s)
183
+ - Go: ~6 seconds (1 query)
@@ -0,0 +1,148 @@
1
+ # Adoption Scoring Guide
2
+
3
+ Used by SKILL.md Step 4 and scripts/fetch.py to classify repos by adoption signal strength.
4
+
5
+ ---
6
+
7
+ ## The Problem with Raw Search Results
8
+
9
+ A GitHub code search for `require("stripe")` returns 1,000+ repos. Most are:
10
+ - Tutorials: "learn-stripe-payments", "stripe-integration-example"
11
+ - Forks: someone forked the official Stripe SDK
12
+ - Abandoned side projects: last push was 2021
13
+ - Test repos: "stripe-test-app", "payment-playground"
14
+
15
+ The adoption score filters these out and surfaces the signal that matters: an active company repo using your SDK in production.
16
+
17
+ ---
18
+
19
+ ## Scoring Formula
20
+
21
+ ```python
22
+ score = 0
23
+
24
+ # Company signals (highest weight -- this is what you want to find)
25
+ if owner_type == "Organization": score += 50 # GitHub org = company or team
26
+ if company_field and company_field.strip(): score += 20 # user has company listed on GitHub
27
+
28
+ # Activity signals
29
+ score += min(stars, 500) / 10 # up to 50 points; capped at 500 stars
30
+ if days_since_push < 30: score += 30 # active in last month
31
+ if days_since_push < 7: score += 20 # active this week (cumulative with above)
32
+
33
+ # Quality signals
34
+ if not is_fork: score += 10 # original project, not a fork
35
+ if not is_archived: score += 10 # not abandoned
36
+ if not is_tutorial: score += 20 # not a demo or example
37
+
38
+ # Maximum possible score: 160+
39
+ # Typical company_org with recent activity: 110-150
40
+ # Typical active solo dev project: 60-90
41
+ # Typical stale personal project: 20-40
42
+ # Tutorial/noise: 0-20
43
+ ```
44
+
45
+ ---
46
+
47
+ ## Score Tiers
48
+
49
+ | Score | Tier | What it means |
50
+ |---|---|---|
51
+ | >= 80 | High signal | Generate a full adoption brief and outreach message |
52
+ | 40-79 | Medium signal | List in report, no full brief |
53
+ | < 40 | Noise | Include in breakdown count only |
54
+
55
+ ---
56
+
57
+ ## Company Classification Tiers
58
+
59
+ | Tier | Criteria | Confidence |
60
+ |---|---|---|
61
+ | `company_org` | `owner.type == "Organization"` | High -- GitHub org accounts are almost always a company, team, or serious open-source project |
62
+ | `affiliated_dev` | `owner.type == "User"` AND `company` field populated on GitHub profile | Medium -- self-reported, but developers with a company listed are usually professionals |
63
+ | `solo_dev` | `owner.type == "User"` AND no company field AND stars >= 10 | Low -- could be anyone; stars signal real usage |
64
+ | `tutorial_noise` | Name or description matches tutorial keywords, OR repo is a fork, OR repo is archived | Excluded from lead output |
65
+
66
+ ---
67
+
68
+ ## Tutorial Noise Detection
69
+
70
+ A repo is classified as `tutorial_noise` if its name or description contains any of these words:
71
+
72
+ ```
73
+ example, tutorial, demo, learn, sample, starter, boilerplate,
74
+ template, playground, test, course, workshop
75
+ ```
76
+
77
+ Additional noise signals:
78
+ - `fork == true`: the repo is a fork (could be a fork of the SDK itself)
79
+ - `archived == true`: the repo is no longer maintained
80
+ - Repo name matches the SDK name exactly (e.g. searching for `stripe` and finding a repo called `stripe`)
81
+ - Repo name starts with the SDK name followed by a dash (e.g. `stripe-clone`, `stripe-copy`)
82
+
83
+ ---
84
+
85
+ ## Velocity Signals
86
+
87
+ Velocity is inferred from `created_at` dates, not from direct historical data.
88
+
89
+ **Primary velocity metric:** Count of repos with `created_at` in the last 7, 14, and 30 days.
90
+
91
+ ```
92
+ New repos last 7 days: 3
93
+ New repos last 30 days: 11
94
+ ```
95
+
96
+ This tells you: 3 new teams started using the SDK in the last week.
97
+
98
+ **Secondary velocity metric (requires previous snapshot):** When a previous JSON snapshot exists in `docs/sdk-adopters/`, compare the current repo list to the previous one. The difference is the exact set of new adopters since the last run.
99
+
100
+ ```
101
+ New since last run (14 days ago): 5
102
+ ```
103
+
104
+ **Velocity interpretation:**
105
+ - 0 new in 30 days: stagnant adoption, possibly indexed months ago and no new users
106
+ - 1-3 new in 7 days: healthy organic growth
107
+ - 5+ new in 7 days: breakout adoption, consider proactive outreach
108
+
109
+ ---
110
+
111
+ ## The Top Contributor Signal
112
+
113
+ For each enriched repo, the script fetches the top 3 contributors by commit count via:
114
+ `GET /repos/{owner}/{repo}/contributors?per_page=3`
115
+
116
+ The person with the most commits is the most likely person to have introduced the SDK to that project. They are the warmest possible outreach target because:
117
+ 1. They chose the SDK
118
+ 2. They understand what it does
119
+ 3. They have the context to evaluate an upgrade, integration, or partnership
120
+
121
+ If you cannot identify the top contributor (rate limit, private contributors), fall back to the repo owner.
122
+
123
+ ---
124
+
125
+ ## Why Organization Repos Are Worth 50 Points
126
+
127
+ A `owner.type == "Organization"` repo means:
128
+ - A team created a GitHub org to publish this code
129
+ - At minimum, multiple people are involved
130
+ - The code is likely maintained beyond a single developer's interest
131
+ - The org may represent an actual company (check `org.blog` for the website)
132
+
133
+ Contrast with a user repo: one developer, may be a side project, no team ownership.
134
+
135
+ The 50-point weight reflects that finding a company using your SDK is 2-3x more valuable for GTM purposes than finding an individual developer.
136
+
137
+ ---
138
+
139
+ ## Common Misclassifications
140
+
141
+ **Large open-source projects classified as company_org:**
142
+ A GitHub org doesn't always mean a company. The Linux Foundation, Apache, CNCF, and similar foundations use orgs. These are valuable signal (indicates enterprise-grade adoption) but the outreach angle differs -- reach out to the project maintainers, not a sales contact.
143
+
144
+ **Tutorial repos with high stars:**
145
+ A well-known tutorial like "stripe-payments-tutorial" may have 500 stars. The adoption score caps the star contribution at 50 points (max 500 stars / 10), but the tutorial detection should have already filtered it. If a high-star tutorial slips through, check `data_quality_flags`.
146
+
147
+ **New repos with inflated scores:**
148
+ A repo created this week by an organization (50 points) with active recent push (50 points) scores 100+ even with 0 stars. This is intentional: a company adopting the SDK this week is a higher-priority outreach target than a solo dev with 50 stars who hasn't pushed in 6 months.