@rulemetric/skills-registry 0.1.1 → 0.2.0

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.
@@ -1,58 +1,189 @@
1
1
  import * as path from 'node:path';
2
- const GITHUB_API = 'https://api.github.com';
2
+ import { Octokit } from 'octokit';
3
+ import { retry } from '@octokit/plugin-retry';
4
+ import { throttling } from '@octokit/plugin-throttling';
5
+ import pLimit from 'p-limit';
6
+ // ── HTTP layer ───────────────────────────────────────────────────────────────
3
7
  const GITHUB_RAW = 'https://raw.githubusercontent.com';
4
- /** Fetch the file tree from a GitHub repo. */
5
- async function fetchTree(repo, branch = 'main') {
6
- const token = process.env.GITHUB_TOKEN;
7
- const headers = {
8
- 'Accept': 'application/vnd.github.v3+json',
9
- 'User-Agent': 'rulemetric-skills-registry',
10
- };
11
- if (token)
12
- headers['Authorization'] = `Bearer ${token}`;
13
- // Try the specified branch, fall back to master
14
- for (const b of [branch, 'master']) {
15
- const url = `${GITHUB_API}/repos/${repo}/git/trees/${b}?recursive=1`;
8
+ const USER_AGENT = 'rulemetric-skills-registry';
9
+ // Reject any single response over 10MB. Skill markdown files are tiny;
10
+ // anything larger is almost certainly a binary or generated artifact slipping
11
+ // through the pattern filter.
12
+ const MAX_BODY_BYTES = 10 * 1024 * 1024;
13
+ // Skip files that obviously aren't skill content. Saves request budget and
14
+ // avoids parsing large binary blobs as markdown.
15
+ const MAX_FILE_SIZE = 100 * 1024;
16
+ const SKIP_EXTENSIONS = new Set([
17
+ '.png', '.jpg', '.jpeg', '.gif', '.svg', '.ico',
18
+ '.lock', '.json', '.yml', '.yaml', '.toml',
19
+ ]);
20
+ const OctokitWithPlugins = Octokit.plugin(retry, throttling);
21
+ // Octokit's throttle plugin calls the on*RateLimit hook BEFORE sleeping
22
+ // `retryAfter` seconds. Pre-fix these hooks returned `retryCount < 2` (primary)
23
+ // and `true` (secondary), which on an unauthenticated worker meant a single
24
+ // failing call slept ~19-57 minutes before the next attempt — and the
25
+ // graphile-worker concurrency slot stayed locked the whole time. The cron
26
+ // produced zero progress logs and the job appeared hung. See
27
+ // docs/incidents/2026-05-20-launches-stuck-and-worker-wedge.md task #26 and
28
+ // apps/cli/src/lib/handlers/cron-refresh-skills.test.ts for the evidence.
29
+ //
30
+ // Fix: cap the wait we're willing to accept at 5 minutes. Anything longer
31
+ // means GitHub's rate window is essentially the next hour — at which point
32
+ // we'd rather throw, let fetchSource's catch log "Failed to fetch <repo>",
33
+ // call onProgress with count=0, and let the cron finish with partial data.
34
+ const MAX_RATE_LIMIT_RETRY_AFTER_SECONDS = 300;
35
+ /**
36
+ * Decide whether Octokit's primary-rate-limit retry is worth waiting for.
37
+ *
38
+ * Exported for unit testing — the function is pure (no I/O), so the test
39
+ * can assert the boundary cases without running the full crawl.
40
+ */
41
+ export function shouldRetryRateLimit(retryAfterSeconds, retryCount) {
42
+ if (retryAfterSeconds > MAX_RATE_LIMIT_RETRY_AFTER_SECONDS)
43
+ return false;
44
+ return retryCount < 2;
45
+ }
46
+ /**
47
+ * Decide whether Octokit's secondary-rate-limit retry is worth waiting for.
48
+ * Secondary limits are GitHub's abuse-detection cooldowns (multi-minute,
49
+ * sometimes longer). Same 5-min cap as primary.
50
+ */
51
+ export function shouldRetrySecondaryRateLimit(retryAfterSeconds) {
52
+ return retryAfterSeconds <= MAX_RATE_LIMIT_RETRY_AFTER_SECONDS;
53
+ }
54
+ let octokitInstance = null;
55
+ function getOctokit() {
56
+ if (octokitInstance)
57
+ return octokitInstance;
58
+ octokitInstance = new OctokitWithPlugins({
59
+ auth: process.env.GITHUB_TOKEN,
60
+ userAgent: USER_AGENT,
61
+ throttle: {
62
+ onRateLimit: (retryAfter, options, _octokit, retryCount) => {
63
+ const willRetry = shouldRetryRateLimit(retryAfter, retryCount);
64
+ console.warn(`GitHub rate limit hit on ${options.method} ${options.url}; retryAfter=${retryAfter}s retryCount=${retryCount}; ${willRetry ? `retrying` : `giving up (over ${MAX_RATE_LIMIT_RETRY_AFTER_SECONDS}s budget — set GITHUB_TOKEN for 5000 req/hr instead of the 60 req/hr unauthenticated cap)`}`);
65
+ return willRetry;
66
+ },
67
+ onSecondaryRateLimit: (retryAfter, options) => {
68
+ const willRetry = shouldRetrySecondaryRateLimit(retryAfter);
69
+ console.warn(`GitHub secondary rate limit on ${options.method} ${options.url}; retryAfter=${retryAfter}s; ${willRetry ? `backing off` : `giving up (over ${MAX_RATE_LIMIT_RETRY_AFTER_SECONDS}s budget)`}`);
70
+ return willRetry;
71
+ },
72
+ },
73
+ retry: { doNotRetry: [400, 401, 403, 404, 422] },
74
+ });
75
+ return octokitInstance;
76
+ }
77
+ /**
78
+ * Reset the cached Octokit instance. Test-only hook so a test that mutates
79
+ * `process.env.GITHUB_TOKEN` can force a fresh client on the next call —
80
+ * otherwise the singleton above pins the auth value from first use.
81
+ */
82
+ export function _resetOctokitForTests() {
83
+ octokitInstance = null;
84
+ }
85
+ // In-process ETag cache for raw-content fetches. Survives across sources within
86
+ // a single run; a re-run starts cold. Disk-cache could come later if/when this
87
+ // moves to a long-running worker.
88
+ const rawEtagCache = new Map();
89
+ /**
90
+ * Fetch raw content from raw.githubusercontent.com with ETag-based conditional
91
+ * GETs and basic retry. Raw URLs don't count against the GitHub API quota, so
92
+ * we don't go through octokit here — but we still want timeouts and retries.
93
+ */
94
+ async function fetchRaw(url, timeoutMs = 10_000, retries = 2) {
95
+ const cached = rawEtagCache.get(url);
96
+ const headers = { 'User-Agent': USER_AGENT };
97
+ if (process.env.GITHUB_TOKEN)
98
+ headers['Authorization'] = `Bearer ${process.env.GITHUB_TOKEN}`;
99
+ if (cached)
100
+ headers['If-None-Match'] = cached.etag;
101
+ let lastErr;
102
+ for (let attempt = 0; attempt <= retries; attempt++) {
16
103
  try {
17
- const resp = await fetch(url, { headers, signal: AbortSignal.timeout(15000) });
18
- if (resp.ok) {
19
- const data = await resp.json();
20
- return data.tree.filter(item => item.type === 'blob');
104
+ const resp = await fetch(url, { headers, signal: AbortSignal.timeout(timeoutMs) });
105
+ if (resp.status === 304 && cached) {
106
+ return { status: 304, body: cached.body, fromCache: true };
107
+ }
108
+ if (resp.status === 404)
109
+ return { status: 404, body: null, fromCache: false };
110
+ if (!resp.ok) {
111
+ // 5xx and 429 → retry; everything else → give up.
112
+ if (resp.status >= 500 || resp.status === 429) {
113
+ await sleep(250 * 2 ** attempt);
114
+ continue;
115
+ }
116
+ return { status: resp.status, body: null, fromCache: false };
21
117
  }
118
+ const body = await resp.text();
119
+ if (body.length > MAX_BODY_BYTES)
120
+ return { status: 413, body: null, fromCache: false };
121
+ const etag = resp.headers.get('etag');
122
+ if (etag)
123
+ rawEtagCache.set(url, { etag, body });
124
+ return { status: resp.status, body, fromCache: false };
22
125
  }
23
- catch {
24
- continue;
126
+ catch (err) {
127
+ lastErr = err;
128
+ await sleep(250 * 2 ** attempt);
25
129
  }
26
130
  }
27
- return [];
131
+ console.warn(`fetchRaw exhausted retries for ${url}:`, lastErr);
132
+ return { status: 0, body: null, fromCache: false };
28
133
  }
29
- /** Fetch raw file content from GitHub. */
30
- async function fetchFileContent(repo, filePath, branch = 'main') {
31
- const token = process.env.GITHUB_TOKEN;
32
- const headers = { 'User-Agent': 'rulemetric-skills-registry' };
33
- if (token)
34
- headers['Authorization'] = `Bearer ${token}`;
35
- for (const b of [branch, 'master']) {
36
- const url = `${GITHUB_RAW}/${repo}/${b}/${filePath}`;
37
- try {
38
- const resp = await fetch(url, { headers, signal: AbortSignal.timeout(10000) });
39
- if (resp.ok)
40
- return await resp.text();
41
- }
42
- catch {
43
- continue;
134
+ const sleep = (ms) => new Promise(r => setTimeout(r, ms));
135
+ /**
136
+ * Fetch repo metadata + tree SHA in one round trip via the API. Lets callers
137
+ * compare treeSha against a previous run to skip unchanged repos entirely.
138
+ */
139
+ async function fetchRepoMeta(repo) {
140
+ const [owner, name] = repo.split('/');
141
+ if (!owner || !name)
142
+ return null;
143
+ try {
144
+ const { data } = await getOctokit().rest.repos.get({ owner, repo: name });
145
+ const branchData = await getOctokit().rest.repos.getBranch({
146
+ owner, repo: name, branch: data.default_branch,
147
+ });
148
+ return {
149
+ defaultBranch: data.default_branch,
150
+ stars: data.stargazers_count,
151
+ treeSha: branchData.data.commit.sha,
152
+ };
153
+ }
154
+ catch (err) {
155
+ const status = err.status;
156
+ if (status !== 404)
157
+ console.warn(`fetchRepoMeta failed for ${repo}:`, err);
158
+ return null;
159
+ }
160
+ }
161
+ async function fetchTree(repo, treeSha) {
162
+ const [owner, name] = repo.split('/');
163
+ if (!owner || !name)
164
+ return [];
165
+ try {
166
+ const { data } = await getOctokit().rest.git.getTree({
167
+ owner, repo: name, tree_sha: treeSha, recursive: 'true',
168
+ });
169
+ if (data.truncated)
170
+ console.warn(`Tree truncated for ${repo} — large repo, some files skipped`);
171
+ const out = [];
172
+ for (const item of data.tree) {
173
+ if (item.type === 'blob' && typeof item.path === 'string') {
174
+ out.push({ path: item.path, type: 'blob', size: item.size ?? undefined });
175
+ }
44
176
  }
177
+ return out;
178
+ }
179
+ catch (err) {
180
+ console.warn(`fetchTree failed for ${repo}@${treeSha}:`, err);
181
+ return [];
45
182
  }
46
- return null;
47
183
  }
48
- /** Match a file path against glob-like patterns (simplified). */
184
+ // ── Pattern matching + content inference (unchanged from prior version) ──────
49
185
  function matchesPatterns(filePath, patterns) {
50
- for (const pattern of patterns) {
51
- const regex = patternToRegex(pattern);
52
- if (regex.test(filePath))
53
- return true;
54
- }
55
- return false;
186
+ return patterns.some(p => patternToRegex(p).test(filePath));
56
187
  }
57
188
  function patternToRegex(pattern) {
58
189
  const escaped = pattern
@@ -62,7 +193,6 @@ function patternToRegex(pattern) {
62
193
  .replace(/<<GLOBSTAR>>/g, '.*');
63
194
  return new RegExp(`^${escaped}$`);
64
195
  }
65
- /** Derive a skill ID from repo + path. */
66
196
  function deriveId(repo, filePath) {
67
197
  const repoShort = repo.split('/').pop() ?? repo;
68
198
  const name = path.basename(filePath, path.extname(filePath))
@@ -71,30 +201,21 @@ function deriveId(repo, filePath) {
71
201
  .replace(/^-|-$/g, '');
72
202
  return `${repoShort}--${name}`;
73
203
  }
74
- /** Derive a human-readable name from a file path. */
75
204
  function deriveName(filePath) {
76
205
  const name = path.basename(filePath, path.extname(filePath));
77
- return name
78
- .replace(/[-_]+/g, ' ')
79
- .replace(/\b\w/g, c => c.toUpperCase())
80
- .trim();
206
+ return name.replace(/[-_]+/g, ' ').replace(/\b\w/g, c => c.toUpperCase()).trim();
81
207
  }
82
- /** Extract description from the first paragraph of markdown content. */
83
208
  function extractDescription(content) {
84
209
  const lines = content.split('\n');
85
210
  for (const line of lines) {
86
211
  const trimmed = line.trim();
87
- // Skip headings, frontmatter, and empty lines
88
212
  if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith('---') || trimmed.startsWith('```'))
89
213
  continue;
90
- // Return first paragraph-like line
91
- if (trimmed.length > 10 && trimmed.length < 300) {
214
+ if (trimmed.length > 10 && trimmed.length < 300)
92
215
  return trimmed.slice(0, 200);
93
- }
94
216
  }
95
217
  return deriveName(lines[0] ?? '');
96
218
  }
97
- /** Infer category from file path and content. */
98
219
  function inferCategory(filePath, content) {
99
220
  const lower = (filePath + ' ' + content.slice(0, 500)).toLowerCase();
100
221
  if (/\btest|tdd|vitest|jest|pytest\b/.test(lower))
@@ -117,95 +238,56 @@ function inferCategory(filePath, content) {
117
238
  return 'workflow';
118
239
  return 'other';
119
240
  }
120
- /** Infer tags from content. */
121
241
  function inferTags(filePath, content) {
122
242
  const lower = (filePath + ' ' + content.slice(0, 1000)).toLowerCase();
123
243
  const tags = [];
124
244
  const tagPatterns = [
125
- [/\btypescript\b/, 'typescript'],
126
- [/\bpython\b/, 'python'],
127
- [/\brust\b/, 'rust'],
128
- [/\bgo\b/, 'go'],
129
- [/\bswift\b/, 'swift'],
130
- [/\breact\b/, 'react'],
131
- [/\bvue\b/, 'vue'],
132
- [/\bangular\b/, 'angular'],
133
- [/\bnext\.?js\b/, 'nextjs'],
134
- [/\bdjango\b/, 'django'],
135
- [/\brails\b/, 'rails'],
136
- [/\bflutter\b/, 'flutter'],
137
- [/\btdd\b/, 'tdd'],
138
- [/\btesting\b/, 'testing'],
139
- [/\bdocker\b/, 'docker'],
140
- [/\bapi\b/, 'api'],
141
- [/\bgit\b/, 'git'],
142
- [/\bcli\b/, 'cli'],
143
- [/\brefactor\b/, 'refactoring'],
245
+ [/\btypescript\b/, 'typescript'], [/\bpython\b/, 'python'], [/\brust\b/, 'rust'],
246
+ [/\bgo\b/, 'go'], [/\bswift\b/, 'swift'], [/\breact\b/, 'react'], [/\bvue\b/, 'vue'],
247
+ [/\bangular\b/, 'angular'], [/\bnext\.?js\b/, 'nextjs'], [/\bdjango\b/, 'django'],
248
+ [/\brails\b/, 'rails'], [/\bflutter\b/, 'flutter'], [/\btdd\b/, 'tdd'],
249
+ [/\btesting\b/, 'testing'], [/\bdocker\b/, 'docker'], [/\bapi\b/, 'api'],
250
+ [/\bgit\b/, 'git'], [/\bcli\b/, 'cli'], [/\brefactor\b/, 'refactoring'],
144
251
  [/\bdebug\b/, 'debugging'],
145
252
  ];
146
- for (const [regex, tag] of tagPatterns) {
253
+ for (const [regex, tag] of tagPatterns)
147
254
  if (regex.test(lower))
148
255
  tags.push(tag);
149
- }
150
256
  return tags;
151
257
  }
152
- /** Infer languages from content. */
153
258
  function inferLanguages(content) {
154
259
  const lower = content.slice(0, 2000).toLowerCase();
155
260
  const langs = [];
156
261
  const checks = [
157
- [/\btypescript\b/, 'typescript'],
158
- [/\bjavascript\b/, 'javascript'],
159
- [/\bpython\b/, 'python'],
160
- [/\brust\b/, 'rust'],
161
- [/\bgo\b/, 'go'],
162
- [/\bswift\b/, 'swift'],
163
- [/\bjava\b/, 'java'],
164
- [/\bruby\b/, 'ruby'],
165
- [/\bc\#|csharp\b/, 'csharp'],
166
- [/\bphp\b/, 'php'],
262
+ [/\btypescript\b/, 'typescript'], [/\bjavascript\b/, 'javascript'],
263
+ [/\bpython\b/, 'python'], [/\brust\b/, 'rust'], [/\bgo\b/, 'go'],
264
+ [/\bswift\b/, 'swift'], [/\bjava\b/, 'java'], [/\bruby\b/, 'ruby'],
265
+ [/\bc\#|csharp\b/, 'csharp'], [/\bphp\b/, 'php'],
167
266
  ];
168
- for (const [regex, lang] of checks) {
267
+ for (const [regex, lang] of checks)
169
268
  if (regex.test(lower))
170
269
  langs.push(lang);
171
- }
172
270
  return langs;
173
271
  }
174
- /** Fetch a GitHub repo's star count. */
175
- async function fetchStars(repo) {
176
- const token = process.env.GITHUB_TOKEN;
177
- const headers = {
178
- 'Accept': 'application/vnd.github.v3+json',
179
- 'User-Agent': 'rulemetric-skills-registry',
180
- };
181
- if (token)
182
- headers['Authorization'] = `Bearer ${token}`;
183
- try {
184
- const resp = await fetch(`${GITHUB_API}/repos/${repo}`, { headers, signal: AbortSignal.timeout(5000) });
185
- if (resp.ok) {
186
- const data = await resp.json();
187
- return data.stargazers_count;
188
- }
189
- }
190
- catch {
191
- // ignore
192
- }
193
- return 0;
194
- }
195
- /** Maximum file size to fetch (100KB). Skip huge files. */
196
- const MAX_FILE_SIZE = 100 * 1024;
197
- /** Skip files that are clearly not skills (images, lock files, etc.). */
198
- const SKIP_EXTENSIONS = new Set(['.png', '.jpg', '.jpeg', '.gif', '.svg', '.ico', '.lock', '.json', '.yml', '.yaml', '.toml']);
272
+ // ── Public API ───────────────────────────────────────────────────────────────
273
+ const FILE_CONCURRENCY = pLimit(8);
199
274
  /**
200
275
  * Fetch all skills from a single registry source.
201
- * Returns parsed SkillEntry objects.
276
+ *
277
+ * `previousTreeSha` is an optimization: if the repo's current tree SHA matches,
278
+ * the function returns early with `skipped: true` and no entries. The caller is
279
+ * expected to keep its existing entries for that source. Pass `undefined` to
280
+ * always fetch.
202
281
  */
203
- export async function fetchSource(source) {
204
- const branch = source.branch ?? 'main';
205
- const tree = await fetchTree(source.repo, branch);
206
- if (tree.length === 0)
207
- return [];
208
- // Filter files matching patterns
282
+ export async function fetchSource(source, previousTreeSha) {
283
+ const meta = await fetchRepoMeta(source.repo);
284
+ if (!meta)
285
+ return { entries: [], treeSha: null, skipped: false };
286
+ if (previousTreeSha && previousTreeSha === meta.treeSha) {
287
+ return { entries: [], treeSha: meta.treeSha, skipped: true };
288
+ }
289
+ const branch = source.branch ?? meta.defaultBranch;
290
+ const tree = await fetchTree(source.repo, meta.treeSha);
209
291
  const matchedFiles = tree.filter(item => {
210
292
  const ext = path.extname(item.path).toLowerCase();
211
293
  if (SKIP_EXTENSIONS.has(ext))
@@ -214,73 +296,68 @@ export async function fetchSource(source) {
214
296
  return false;
215
297
  return matchesPatterns(item.path, source.patterns);
216
298
  });
217
- const stars = await fetchStars(source.repo);
218
- const entries = [];
219
- // Fetch in batches to respect rate limits
220
- const BATCH_SIZE = 10;
221
- for (let i = 0; i < matchedFiles.length; i += BATCH_SIZE) {
222
- const batch = matchedFiles.slice(i, i + BATCH_SIZE);
223
- const results = await Promise.all(batch.map(async (file) => {
224
- const content = await fetchFileContent(source.repo, file.path, branch);
225
- if (!content || content.trim().length < 20)
226
- return null;
227
- const id = deriveId(source.repo, file.path);
228
- const name = deriveName(file.path);
229
- const description = extractDescription(content);
230
- const category = inferCategory(file.path, content);
231
- const tags = inferTags(file.path, content);
232
- const languages = inferLanguages(content);
233
- return {
234
- id,
235
- name,
236
- description,
237
- category: category !== 'other' ? category : source.defaultCategory,
238
- tags,
239
- tools: [source.defaultTool],
240
- languages: languages.length > 0 ? languages : undefined,
241
- source: {
242
- repo: source.repo,
243
- path: file.path,
244
- url: `https://github.com/${source.repo}/blob/${branch}/${file.path}`,
245
- license: source.license,
246
- },
247
- content,
248
- popularity: { stars },
249
- updatedAt: new Date().toISOString(),
250
- };
251
- }));
252
- for (const entry of results) {
253
- if (entry)
254
- entries.push(entry);
255
- }
256
- // Small delay between batches
257
- if (i + BATCH_SIZE < matchedFiles.length) {
258
- await new Promise(r => setTimeout(r, 200));
259
- }
260
- }
261
- return entries;
299
+ const entries = await Promise.all(matchedFiles.map(file => FILE_CONCURRENCY(async () => {
300
+ const url = `${GITHUB_RAW}/${source.repo}/${branch}/${file.path}`;
301
+ const result = await fetchRaw(url);
302
+ if (!result.body || result.body.trim().length < 20)
303
+ return null;
304
+ const content = result.body;
305
+ const id = deriveId(source.repo, file.path);
306
+ const name = deriveName(file.path);
307
+ const description = extractDescription(content);
308
+ const category = inferCategory(file.path, content);
309
+ const tags = inferTags(file.path, content);
310
+ const languages = inferLanguages(content);
311
+ return {
312
+ id,
313
+ name,
314
+ description,
315
+ category: category !== 'other' ? category : source.defaultCategory,
316
+ tags,
317
+ tools: [source.defaultTool],
318
+ languages: languages.length > 0 ? languages : undefined,
319
+ source: {
320
+ repo: source.repo,
321
+ path: file.path,
322
+ url: `https://github.com/${source.repo}/blob/${branch}/${file.path}`,
323
+ license: source.license,
324
+ },
325
+ content,
326
+ popularity: { stars: meta.stars },
327
+ updatedAt: new Date().toISOString(),
328
+ };
329
+ })));
330
+ return {
331
+ entries: entries.filter((e) => e !== null),
332
+ treeSha: meta.treeSha,
333
+ skipped: false,
334
+ };
262
335
  }
263
- /**
264
- * Fetch skills from multiple sources and deduplicate.
265
- */
266
- export async function fetchAllSources(sources, onProgress) {
336
+ const SOURCE_CONCURRENCY = pLimit(4);
337
+ /** Fetch skills from multiple sources, in parallel, deduplicating by id. */
338
+ export async function fetchAllSources(sources, options = {}) {
267
339
  const allEntries = [];
268
340
  const seenIds = new Set();
269
- for (const source of sources) {
341
+ const treeShas = new Map();
342
+ await Promise.all(sources.map(source => SOURCE_CONCURRENCY(async () => {
270
343
  try {
271
- const entries = await fetchSource(source);
272
- for (const entry of entries) {
344
+ const previous = options.previousShas?.get(source.repo);
345
+ const result = await fetchSource(source, previous);
346
+ if (result.treeSha)
347
+ treeShas.set(source.repo, result.treeSha);
348
+ for (const entry of result.entries) {
273
349
  if (!seenIds.has(entry.id)) {
274
350
  seenIds.add(entry.id);
275
351
  allEntries.push(entry);
276
352
  }
277
353
  }
278
- onProgress?.(source.repo, entries.length);
354
+ options.onProgress?.(source.repo, result.entries.length, result.skipped);
279
355
  }
280
356
  catch (err) {
281
357
  console.error(`Failed to fetch ${source.repo}:`, err);
358
+ options.onProgress?.(source.repo, 0, false);
282
359
  }
283
- }
284
- return allEntries;
360
+ })));
361
+ return { entries: allEntries, treeShas };
285
362
  }
286
363
  //# sourceMappingURL=github-fetcher.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"github-fetcher.js","sourceRoot":"","sources":["../src/github-fetcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"github-fetcher.js","sourceRoot":"","sources":["../src/github-fetcher.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  export type { SkillEntry, SkillRegistry, SkillSearchOptions, SkillSource, SkillCategory, ToolId, RegistrySource, } from './types.js';
2
2
  export { SkillCatalog } from './catalog.js';
3
- export { fetchSource, fetchAllSources } from './github-fetcher.js';
3
+ export { fetchSource, fetchAllSources, shouldRetryRateLimit, shouldRetrySecondaryRateLimit, _resetOctokitForTests, } from './github-fetcher.js';
4
4
  export { TIER_1_SOURCES, TIER_2_SOURCES } from './sources.js';
5
+ export { loadDiscoveredSources } from './discovered.js';
6
+ export { computeQualityScore, type QualityScore } from './scoring.js';
5
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,UAAU,EACV,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,MAAM,EACN,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,UAAU,EACV,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,MAAM,EACN,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EACL,WAAW,EACX,eAAe,EACf,oBAAoB,EACpB,6BAA6B,EAC7B,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,6 @@
1
1
  export { SkillCatalog } from './catalog.js';
2
- export { fetchSource, fetchAllSources } from './github-fetcher.js';
2
+ export { fetchSource, fetchAllSources, shouldRetryRateLimit, shouldRetrySecondaryRateLimit, _resetOctokitForTests, } from './github-fetcher.js';
3
3
  export { TIER_1_SOURCES, TIER_2_SOURCES } from './sources.js';
4
+ export { loadDiscoveredSources } from './discovered.js';
5
+ export { computeQualityScore } from './scoring.js';
4
6
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EACL,WAAW,EACX,eAAe,EACf,oBAAoB,EACpB,6BAA6B,EAC7B,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAqB,MAAM,cAAc,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { SkillEntry } from './types.js';
2
+ export interface QualityScore {
3
+ /** Overall score 0-100 */
4
+ overall: number;
5
+ /** Breakdown by factor */
6
+ factors: {
7
+ /** Stars-based popularity (0-25) */
8
+ popularity: number;
9
+ /** Content quality: length, sections, code blocks (0-25) */
10
+ contentQuality: number;
11
+ /** Metadata completeness: description, tags, languages (0-25) */
12
+ completeness: number;
13
+ /** How recently updated (0-25) */
14
+ recency: number;
15
+ };
16
+ }
17
+ /** Compute a quality score for a skill entry. */
18
+ export declare function computeQualityScore(skill: SkillEntry): QualityScore;
19
+ //# sourceMappingURL=scoring.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scoring.d.ts","sourceRoot":"","sources":["../src/scoring.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,YAAY;IAC3B,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,0BAA0B;IAC1B,OAAO,EAAE;QACP,oCAAoC;QACpC,UAAU,EAAE,MAAM,CAAC;QACnB,4DAA4D;QAC5D,cAAc,EAAE,MAAM,CAAC;QACvB,iEAAiE;QACjE,YAAY,EAAE,MAAM,CAAC;QACrB,kCAAkC;QAClC,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,iDAAiD;AACjD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY,CAYnE"}