@rulemetric/skills-registry 0.1.1

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,21 @@
1
+ import type { SkillEntry, SkillRegistry, SkillSearchOptions } from './types.js';
2
+ /** In-memory skill registry with search capabilities. */
3
+ export declare class SkillCatalog {
4
+ private skills;
5
+ constructor(registry?: SkillRegistry);
6
+ /** Load skills from a registry object. */
7
+ load(registry: SkillRegistry): void;
8
+ /** Total number of skills in the catalog. */
9
+ get size(): number;
10
+ /** Get a skill by ID. */
11
+ get(id: string): SkillEntry | undefined;
12
+ /** Search and filter skills. */
13
+ search(options?: SkillSearchOptions): SkillEntry[];
14
+ /** List all unique categories. */
15
+ categories(): string[];
16
+ /** List all unique tags. */
17
+ tags(): string[];
18
+ /** List all unique tools. */
19
+ tools(): string[];
20
+ }
21
+ //# sourceMappingURL=catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhF,yDAAyD;AACzD,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAoB;gBAEtB,QAAQ,CAAC,EAAE,aAAa;IAMpC,0CAA0C;IAC1C,IAAI,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAInC,6CAA6C;IAC7C,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,yBAAyB;IACzB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIvC,gCAAgC;IAChC,MAAM,CAAC,OAAO,GAAE,kBAAuB,GAAG,UAAU,EAAE;IA2DtD,kCAAkC;IAClC,UAAU,IAAI,MAAM,EAAE;IAItB,4BAA4B;IAC5B,IAAI,IAAI,MAAM,EAAE;IAIhB,6BAA6B;IAC7B,KAAK,IAAI,MAAM,EAAE;CAGlB"}
@@ -0,0 +1,75 @@
1
+ /** In-memory skill registry with search capabilities. */
2
+ export class SkillCatalog {
3
+ skills = [];
4
+ constructor(registry) {
5
+ if (registry) {
6
+ this.skills = registry.skills;
7
+ }
8
+ }
9
+ /** Load skills from a registry object. */
10
+ load(registry) {
11
+ this.skills = registry.skills;
12
+ }
13
+ /** Total number of skills in the catalog. */
14
+ get size() {
15
+ return this.skills.length;
16
+ }
17
+ /** Get a skill by ID. */
18
+ get(id) {
19
+ return this.skills.find(s => s.id === id);
20
+ }
21
+ /** Search and filter skills. */
22
+ search(options = {}) {
23
+ let results = this.skills;
24
+ if (options.tool) {
25
+ results = results.filter(s => s.tools.includes(options.tool) || s.tools.includes('universal'));
26
+ }
27
+ if (options.category) {
28
+ results = results.filter(s => s.category === options.category);
29
+ }
30
+ if (options.language) {
31
+ const lang = options.language.toLowerCase();
32
+ results = results.filter(s => s.languages?.some(l => l.toLowerCase() === lang));
33
+ }
34
+ if (options.framework) {
35
+ const fw = options.framework.toLowerCase();
36
+ results = results.filter(s => s.frameworks?.some(f => f.toLowerCase() === fw));
37
+ }
38
+ if (options.tags && options.tags.length > 0) {
39
+ const tagsLower = options.tags.map(t => t.toLowerCase());
40
+ results = results.filter(s => tagsLower.some(t => s.tags.some(st => st.toLowerCase() === t)));
41
+ }
42
+ if (options.query) {
43
+ const q = options.query.toLowerCase();
44
+ results = results.filter(s => s.name.toLowerCase().includes(q) ||
45
+ s.description.toLowerCase().includes(q) ||
46
+ s.tags.some(t => t.toLowerCase().includes(q)) ||
47
+ s.id.toLowerCase().includes(q));
48
+ }
49
+ // Sort by popularity (stars), then alphabetically
50
+ results.sort((a, b) => {
51
+ const starsA = a.popularity?.stars ?? 0;
52
+ const starsB = b.popularity?.stars ?? 0;
53
+ if (starsA !== starsB)
54
+ return starsB - starsA;
55
+ return a.name.localeCompare(b.name);
56
+ });
57
+ if (options.limit) {
58
+ results = results.slice(0, options.limit);
59
+ }
60
+ return results;
61
+ }
62
+ /** List all unique categories. */
63
+ categories() {
64
+ return [...new Set(this.skills.map(s => s.category))].sort();
65
+ }
66
+ /** List all unique tags. */
67
+ tags() {
68
+ return [...new Set(this.skills.flatMap(s => s.tags))].sort();
69
+ }
70
+ /** List all unique tools. */
71
+ tools() {
72
+ return [...new Set(this.skills.flatMap(s => s.tools))].sort();
73
+ }
74
+ }
75
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAEA,yDAAyD;AACzD,MAAM,OAAO,YAAY;IACf,MAAM,GAAiB,EAAE,CAAC;IAElC,YAAY,QAAwB;QAClC,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAChC,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,IAAI,CAAC,QAAuB;QAC1B,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IAChC,CAAC;IAED,6CAA6C;IAC7C,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,yBAAyB;IACzB,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,gCAAgC;IAChC,MAAM,CAAC,UAA8B,EAAE;QACrC,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;QAE1B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC3B,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CACjE,CAAC;QACJ,CAAC;QAED,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YAC5C,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC3B,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,CACjD,CAAC;QACJ,CAAC;QAED,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;YAC3C,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC3B,CAAC,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,CAChD,CAAC;QACJ,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YACzD,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC3B,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,CAC/D,CAAC;QACJ,CAAC;QAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;YACtC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC3B,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAChC,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACvC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC7C,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAC/B,CAAC;QACJ,CAAC;QAED,kDAAkD;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACpB,MAAM,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,KAAK,IAAI,CAAC,CAAC;YACxC,MAAM,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,KAAK,IAAI,CAAC,CAAC;YACxC,IAAI,MAAM,KAAK,MAAM;gBAAE,OAAO,MAAM,GAAG,MAAM,CAAC;YAC9C,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5C,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,kCAAkC;IAClC,UAAU;QACR,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/D,CAAC;IAED,4BAA4B;IAC5B,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/D,CAAC;IAED,6BAA6B;IAC7B,KAAK;QACH,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAChE,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env tsx
2
+ export {};
3
+ //# sourceMappingURL=fetch-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-registry.d.ts","sourceRoot":"","sources":["../src/fetch-registry.ts"],"names":[],"mappings":""}
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Fetch skills from Tier 1 GitHub sources and write registry.json.
4
+ *
5
+ * Usage:
6
+ * GITHUB_TOKEN=ghp_xxx pnpm --filter @rulemetric/skills-registry fetch
7
+ *
8
+ * Without GITHUB_TOKEN you'll hit rate limits quickly (~60 req/hr).
9
+ * With a token you get 5,000 req/hr.
10
+ */
11
+ import * as fs from 'node:fs';
12
+ import * as path from 'node:path';
13
+ import { fileURLToPath } from 'node:url';
14
+ import { fetchAllSources } from './github-fetcher.js';
15
+ import { TIER_1_SOURCES } from './sources.js';
16
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
17
+ const OUTPUT_PATH = path.resolve(__dirname, '..', 'registry.json');
18
+ async function main() {
19
+ console.log(`Fetching skills from ${TIER_1_SOURCES.length} Tier 1 sources...\n`);
20
+ const entries = await fetchAllSources(TIER_1_SOURCES, (source, count) => {
21
+ console.log(` ${source}: ${count} skills`);
22
+ });
23
+ const registry = {
24
+ version: '1.0.0',
25
+ generatedAt: new Date().toISOString(),
26
+ skills: entries,
27
+ };
28
+ // Write full registry (with content)
29
+ fs.writeFileSync(OUTPUT_PATH, JSON.stringify(registry, null, 2));
30
+ console.log(`\nWrote ${entries.length} skills to ${OUTPUT_PATH}`);
31
+ // Write lightweight index (without content, for quick loading)
32
+ const indexPath = path.resolve(__dirname, '..', 'registry-index.json');
33
+ const index = {
34
+ version: registry.version,
35
+ generatedAt: registry.generatedAt,
36
+ skills: entries.map(({ content, ...rest }) => rest),
37
+ };
38
+ fs.writeFileSync(indexPath, JSON.stringify(index, null, 2));
39
+ console.log(`Wrote index (no content) to ${indexPath}`);
40
+ // Stats
41
+ const byTool = new Map();
42
+ const byCat = new Map();
43
+ for (const s of entries) {
44
+ for (const t of s.tools)
45
+ byTool.set(t, (byTool.get(t) ?? 0) + 1);
46
+ byCat.set(s.category, (byCat.get(s.category) ?? 0) + 1);
47
+ }
48
+ console.log('\nBy tool:', Object.fromEntries(byTool));
49
+ console.log('By category:', Object.fromEntries(byCat));
50
+ }
51
+ main().catch(err => {
52
+ console.error('Fatal:', err);
53
+ process.exit(1);
54
+ });
55
+ //# sourceMappingURL=fetch-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-registry.js","sourceRoot":"","sources":["../src/fetch-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { RegistrySource, SkillEntry } from './types.js';
2
+ /**
3
+ * Fetch all skills from a single registry source.
4
+ * Returns parsed SkillEntry objects.
5
+ */
6
+ export declare function fetchSource(source: RegistrySource): Promise<SkillEntry[]>;
7
+ /**
8
+ * Fetch skills from multiple sources and deduplicate.
9
+ */
10
+ export declare function fetchAllSources(sources: RegistrySource[], onProgress?: (source: string, count: number) => void): Promise<SkillEntry[]>;
11
+ //# sourceMappingURL=github-fetcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-fetcher.d.ts","sourceRoot":"","sources":["../src/github-fetcher.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAyB,MAAM,YAAY,CAAC;AAiNpF;;;GAGG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAiE/E;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,cAAc,EAAE,EACzB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GACnD,OAAO,CAAC,UAAU,EAAE,CAAC,CAoBvB"}
@@ -0,0 +1,286 @@
1
+ import * as path from 'node:path';
2
+ const GITHUB_API = 'https://api.github.com';
3
+ 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`;
16
+ 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');
21
+ }
22
+ }
23
+ catch {
24
+ continue;
25
+ }
26
+ }
27
+ return [];
28
+ }
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;
44
+ }
45
+ }
46
+ return null;
47
+ }
48
+ /** Match a file path against glob-like patterns (simplified). */
49
+ 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;
56
+ }
57
+ function patternToRegex(pattern) {
58
+ const escaped = pattern
59
+ .replace(/[.+^${}()|[\]\\]/g, '\\$&')
60
+ .replace(/\*\*/g, '<<GLOBSTAR>>')
61
+ .replace(/\*/g, '[^/]*')
62
+ .replace(/<<GLOBSTAR>>/g, '.*');
63
+ return new RegExp(`^${escaped}$`);
64
+ }
65
+ /** Derive a skill ID from repo + path. */
66
+ function deriveId(repo, filePath) {
67
+ const repoShort = repo.split('/').pop() ?? repo;
68
+ const name = path.basename(filePath, path.extname(filePath))
69
+ .toLowerCase()
70
+ .replace(/[^a-z0-9]+/g, '-')
71
+ .replace(/^-|-$/g, '');
72
+ return `${repoShort}--${name}`;
73
+ }
74
+ /** Derive a human-readable name from a file path. */
75
+ function deriveName(filePath) {
76
+ const name = path.basename(filePath, path.extname(filePath));
77
+ return name
78
+ .replace(/[-_]+/g, ' ')
79
+ .replace(/\b\w/g, c => c.toUpperCase())
80
+ .trim();
81
+ }
82
+ /** Extract description from the first paragraph of markdown content. */
83
+ function extractDescription(content) {
84
+ const lines = content.split('\n');
85
+ for (const line of lines) {
86
+ const trimmed = line.trim();
87
+ // Skip headings, frontmatter, and empty lines
88
+ if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith('---') || trimmed.startsWith('```'))
89
+ continue;
90
+ // Return first paragraph-like line
91
+ if (trimmed.length > 10 && trimmed.length < 300) {
92
+ return trimmed.slice(0, 200);
93
+ }
94
+ }
95
+ return deriveName(lines[0] ?? '');
96
+ }
97
+ /** Infer category from file path and content. */
98
+ function inferCategory(filePath, content) {
99
+ const lower = (filePath + ' ' + content.slice(0, 500)).toLowerCase();
100
+ if (/\btest|tdd|vitest|jest|pytest\b/.test(lower))
101
+ return 'testing';
102
+ if (/\bsecur|auth|oauth|csrf|xss\b/.test(lower))
103
+ return 'security';
104
+ if (/\breact|vue|angular|svelte|next|nuxt|django|rails|flask|fastapi\b/.test(lower))
105
+ return 'framework';
106
+ if (/\btypescript|python|rust|go|swift|java|ruby\b/.test(lower))
107
+ return 'language';
108
+ if (/\bdocker|k8s|kubernetes|ci\/cd|deploy|terraform|aws\b/.test(lower))
109
+ return 'devops';
110
+ if (/\barchitect|clean|ddd|hexagonal|microservic\b/.test(lower))
111
+ return 'architecture';
112
+ if (/\bperf|optim|cache|benchmark\b/.test(lower))
113
+ return 'performance';
114
+ if (/\bdoc|readme|changelog\b/.test(lower))
115
+ return 'documentation';
116
+ if (/\bworkflow|process|tdd|red.green|agile\b/.test(lower))
117
+ return 'workflow';
118
+ return 'other';
119
+ }
120
+ /** Infer tags from content. */
121
+ function inferTags(filePath, content) {
122
+ const lower = (filePath + ' ' + content.slice(0, 1000)).toLowerCase();
123
+ const tags = [];
124
+ 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'],
144
+ [/\bdebug\b/, 'debugging'],
145
+ ];
146
+ for (const [regex, tag] of tagPatterns) {
147
+ if (regex.test(lower))
148
+ tags.push(tag);
149
+ }
150
+ return tags;
151
+ }
152
+ /** Infer languages from content. */
153
+ function inferLanguages(content) {
154
+ const lower = content.slice(0, 2000).toLowerCase();
155
+ const langs = [];
156
+ 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'],
167
+ ];
168
+ for (const [regex, lang] of checks) {
169
+ if (regex.test(lower))
170
+ langs.push(lang);
171
+ }
172
+ return langs;
173
+ }
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']);
199
+ /**
200
+ * Fetch all skills from a single registry source.
201
+ * Returns parsed SkillEntry objects.
202
+ */
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
209
+ const matchedFiles = tree.filter(item => {
210
+ const ext = path.extname(item.path).toLowerCase();
211
+ if (SKIP_EXTENSIONS.has(ext))
212
+ return false;
213
+ if ((item.size ?? 0) > MAX_FILE_SIZE)
214
+ return false;
215
+ return matchesPatterns(item.path, source.patterns);
216
+ });
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;
262
+ }
263
+ /**
264
+ * Fetch skills from multiple sources and deduplicate.
265
+ */
266
+ export async function fetchAllSources(sources, onProgress) {
267
+ const allEntries = [];
268
+ const seenIds = new Set();
269
+ for (const source of sources) {
270
+ try {
271
+ const entries = await fetchSource(source);
272
+ for (const entry of entries) {
273
+ if (!seenIds.has(entry.id)) {
274
+ seenIds.add(entry.id);
275
+ allEntries.push(entry);
276
+ }
277
+ }
278
+ onProgress?.(source.repo, entries.length);
279
+ }
280
+ catch (err) {
281
+ console.error(`Failed to fetch ${source.repo}:`, err);
282
+ }
283
+ }
284
+ return allEntries;
285
+ }
286
+ //# sourceMappingURL=github-fetcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-fetcher.js","sourceRoot":"","sources":["../src/github-fetcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export type { SkillEntry, SkillRegistry, SkillSearchOptions, SkillSource, SkillCategory, ToolId, RegistrySource, } from './types.js';
2
+ export { SkillCatalog } from './catalog.js';
3
+ export { fetchSource, fetchAllSources } from './github-fetcher.js';
4
+ export { TIER_1_SOURCES, TIER_2_SOURCES } from './sources.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { SkillCatalog } from './catalog.js';
2
+ export { fetchSource, fetchAllSources } from './github-fetcher.js';
3
+ export { TIER_1_SOURCES, TIER_2_SOURCES } from './sources.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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"}
@@ -0,0 +1,6 @@
1
+ import type { RegistrySource } from './types.js';
2
+ /** Tier 1 sources — high-quality, actively maintained repos. */
3
+ export declare const TIER_1_SOURCES: RegistrySource[];
4
+ /** Tier 2 sources — niche but valuable. */
5
+ export declare const TIER_2_SOURCES: RegistrySource[];
6
+ //# sourceMappingURL=sources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sources.d.ts","sourceRoot":"","sources":["../src/sources.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,gEAAgE;AAChE,eAAO,MAAM,cAAc,EAAE,cAAc,EAiH1C,CAAC;AAEF,2CAA2C;AAC3C,eAAO,MAAM,cAAc,EAAE,cAAc,EA+I1C,CAAC"}
@@ -0,0 +1,261 @@
1
+ /** Tier 1 sources — high-quality, actively maintained repos. */
2
+ export const TIER_1_SOURCES = [
3
+ {
4
+ repo: 'PatrickJS/awesome-cursorrules',
5
+ patterns: ['rules/**/*.cursorrules', 'rules/**/*.mdc', 'rules/**/*.md'],
6
+ defaultTool: 'cursor',
7
+ defaultCategory: 'other',
8
+ license: 'CC0-1.0',
9
+ },
10
+ {
11
+ repo: 'github/awesome-copilot',
12
+ patterns: ['instructions/**/*.md', 'agents/**/*.md'],
13
+ defaultTool: 'copilot',
14
+ defaultCategory: 'other',
15
+ license: 'MIT',
16
+ },
17
+ {
18
+ repo: 'hesreallyhim/awesome-claude-code',
19
+ patterns: ['skills/**/*.md', 'commands/**/*.md'],
20
+ defaultTool: 'claude_code',
21
+ defaultCategory: 'workflow',
22
+ license: 'MIT',
23
+ },
24
+ {
25
+ repo: 'Jeffallan/claude-skills',
26
+ patterns: ['skills/**/*.md', '*.md'],
27
+ defaultTool: 'claude_code',
28
+ defaultCategory: 'workflow',
29
+ license: 'MIT',
30
+ },
31
+ {
32
+ repo: 'microsoft/skills',
33
+ patterns: ['**/*.md'],
34
+ defaultTool: 'copilot',
35
+ defaultCategory: 'tool',
36
+ license: 'MIT',
37
+ },
38
+ {
39
+ repo: 'instructa/ai-prompts',
40
+ patterns: ['**/*.md'],
41
+ defaultTool: 'universal',
42
+ defaultCategory: 'other',
43
+ license: 'MIT',
44
+ },
45
+ {
46
+ repo: 'sickn33/antigravity-awesome-skills',
47
+ patterns: ['skills/**/*.md'],
48
+ defaultTool: 'universal',
49
+ defaultCategory: 'workflow',
50
+ license: 'MIT',
51
+ },
52
+ {
53
+ repo: 'alirezarezvani/claude-skills',
54
+ patterns: ['skills/**/*.md', 'agents/**/*.md'],
55
+ defaultTool: 'claude_code',
56
+ defaultCategory: 'workflow',
57
+ license: 'MIT',
58
+ },
59
+ {
60
+ repo: 'VoltAgent/awesome-openclaw-skills',
61
+ patterns: ['skills/**/*.md'],
62
+ defaultTool: 'universal',
63
+ defaultCategory: 'workflow',
64
+ license: 'MIT',
65
+ },
66
+ {
67
+ repo: 'VoltAgent/awesome-agent-skills',
68
+ patterns: ['skills/**/*.md'],
69
+ defaultTool: 'universal',
70
+ defaultCategory: 'workflow',
71
+ license: 'MIT',
72
+ },
73
+ {
74
+ repo: 'VoltAgent/awesome-claude-code-subagents',
75
+ patterns: ['subagents/**/*.md', 'agents/**/*.md'],
76
+ defaultTool: 'claude_code',
77
+ defaultCategory: 'workflow',
78
+ license: 'MIT',
79
+ },
80
+ {
81
+ repo: 'ComposioHQ/awesome-claude-skills',
82
+ patterns: ['skills/**/*.md', '**/*.md'],
83
+ defaultTool: 'claude_code',
84
+ defaultCategory: 'workflow',
85
+ license: 'MIT',
86
+ },
87
+ {
88
+ repo: 'travisvn/awesome-claude-skills',
89
+ patterns: ['skills/**/*.md', '**/*.md'],
90
+ defaultTool: 'claude_code',
91
+ defaultCategory: 'workflow',
92
+ license: 'MIT',
93
+ },
94
+ {
95
+ repo: 'agentsmd/agents.md',
96
+ patterns: ['examples/**/*.md', '**/*.md'],
97
+ defaultTool: 'universal',
98
+ defaultCategory: 'workflow',
99
+ license: 'MIT',
100
+ },
101
+ {
102
+ repo: 'kepano/obsidian-skills',
103
+ patterns: ['**/*.md'],
104
+ defaultTool: 'universal',
105
+ defaultCategory: 'tool',
106
+ license: 'MIT',
107
+ },
108
+ {
109
+ repo: 'VoltAgent/awesome-design-md',
110
+ patterns: ['designs/**/*.md', '**/*.md'],
111
+ defaultTool: 'universal',
112
+ defaultCategory: 'other',
113
+ license: 'MIT',
114
+ },
115
+ ];
116
+ /** Tier 2 sources — niche but valuable. */
117
+ export const TIER_2_SOURCES = [
118
+ {
119
+ repo: 'awslabs/aidlc-workflows',
120
+ patterns: ['**/*.md'],
121
+ defaultTool: 'universal',
122
+ defaultCategory: 'workflow',
123
+ license: 'Apache-2.0',
124
+ },
125
+ {
126
+ repo: 'Bhartendu-Kumar/rules_template',
127
+ patterns: ['**/*.md'],
128
+ defaultTool: 'universal',
129
+ defaultCategory: 'workflow',
130
+ },
131
+ {
132
+ repo: 'ThibautBaissac/rails_ai_agents',
133
+ patterns: ['**/*.md'],
134
+ defaultTool: 'universal',
135
+ defaultCategory: 'framework',
136
+ },
137
+ {
138
+ repo: 'twostraws/SwiftAgents',
139
+ patterns: ['AGENTS.md'],
140
+ defaultTool: 'universal',
141
+ defaultCategory: 'language',
142
+ },
143
+ {
144
+ repo: 'evanca/flutter-ai-rules',
145
+ patterns: ['**/*.md', '**/*.cursorrules'],
146
+ defaultTool: 'universal',
147
+ defaultCategory: 'framework',
148
+ },
149
+ {
150
+ repo: 'Lance-He/claude-md-rules',
151
+ patterns: ['**/*.md'],
152
+ defaultTool: 'claude_code',
153
+ defaultCategory: 'language',
154
+ },
155
+ {
156
+ repo: 'botingw/rulebook-ai',
157
+ patterns: ['templates/**/*'],
158
+ defaultTool: 'universal',
159
+ defaultCategory: 'workflow',
160
+ license: 'MIT',
161
+ },
162
+ {
163
+ repo: 'trailofbits/skills',
164
+ patterns: ['skills/**/*.md', '**/*.md'],
165
+ defaultTool: 'claude_code',
166
+ defaultCategory: 'security',
167
+ license: 'MIT',
168
+ },
169
+ {
170
+ repo: 'grapeot/devin.cursorrules',
171
+ patterns: ['**/*.cursorrules', '**/*.mdc'],
172
+ defaultTool: 'cursor',
173
+ defaultCategory: 'workflow',
174
+ license: 'MIT',
175
+ },
176
+ {
177
+ repo: 'sanjeed5/awesome-cursor-rules-mdc',
178
+ patterns: ['rules/**/*.mdc', '**/*.mdc'],
179
+ defaultTool: 'cursor',
180
+ defaultCategory: 'other',
181
+ license: 'MIT',
182
+ },
183
+ {
184
+ repo: 'Aaronontheweb/dotnet-skills',
185
+ patterns: ['**/*.md'],
186
+ defaultTool: 'claude_code',
187
+ defaultCategory: 'language',
188
+ license: 'MIT',
189
+ },
190
+ {
191
+ repo: 'BehiSecc/awesome-claude-skills',
192
+ patterns: ['**/*.md'],
193
+ defaultTool: 'claude_code',
194
+ defaultCategory: 'workflow',
195
+ license: 'MIT',
196
+ },
197
+ {
198
+ repo: 'rohitg00/awesome-claude-code-toolkit',
199
+ patterns: ['skills/**/*.md', 'agents/**/*.md'],
200
+ defaultTool: 'claude_code',
201
+ defaultCategory: 'workflow',
202
+ license: 'MIT',
203
+ },
204
+ {
205
+ repo: 'ccplugins/awesome-claude-code-plugins',
206
+ patterns: ['**/*.md'],
207
+ defaultTool: 'claude_code',
208
+ defaultCategory: 'tool',
209
+ license: 'MIT',
210
+ },
211
+ {
212
+ repo: 'mergisi/awesome-openclaw-agents',
213
+ patterns: ['agents/**/*.md', '**/*.md'],
214
+ defaultTool: 'openclaw',
215
+ defaultCategory: 'workflow',
216
+ license: 'MIT',
217
+ },
218
+ {
219
+ repo: 'Vishavjeet6/awesome-copilot-instructions',
220
+ patterns: ['**/*.md'],
221
+ defaultTool: 'copilot',
222
+ defaultCategory: 'other',
223
+ license: 'MIT',
224
+ },
225
+ {
226
+ repo: 'pamelafox/awesome-copilot-instructions',
227
+ patterns: ['**/*.md'],
228
+ defaultTool: 'copilot',
229
+ defaultCategory: 'other',
230
+ license: 'MIT',
231
+ },
232
+ {
233
+ repo: 'Code-and-Sorts/awesome-copilot-agents',
234
+ patterns: ['**/*.md'],
235
+ defaultTool: 'copilot',
236
+ defaultCategory: 'workflow',
237
+ license: 'MIT',
238
+ },
239
+ {
240
+ repo: 'detailobsessed/awesome-windsurf',
241
+ patterns: ['**/*.windsurfrules', '**/*.md'],
242
+ defaultTool: 'windsurf',
243
+ defaultCategory: 'other',
244
+ license: 'MIT',
245
+ },
246
+ {
247
+ repo: 'lackeyjb/playwright-skill',
248
+ patterns: ['**/*.md'],
249
+ defaultTool: 'claude_code',
250
+ defaultCategory: 'testing',
251
+ license: 'MIT',
252
+ },
253
+ {
254
+ repo: 'TheDecipherist/claude-code-mastery',
255
+ patterns: ['**/*.md'],
256
+ defaultTool: 'claude_code',
257
+ defaultCategory: 'workflow',
258
+ license: 'MIT',
259
+ },
260
+ ];
261
+ //# sourceMappingURL=sources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sources.js","sourceRoot":"","sources":["../src/sources.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ /** Supported AI coding tool identifiers. */
2
+ export type ToolId = 'claude_code' | 'cursor' | 'copilot' | 'windsurf' | 'cline' | 'aider' | 'codex' | 'gemini' | 'openclaw' | 'universal';
3
+ /** Skill category for browsing/filtering. */
4
+ export type SkillCategory = 'workflow' | 'language' | 'framework' | 'tool' | 'security' | 'testing' | 'architecture' | 'devops' | 'documentation' | 'performance' | 'other';
5
+ /** A single skill entry in the registry. */
6
+ export interface SkillEntry {
7
+ /** Unique identifier, e.g., "tdd-workflow" */
8
+ id: string;
9
+ /** Human-readable name */
10
+ name: string;
11
+ /** One-line description */
12
+ description: string;
13
+ /** Browsing category */
14
+ category: SkillCategory;
15
+ /** Searchable tags */
16
+ tags: string[];
17
+ /** Which tools this skill works with */
18
+ tools: ToolId[];
19
+ /** Programming languages this skill targets (optional) */
20
+ languages?: string[];
21
+ /** Frameworks this skill targets (optional) */
22
+ frameworks?: string[];
23
+ /** Where the skill content came from */
24
+ source: SkillSource;
25
+ /** Raw content in available formats */
26
+ content: string;
27
+ /** Popularity metrics for ranking */
28
+ popularity?: {
29
+ stars?: number;
30
+ installs?: number;
31
+ };
32
+ /** When this entry was last updated */
33
+ updatedAt: string;
34
+ }
35
+ /** Provenance of a skill entry. */
36
+ export interface SkillSource {
37
+ /** GitHub repo in owner/repo format */
38
+ repo: string;
39
+ /** File path within the repo */
40
+ path: string;
41
+ /** Full URL to the source file */
42
+ url: string;
43
+ /** License identifier */
44
+ license?: string;
45
+ }
46
+ /** The full registry index. */
47
+ export interface SkillRegistry {
48
+ version: string;
49
+ generatedAt: string;
50
+ skills: SkillEntry[];
51
+ }
52
+ /** Search/filter options. */
53
+ export interface SkillSearchOptions {
54
+ query?: string;
55
+ tool?: ToolId;
56
+ category?: SkillCategory;
57
+ language?: string;
58
+ framework?: string;
59
+ tags?: string[];
60
+ limit?: number;
61
+ }
62
+ /** A GitHub source to fetch skills from. */
63
+ export interface RegistrySource {
64
+ /** GitHub repo in owner/repo format */
65
+ repo: string;
66
+ /** Branch to fetch from */
67
+ branch?: string;
68
+ /** Glob patterns for skill files within the repo */
69
+ patterns: string[];
70
+ /** Default tool this source targets */
71
+ defaultTool: ToolId;
72
+ /** Default category */
73
+ defaultCategory: SkillCategory;
74
+ /** License for all files in this source */
75
+ license?: string;
76
+ }
77
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,MAAM,MAAM,MAAM,GACd,aAAa,GACb,QAAQ,GACR,SAAS,GACT,UAAU,GACV,OAAO,GACP,OAAO,GACP,OAAO,GACP,QAAQ,GACR,UAAU,GACV,WAAW,CAAC;AAEhB,6CAA6C;AAC7C,MAAM,MAAM,aAAa,GACrB,UAAU,GACV,UAAU,GACV,WAAW,GACX,MAAM,GACN,UAAU,GACV,SAAS,GACT,cAAc,GACd,QAAQ,GACR,eAAe,GACf,aAAa,GACb,OAAO,CAAC;AAEZ,4CAA4C;AAC5C,MAAM,WAAW,UAAU;IACzB,8CAA8C;IAC9C,EAAE,EAAE,MAAM,CAAC;IACX,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,wBAAwB;IACxB,QAAQ,EAAE,aAAa,CAAC;IACxB,sBAAsB;IACtB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,wCAAwC;IACxC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,wCAAwC;IACxC,MAAM,EAAE,WAAW,CAAC;IACpB,uCAAuC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,UAAU,CAAC,EAAE;QACX,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,mCAAmC;AACnC,MAAM,WAAW,WAAW;IAC1B,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,yBAAyB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,+BAA+B;AAC/B,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,UAAU,EAAE,CAAC;CACtB;AAED,6BAA6B;AAC7B,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,4CAA4C;AAC5C,MAAM,WAAW,cAAc;IAC7B,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,2BAA2B;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,uBAAuB;IACvB,eAAe,EAAE,aAAa,CAAC;IAC/B,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@rulemetric/skills-registry",
3
+ "version": "0.1.1",
4
+ "publishConfig": {
5
+ "access": "public"
6
+ },
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "type": "module",
11
+ "main": "./dist/index.js",
12
+ "types": "./dist/index.d.ts",
13
+ "dependencies": {
14
+ "gray-matter": "^4.0.3"
15
+ },
16
+ "devDependencies": {
17
+ "@types/node": "^22.0.0",
18
+ "tsx": "^4.0.0",
19
+ "typescript": "^5.9.0",
20
+ "vitest": "^3.2.0",
21
+ "@rulemetric/typescript-config": "0.0.0"
22
+ },
23
+ "scripts": {
24
+ "build": "tsc",
25
+ "type-check": "tsc --noEmit",
26
+ "fetch": "tsx src/fetch-registry.ts"
27
+ }
28
+ }