skillpkg-core 0.5.5 → 0.5.7
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.
- package/dist/adapters/adapter-manager.d.ts +51 -0
- package/dist/adapters/adapter-manager.d.ts.map +1 -0
- package/dist/adapters/adapter-manager.js +147 -0
- package/dist/adapters/adapter-manager.js.map +1 -0
- package/dist/adapters/base.d.ts.map +1 -1
- package/dist/adapters/base.js +14 -3
- package/dist/adapters/base.js.map +1 -1
- package/dist/adapters/index.d.ts +1 -1
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +1 -1
- package/dist/adapters/index.js.map +1 -1
- package/dist/config/types.d.ts +3 -3
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +0 -1
- package/dist/config/types.js.map +1 -1
- package/dist/discovery/discovery-manager.d.ts +55 -0
- package/dist/discovery/discovery-manager.d.ts.map +1 -0
- package/dist/discovery/discovery-manager.js +217 -0
- package/dist/discovery/discovery-manager.js.map +1 -0
- package/dist/discovery/index.d.ts +20 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.js +21 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/discovery/manager.d.ts +53 -0
- package/dist/discovery/manager.d.ts.map +1 -0
- package/dist/discovery/manager.js +203 -0
- package/dist/discovery/manager.js.map +1 -0
- package/dist/discovery/providers/awesome.d.ts +72 -0
- package/dist/discovery/providers/awesome.d.ts.map +1 -0
- package/dist/discovery/providers/awesome.js +214 -0
- package/dist/discovery/providers/awesome.js.map +1 -0
- package/dist/discovery/providers/github.d.ts +44 -0
- package/dist/discovery/providers/github.d.ts.map +1 -0
- package/dist/discovery/providers/github.js +82 -0
- package/dist/discovery/providers/github.js.map +1 -0
- package/dist/discovery/providers/index.d.ts +9 -0
- package/dist/discovery/providers/index.d.ts.map +1 -0
- package/dist/discovery/providers/index.js +9 -0
- package/dist/discovery/providers/index.js.map +1 -0
- package/dist/discovery/providers/local.d.ts +38 -0
- package/dist/discovery/providers/local.d.ts.map +1 -0
- package/dist/discovery/providers/local.js +75 -0
- package/dist/discovery/providers/local.js.map +1 -0
- package/dist/discovery/providers/priority.d.ts +89 -0
- package/dist/discovery/providers/priority.d.ts.map +1 -0
- package/dist/discovery/providers/priority.js +258 -0
- package/dist/discovery/providers/priority.js.map +1 -0
- package/dist/discovery/providers/skillsmp.d.ts +66 -0
- package/dist/discovery/providers/skillsmp.d.ts.map +1 -0
- package/dist/discovery/providers/skillsmp.js +134 -0
- package/dist/discovery/providers/skillsmp.js.map +1 -0
- package/dist/discovery/types.d.ts +108 -0
- package/dist/discovery/types.d.ts.map +1 -0
- package/dist/discovery/types.js +5 -0
- package/dist/discovery/types.js.map +1 -0
- package/dist/doctor/doctor.d.ts +62 -0
- package/dist/doctor/doctor.d.ts.map +1 -0
- package/dist/doctor/doctor.js +399 -0
- package/dist/doctor/doctor.js.map +1 -0
- package/dist/doctor/index.d.ts +6 -0
- package/dist/doctor/index.d.ts.map +1 -0
- package/dist/doctor/index.js +6 -0
- package/dist/doctor/index.js.map +1 -0
- package/dist/doctor/types.d.ts +68 -0
- package/dist/doctor/types.d.ts.map +1 -0
- package/dist/doctor/types.js +2 -0
- package/dist/doctor/types.js.map +1 -0
- package/dist/fetcher/fetcher.d.ts.map +1 -1
- package/dist/fetcher/fetcher.js +265 -25
- package/dist/fetcher/fetcher.js.map +1 -1
- package/dist/fetcher/source-parser.d.ts +8 -6
- package/dist/fetcher/source-parser.d.ts.map +1 -1
- package/dist/fetcher/source-parser.js +37 -16
- package/dist/fetcher/source-parser.js.map +1 -1
- package/dist/fetcher/types.d.ts +17 -4
- package/dist/fetcher/types.d.ts.map +1 -1
- package/dist/fetcher/types.js.map +1 -1
- package/dist/importer/importer.js +1 -1
- package/dist/importer/importer.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/installer/installer.d.ts +1 -1
- package/dist/installer/installer.d.ts.map +1 -1
- package/dist/installer/installer.js +15 -7
- package/dist/installer/installer.js.map +1 -1
- package/dist/installer/types.d.ts +15 -13
- package/dist/installer/types.d.ts.map +1 -1
- package/dist/matching/engine.d.ts +57 -0
- package/dist/matching/engine.d.ts.map +1 -0
- package/dist/matching/engine.js +419 -0
- package/dist/matching/engine.js.map +1 -0
- package/dist/matching/index.d.ts +9 -0
- package/dist/matching/index.d.ts.map +1 -0
- package/dist/matching/index.js +8 -0
- package/dist/matching/index.js.map +1 -0
- package/dist/matching/types.d.ts +91 -0
- package/dist/matching/types.d.ts.map +1 -0
- package/dist/matching/types.js +13 -0
- package/dist/matching/types.js.map +1 -0
- package/dist/parser/schema.d.ts +61 -8
- package/dist/parser/schema.d.ts.map +1 -1
- package/dist/parser/schema.js +59 -9
- package/dist/parser/schema.js.map +1 -1
- package/dist/resolver/dependency-resolver.d.ts.map +1 -1
- package/dist/resolver/dependency-resolver.js +15 -3
- package/dist/resolver/dependency-resolver.js.map +1 -1
- package/dist/resolver/index.d.ts +1 -1
- package/dist/resolver/index.d.ts.map +1 -1
- package/dist/resolver/index.js.map +1 -1
- package/dist/resolver/types.d.ts +13 -0
- package/dist/resolver/types.d.ts.map +1 -1
- package/dist/skill/reader.d.ts.map +1 -1
- package/dist/skill/reader.js +12 -11
- package/dist/skill/reader.js.map +1 -1
- package/dist/skill/types.d.ts +28 -2
- package/dist/skill/types.d.ts.map +1 -1
- package/dist/state/state-manager.d.ts +19 -0
- package/dist/state/state-manager.d.ts.map +1 -1
- package/dist/state/state-manager.js +50 -0
- package/dist/state/state-manager.js.map +1 -1
- package/dist/store/config.d.ts.map +1 -1
- package/dist/store/config.js +7 -0
- package/dist/store/config.js.map +1 -1
- package/dist/store/index.d.ts +2 -2
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +1 -1
- package/dist/store/index.js.map +1 -1
- package/dist/store/manager.d.ts +2 -0
- package/dist/store/manager.d.ts.map +1 -1
- package/dist/store/manager.js +19 -1
- package/dist/store/manager.js.map +1 -1
- package/dist/store/store-manager.d.ts +123 -0
- package/dist/store/store-manager.d.ts.map +1 -0
- package/dist/store/store-manager.js +312 -0
- package/dist/store/store-manager.js.map +1 -0
- package/dist/syncer/syncer.d.ts +4 -0
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +91 -27
- package/dist/syncer/syncer.js.map +1 -1
- package/dist/syncer/types.d.ts +16 -8
- package/dist/syncer/types.d.ts.map +1 -1
- package/dist/syncer/types.js +29 -32
- package/dist/syncer/types.js.map +1 -1
- package/dist/types.d.ts +33 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +9 -2
- package/dist/types.js.map +1 -1
- package/package.json +9 -9
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discovery module - Multi-source skill discovery
|
|
3
|
+
*
|
|
4
|
+
* Provides unified interface for searching skills across multiple sources:
|
|
5
|
+
* - priority: Priority repos (miles990/claude-software-skills, claude-domain-skills) - SEARCHED FIRST
|
|
6
|
+
* - local: Installed skills (via StoreManager)
|
|
7
|
+
* - skillsmp: Primary registry (40K+ skills, requires API key)
|
|
8
|
+
* - awesome: Fallback curated repos (no key required)
|
|
9
|
+
* - github: Supplementary search (topic-based with SKILL.md detection)
|
|
10
|
+
*
|
|
11
|
+
* Features:
|
|
12
|
+
* - Auto source selection based on API key availability
|
|
13
|
+
* - Priority repos searched first by default
|
|
14
|
+
* - Deduplication with foundIn tracking
|
|
15
|
+
* - Caching per provider (skillsmp/github: 5min, priority/awesome: 30min)
|
|
16
|
+
*/
|
|
17
|
+
// Manager
|
|
18
|
+
export { DiscoveryManager, createDiscoveryManager } from './discovery-manager.js';
|
|
19
|
+
// Providers
|
|
20
|
+
export { LocalProvider, createLocalProvider, SkillsmpProvider, createSkillsmpProvider, AwesomeProvider, createAwesomeProvider, GitHubProvider, createGitHubProvider, PriorityProvider, createPriorityProvider, SKILLSMP_CONFIG, AWESOME_REPOS, DEFAULT_PRIORITY_REPOS, } from './providers/index.js';
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/discovery/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAcH,UAAU;AACV,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAElF,YAAY;AACZ,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,sBAAsB,EACtB,eAAe,EACf,qBAAqB,EACrB,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,EACtB,eAAe,EACf,aAAa,EACb,sBAAsB,GACvB,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { DiscoverySource, DiscoverySearchOptions, DiscoveryResult, DiscoveryManagerOptions } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Discovery manager for multi-source skill search
|
|
4
|
+
*/
|
|
5
|
+
export declare class DiscoveryManager {
|
|
6
|
+
private providers;
|
|
7
|
+
private skillsmpApiKey;
|
|
8
|
+
private githubToken;
|
|
9
|
+
constructor(options?: DiscoveryManagerOptions);
|
|
10
|
+
/**
|
|
11
|
+
* Get default sources based on configuration
|
|
12
|
+
*
|
|
13
|
+
* With skillsmp key: local → skillsmp (40K+) → github
|
|
14
|
+
* Without key: local → awesome (~30) → github
|
|
15
|
+
*/
|
|
16
|
+
getDefaultSources(): DiscoverySource[];
|
|
17
|
+
/**
|
|
18
|
+
* Check which sources are configured
|
|
19
|
+
*/
|
|
20
|
+
getConfiguredSources(): DiscoverySource[];
|
|
21
|
+
/**
|
|
22
|
+
* Set skillsmp API key (can be called after construction)
|
|
23
|
+
*/
|
|
24
|
+
setSkillsmpApiKey(apiKey: string): void;
|
|
25
|
+
/**
|
|
26
|
+
* Search for skills across multiple sources
|
|
27
|
+
*/
|
|
28
|
+
search(options: DiscoverySearchOptions): Promise<DiscoveryResult>;
|
|
29
|
+
/**
|
|
30
|
+
* Deduplicate skills by normalized source URL
|
|
31
|
+
*
|
|
32
|
+
* Same skill from multiple sources → merge foundIn, keep first occurrence
|
|
33
|
+
*/
|
|
34
|
+
private deduplicateSkills;
|
|
35
|
+
/**
|
|
36
|
+
* Normalize source URL for deduplication
|
|
37
|
+
*
|
|
38
|
+
* Examples:
|
|
39
|
+
* github:user/repo#path → github:user/repo#path
|
|
40
|
+
* skillsmp:skill-name → skill-name (extract name)
|
|
41
|
+
* local:skill-name → skill-name
|
|
42
|
+
*/
|
|
43
|
+
private normalizeSourceForDedup;
|
|
44
|
+
/**
|
|
45
|
+
* Clear all provider caches
|
|
46
|
+
*/
|
|
47
|
+
clearAllCaches(): void;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Create a discovery manager
|
|
51
|
+
*/
|
|
52
|
+
export declare function createDiscoveryManager(options?: DiscoveryManagerOptions): DiscoveryManager;
|
|
53
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/discovery/manager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,eAAe,EACf,sBAAsB,EACtB,eAAe,EAEf,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAQpB;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,SAAS,CAAsD;IACvE,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,WAAW,CAAgB;gBAEvB,OAAO,GAAE,uBAA4B;IAwCjD;;;;;OAKG;IACH,iBAAiB,IAAI,eAAe,EAAE;IAqBtC;;OAEG;IACH,oBAAoB,IAAI,eAAe,EAAE;IAMzC;;OAEG;IACH,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQvC;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,eAAe,CAAC;IAgDvE;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAkDzB;;;;;;;OAOG;IACH,OAAO,CAAC,uBAAuB;IAe/B;;OAEG;IACH,cAAc,IAAI,IAAI;CAOvB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,CAAC,EAAE,uBAAuB,GAChC,gBAAgB,CAElB"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { LocalProvider, SkillsmpProvider, AwesomeProvider, GitHubProvider, } from './providers/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Discovery manager for multi-source skill search
|
|
4
|
+
*/
|
|
5
|
+
export class DiscoveryManager {
|
|
6
|
+
providers = new Map();
|
|
7
|
+
skillsmpApiKey;
|
|
8
|
+
githubToken;
|
|
9
|
+
constructor(options = {}) {
|
|
10
|
+
this.skillsmpApiKey = options.skillsmpApiKey || null;
|
|
11
|
+
this.githubToken = options.githubToken || process.env.GITHUB_TOKEN || null;
|
|
12
|
+
// Initialize providers
|
|
13
|
+
if (options.storeManager) {
|
|
14
|
+
this.providers.set('local', new LocalProvider({
|
|
15
|
+
storeManager: options.storeManager,
|
|
16
|
+
}));
|
|
17
|
+
}
|
|
18
|
+
// Skillsmp provider (primary when API key available)
|
|
19
|
+
const skillsmpProvider = new SkillsmpProvider({
|
|
20
|
+
apiKey: this.skillsmpApiKey || undefined,
|
|
21
|
+
});
|
|
22
|
+
if (this.skillsmpApiKey) {
|
|
23
|
+
skillsmpProvider.setApiKey(this.skillsmpApiKey);
|
|
24
|
+
}
|
|
25
|
+
this.providers.set('skillsmp', skillsmpProvider);
|
|
26
|
+
// Awesome provider (fallback, no key required)
|
|
27
|
+
this.providers.set('awesome', new AwesomeProvider({
|
|
28
|
+
githubToken: this.githubToken || undefined,
|
|
29
|
+
}));
|
|
30
|
+
// GitHub provider (supplementary)
|
|
31
|
+
this.providers.set('github', new GitHubProvider({
|
|
32
|
+
githubToken: this.githubToken || undefined,
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get default sources based on configuration
|
|
37
|
+
*
|
|
38
|
+
* With skillsmp key: local → skillsmp (40K+) → github
|
|
39
|
+
* Without key: local → awesome (~30) → github
|
|
40
|
+
*/
|
|
41
|
+
getDefaultSources() {
|
|
42
|
+
const sources = [];
|
|
43
|
+
// Always include local if available
|
|
44
|
+
if (this.providers.has('local')) {
|
|
45
|
+
sources.push('local');
|
|
46
|
+
}
|
|
47
|
+
// Primary source based on API key availability
|
|
48
|
+
if (this.skillsmpApiKey) {
|
|
49
|
+
sources.push('skillsmp');
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
sources.push('awesome');
|
|
53
|
+
}
|
|
54
|
+
// Always include github as supplementary
|
|
55
|
+
sources.push('github');
|
|
56
|
+
return sources;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Check which sources are configured
|
|
60
|
+
*/
|
|
61
|
+
getConfiguredSources() {
|
|
62
|
+
return Array.from(this.providers.entries())
|
|
63
|
+
.filter(([, provider]) => provider.isConfigured())
|
|
64
|
+
.map(([source]) => source);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Set skillsmp API key (can be called after construction)
|
|
68
|
+
*/
|
|
69
|
+
setSkillsmpApiKey(apiKey) {
|
|
70
|
+
this.skillsmpApiKey = apiKey;
|
|
71
|
+
const provider = this.providers.get('skillsmp');
|
|
72
|
+
if (provider) {
|
|
73
|
+
provider.setApiKey(apiKey);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Search for skills across multiple sources
|
|
78
|
+
*/
|
|
79
|
+
async search(options) {
|
|
80
|
+
const { query, limit = 20, sources } = options;
|
|
81
|
+
const sourcesToQuery = sources || this.getDefaultSources();
|
|
82
|
+
const allSkills = [];
|
|
83
|
+
const errors = {};
|
|
84
|
+
const sourcesQueried = [];
|
|
85
|
+
// Query each source in parallel
|
|
86
|
+
const promises = sourcesToQuery.map(async (source) => {
|
|
87
|
+
const provider = this.providers.get(source);
|
|
88
|
+
if (!provider) {
|
|
89
|
+
errors[source] = `Provider not found: ${source}`;
|
|
90
|
+
return [];
|
|
91
|
+
}
|
|
92
|
+
if (!provider.isConfigured()) {
|
|
93
|
+
errors[source] = `Provider not configured: ${source}`;
|
|
94
|
+
return [];
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
sourcesQueried.push(source);
|
|
98
|
+
const skills = await provider.search({ query, limit: limit * 2 }); // Fetch more for dedup
|
|
99
|
+
return skills;
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
errors[source] = error.message;
|
|
103
|
+
return [];
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
const results = await Promise.all(promises);
|
|
107
|
+
for (const skills of results) {
|
|
108
|
+
allSkills.push(...skills);
|
|
109
|
+
}
|
|
110
|
+
// Deduplicate
|
|
111
|
+
const { skills: dedupedSkills, duplicatesRemoved } = this.deduplicateSkills(allSkills);
|
|
112
|
+
return {
|
|
113
|
+
skills: dedupedSkills.slice(0, limit),
|
|
114
|
+
sourcesQueried,
|
|
115
|
+
duplicatesRemoved,
|
|
116
|
+
errors: Object.keys(errors).length > 0 ? errors : undefined,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Deduplicate skills by normalized source URL
|
|
121
|
+
*
|
|
122
|
+
* Same skill from multiple sources → merge foundIn, keep first occurrence
|
|
123
|
+
*/
|
|
124
|
+
deduplicateSkills(skills) {
|
|
125
|
+
const seen = new Map();
|
|
126
|
+
let duplicatesRemoved = 0;
|
|
127
|
+
for (const skill of skills) {
|
|
128
|
+
const key = this.normalizeSourceForDedup(skill.source);
|
|
129
|
+
if (seen.has(key)) {
|
|
130
|
+
// Duplicate found - merge foundIn
|
|
131
|
+
const existing = seen.get(key);
|
|
132
|
+
const newFoundIn = skill.foundIn || [skill.provider];
|
|
133
|
+
existing.foundIn = [
|
|
134
|
+
...new Set([...(existing.foundIn || [existing.provider]), ...newFoundIn]),
|
|
135
|
+
];
|
|
136
|
+
// Keep higher star count if available
|
|
137
|
+
if (skill.stars && (!existing.stars || skill.stars > existing.stars)) {
|
|
138
|
+
existing.stars = skill.stars;
|
|
139
|
+
}
|
|
140
|
+
duplicatesRemoved++;
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
// First occurrence
|
|
144
|
+
seen.set(key, {
|
|
145
|
+
...skill,
|
|
146
|
+
foundIn: skill.foundIn || [skill.provider],
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Sort by: name match relevance (assumed), then stars, then name
|
|
151
|
+
const result = Array.from(seen.values()).sort((a, b) => {
|
|
152
|
+
// Stars (higher first)
|
|
153
|
+
if (a.stars && b.stars) {
|
|
154
|
+
if (a.stars !== b.stars)
|
|
155
|
+
return b.stars - a.stars;
|
|
156
|
+
}
|
|
157
|
+
if (a.stars && !b.stars)
|
|
158
|
+
return -1;
|
|
159
|
+
if (!a.stars && b.stars)
|
|
160
|
+
return 1;
|
|
161
|
+
// Name (alphabetical)
|
|
162
|
+
return a.name.localeCompare(b.name);
|
|
163
|
+
});
|
|
164
|
+
return { skills: result, duplicatesRemoved };
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Normalize source URL for deduplication
|
|
168
|
+
*
|
|
169
|
+
* Examples:
|
|
170
|
+
* github:user/repo#path → github:user/repo#path
|
|
171
|
+
* skillsmp:skill-name → skill-name (extract name)
|
|
172
|
+
* local:skill-name → skill-name
|
|
173
|
+
*/
|
|
174
|
+
normalizeSourceForDedup(source) {
|
|
175
|
+
// GitHub source - use as-is (most specific)
|
|
176
|
+
if (source.startsWith('github:')) {
|
|
177
|
+
return source.toLowerCase();
|
|
178
|
+
}
|
|
179
|
+
// Extract name from other sources
|
|
180
|
+
const match = source.match(/^(?:local|skillsmp|awesome):(.+)$/);
|
|
181
|
+
if (match) {
|
|
182
|
+
return match[1].toLowerCase();
|
|
183
|
+
}
|
|
184
|
+
return source.toLowerCase();
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Clear all provider caches
|
|
188
|
+
*/
|
|
189
|
+
clearAllCaches() {
|
|
190
|
+
for (const provider of this.providers.values()) {
|
|
191
|
+
if ('clearCache' in provider && typeof provider.clearCache === 'function') {
|
|
192
|
+
provider.clearCache();
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Create a discovery manager
|
|
199
|
+
*/
|
|
200
|
+
export function createDiscoveryManager(options) {
|
|
201
|
+
return new DiscoveryManager(options);
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/discovery/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Awesome Provider - Fallback source (curated awesome repos)
|
|
3
|
+
* No API key required, fetches from known GitHub repos
|
|
4
|
+
*/
|
|
5
|
+
import type { DiscoveryProvider, DiscoverySearchOptions, DiscoveredSkill } from '../types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Known awesome repos containing curated skills
|
|
8
|
+
*/
|
|
9
|
+
export declare const AWESOME_REPOS: readonly ["anthropics/skills", "ComposioHQ/awesome-claude-skills"];
|
|
10
|
+
/**
|
|
11
|
+
* Awesome provider options
|
|
12
|
+
*/
|
|
13
|
+
export interface AwesomeProviderOptions {
|
|
14
|
+
/** GitHub token (optional, for higher rate limits) */
|
|
15
|
+
githubToken?: string;
|
|
16
|
+
/** Cache TTL in ms (default: 30 minutes) */
|
|
17
|
+
cacheTtl?: number;
|
|
18
|
+
/** Request timeout in ms (default: 30s) */
|
|
19
|
+
timeout?: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Provider for awesome repos (curated skill collections)
|
|
23
|
+
*/
|
|
24
|
+
export declare class AwesomeProvider implements DiscoveryProvider {
|
|
25
|
+
readonly id: "awesome";
|
|
26
|
+
private githubToken;
|
|
27
|
+
private cacheTtl;
|
|
28
|
+
private timeout;
|
|
29
|
+
private cache;
|
|
30
|
+
constructor(options?: AwesomeProviderOptions);
|
|
31
|
+
/**
|
|
32
|
+
* Awesome provider is always configured (no API key required)
|
|
33
|
+
*/
|
|
34
|
+
isConfigured(): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Search skills in awesome repos
|
|
37
|
+
*/
|
|
38
|
+
search(options: DiscoverySearchOptions): Promise<DiscoveredSkill[]>;
|
|
39
|
+
/**
|
|
40
|
+
* Fetch skills from a single awesome repo
|
|
41
|
+
*/
|
|
42
|
+
private fetchSkillsFromRepo;
|
|
43
|
+
/**
|
|
44
|
+
* Fetch repo contents from GitHub API
|
|
45
|
+
*/
|
|
46
|
+
private fetchRepoContents;
|
|
47
|
+
/**
|
|
48
|
+
* Check if a path has SKILL.md
|
|
49
|
+
*/
|
|
50
|
+
private checkHasSkillMd;
|
|
51
|
+
/**
|
|
52
|
+
* Fetch and parse SKILL.md metadata
|
|
53
|
+
*/
|
|
54
|
+
private fetchSkillMetadata;
|
|
55
|
+
/**
|
|
56
|
+
* Parse SKILL.md frontmatter (simplified)
|
|
57
|
+
*/
|
|
58
|
+
private parseSkillFrontmatter;
|
|
59
|
+
/**
|
|
60
|
+
* Fetch with timeout and auth headers
|
|
61
|
+
*/
|
|
62
|
+
private fetchWithTimeout;
|
|
63
|
+
/**
|
|
64
|
+
* Clear cache
|
|
65
|
+
*/
|
|
66
|
+
clearCache(): void;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Create an awesome provider
|
|
70
|
+
*/
|
|
71
|
+
export declare function createAwesomeProvider(options?: AwesomeProviderOptions): AwesomeProvider;
|
|
72
|
+
//# sourceMappingURL=awesome.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"awesome.d.ts","sourceRoot":"","sources":["../../../src/discovery/providers/awesome.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EACV,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,EAChB,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,eAAO,MAAM,aAAa,oEAGhB,CAAC;AAEX;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAoBD;;GAEG;AACH,qBAAa,eAAgB,YAAW,iBAAiB;IACvD,QAAQ,CAAC,EAAE,EAAG,SAAS,CAAU;IACjC,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAsC;gBAEvC,OAAO,GAAE,sBAA2B;IAMhD;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAqCzE;;OAEG;YACW,mBAAmB;IAmDjC;;OAEG;YACW,iBAAiB;IAgB/B;;OAEG;YACW,eAAe;IAY7B;;OAEG;YACW,kBAAkB;IAkBhC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAsB7B;;OAEG;YACW,gBAAgB;IAyB9B;;OAEG;IACH,UAAU,IAAI,IAAI;CAGnB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,CAAC,EAAE,sBAAsB,GAC/B,eAAe,CAEjB"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Known awesome repos containing curated skills
|
|
3
|
+
*/
|
|
4
|
+
export const AWESOME_REPOS = [
|
|
5
|
+
'anthropics/skills', // Official examples
|
|
6
|
+
'ComposioHQ/awesome-claude-skills', // Community curated
|
|
7
|
+
];
|
|
8
|
+
/**
|
|
9
|
+
* Provider for awesome repos (curated skill collections)
|
|
10
|
+
*/
|
|
11
|
+
export class AwesomeProvider {
|
|
12
|
+
id = 'awesome';
|
|
13
|
+
githubToken;
|
|
14
|
+
cacheTtl;
|
|
15
|
+
timeout;
|
|
16
|
+
cache = new Map();
|
|
17
|
+
constructor(options = {}) {
|
|
18
|
+
this.githubToken = options.githubToken || process.env.GITHUB_TOKEN || null;
|
|
19
|
+
this.cacheTtl = options.cacheTtl || 30 * 60 * 1000; // 30 minutes
|
|
20
|
+
this.timeout = options.timeout || 30000;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Awesome provider is always configured (no API key required)
|
|
24
|
+
*/
|
|
25
|
+
isConfigured() {
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Search skills in awesome repos
|
|
30
|
+
*/
|
|
31
|
+
async search(options) {
|
|
32
|
+
const { query, limit = 20 } = options;
|
|
33
|
+
const queryLower = query.toLowerCase();
|
|
34
|
+
// Collect skills from all repos
|
|
35
|
+
const allSkills = [];
|
|
36
|
+
for (const repo of AWESOME_REPOS) {
|
|
37
|
+
try {
|
|
38
|
+
const skills = await this.fetchSkillsFromRepo(repo);
|
|
39
|
+
allSkills.push(...skills);
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
// Log but continue with other repos
|
|
43
|
+
console.warn(`Failed to fetch from ${repo}:`, error.message);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Filter by query
|
|
47
|
+
const matched = allSkills.filter((skill) => skill.name.toLowerCase().includes(queryLower) ||
|
|
48
|
+
skill.description.toLowerCase().includes(queryLower) ||
|
|
49
|
+
skill.keywords?.some((k) => k.toLowerCase().includes(queryLower)));
|
|
50
|
+
// Sort by relevance (name match first)
|
|
51
|
+
matched.sort((a, b) => {
|
|
52
|
+
const aNameMatch = a.name.toLowerCase().includes(queryLower);
|
|
53
|
+
const bNameMatch = b.name.toLowerCase().includes(queryLower);
|
|
54
|
+
if (aNameMatch && !bNameMatch)
|
|
55
|
+
return -1;
|
|
56
|
+
if (!aNameMatch && bNameMatch)
|
|
57
|
+
return 1;
|
|
58
|
+
return (b.stars || 0) - (a.stars || 0);
|
|
59
|
+
});
|
|
60
|
+
return matched.slice(0, limit);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Fetch skills from a single awesome repo
|
|
64
|
+
*/
|
|
65
|
+
async fetchSkillsFromRepo(repo) {
|
|
66
|
+
// Check cache
|
|
67
|
+
const cached = this.cache.get(repo);
|
|
68
|
+
if (cached && cached.expiry > Date.now()) {
|
|
69
|
+
return cached.skills;
|
|
70
|
+
}
|
|
71
|
+
const skills = [];
|
|
72
|
+
const contents = await this.fetchRepoContents(repo, '');
|
|
73
|
+
// Look for directories that might contain SKILL.md
|
|
74
|
+
for (const item of contents) {
|
|
75
|
+
if (item.type === 'dir') {
|
|
76
|
+
const hasSkill = await this.checkHasSkillMd(repo, item.path);
|
|
77
|
+
if (hasSkill) {
|
|
78
|
+
const metadata = await this.fetchSkillMetadata(repo, item.path);
|
|
79
|
+
skills.push({
|
|
80
|
+
name: metadata?.name || item.name,
|
|
81
|
+
description: metadata?.description || '',
|
|
82
|
+
source: `github:${repo}#${item.path}`,
|
|
83
|
+
provider: this.id,
|
|
84
|
+
author: metadata?.author,
|
|
85
|
+
foundIn: [repo],
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Also check root level SKILL.md
|
|
91
|
+
const rootHasSkill = await this.checkHasSkillMd(repo, '');
|
|
92
|
+
if (rootHasSkill) {
|
|
93
|
+
const metadata = await this.fetchSkillMetadata(repo, '');
|
|
94
|
+
skills.push({
|
|
95
|
+
name: metadata?.name || repo.split('/')[1],
|
|
96
|
+
description: metadata?.description || '',
|
|
97
|
+
source: `github:${repo}`,
|
|
98
|
+
provider: this.id,
|
|
99
|
+
author: metadata?.author,
|
|
100
|
+
foundIn: [repo],
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
// Cache results
|
|
104
|
+
this.cache.set(repo, {
|
|
105
|
+
skills,
|
|
106
|
+
expiry: Date.now() + this.cacheTtl,
|
|
107
|
+
});
|
|
108
|
+
return skills;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Fetch repo contents from GitHub API
|
|
112
|
+
*/
|
|
113
|
+
async fetchRepoContents(repo, path) {
|
|
114
|
+
const url = `https://api.github.com/repos/${repo}/contents/${path}`;
|
|
115
|
+
const response = await this.fetchWithTimeout(url);
|
|
116
|
+
if (!response.ok) {
|
|
117
|
+
if (response.status === 404)
|
|
118
|
+
return [];
|
|
119
|
+
throw new Error(`GitHub API error: ${response.status}`);
|
|
120
|
+
}
|
|
121
|
+
const data = await response.json();
|
|
122
|
+
return Array.isArray(data) ? data : [];
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Check if a path has SKILL.md
|
|
126
|
+
*/
|
|
127
|
+
async checkHasSkillMd(repo, path) {
|
|
128
|
+
const skillPath = path ? `${path}/SKILL.md` : 'SKILL.md';
|
|
129
|
+
const url = `https://raw.githubusercontent.com/${repo}/HEAD/${skillPath}`;
|
|
130
|
+
try {
|
|
131
|
+
const response = await this.fetchWithTimeout(url);
|
|
132
|
+
return response.ok;
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Fetch and parse SKILL.md metadata
|
|
140
|
+
*/
|
|
141
|
+
async fetchSkillMetadata(repo, path) {
|
|
142
|
+
const skillPath = path ? `${path}/SKILL.md` : 'SKILL.md';
|
|
143
|
+
const url = `https://raw.githubusercontent.com/${repo}/HEAD/${skillPath}`;
|
|
144
|
+
try {
|
|
145
|
+
const response = await this.fetchWithTimeout(url);
|
|
146
|
+
if (!response.ok)
|
|
147
|
+
return null;
|
|
148
|
+
const content = await response.text();
|
|
149
|
+
return this.parseSkillFrontmatter(content);
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Parse SKILL.md frontmatter (simplified)
|
|
157
|
+
*/
|
|
158
|
+
parseSkillFrontmatter(content) {
|
|
159
|
+
const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
160
|
+
if (!match)
|
|
161
|
+
return null;
|
|
162
|
+
const yaml = match[1];
|
|
163
|
+
const result = {};
|
|
164
|
+
// Simple regex parsing (avoid yaml dependency here)
|
|
165
|
+
const nameMatch = yaml.match(/^name:\s*(.+)$/m);
|
|
166
|
+
if (nameMatch)
|
|
167
|
+
result.name = nameMatch[1].trim();
|
|
168
|
+
const descMatch = yaml.match(/^description:\s*(.+)$/m);
|
|
169
|
+
if (descMatch)
|
|
170
|
+
result.description = descMatch[1].trim();
|
|
171
|
+
const authorMatch = yaml.match(/^author:\s*(.+)$/m);
|
|
172
|
+
if (authorMatch)
|
|
173
|
+
result.author = authorMatch[1].trim();
|
|
174
|
+
return result;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Fetch with timeout and auth headers
|
|
178
|
+
*/
|
|
179
|
+
async fetchWithTimeout(url) {
|
|
180
|
+
const controller = new AbortController();
|
|
181
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
|
182
|
+
const headers = {
|
|
183
|
+
'User-Agent': 'skillpkg',
|
|
184
|
+
};
|
|
185
|
+
if (this.githubToken) {
|
|
186
|
+
headers['Authorization'] = `token ${this.githubToken}`;
|
|
187
|
+
}
|
|
188
|
+
try {
|
|
189
|
+
const response = await fetch(url, {
|
|
190
|
+
headers,
|
|
191
|
+
signal: controller.signal,
|
|
192
|
+
});
|
|
193
|
+
clearTimeout(timeoutId);
|
|
194
|
+
return response;
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
clearTimeout(timeoutId);
|
|
198
|
+
throw error;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Clear cache
|
|
203
|
+
*/
|
|
204
|
+
clearCache() {
|
|
205
|
+
this.cache.clear();
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Create an awesome provider
|
|
210
|
+
*/
|
|
211
|
+
export function createAwesomeProvider(options) {
|
|
212
|
+
return new AwesomeProvider(options);
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=awesome.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"awesome.js","sourceRoot":"","sources":["../../../src/discovery/providers/awesome.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { DiscoveryProvider, DiscoverySearchOptions, DiscoveredSkill } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* GitHub provider options
|
|
4
|
+
*/
|
|
5
|
+
export interface GitHubProviderOptions {
|
|
6
|
+
/** GitHub token (optional, for higher rate limits) */
|
|
7
|
+
githubToken?: string;
|
|
8
|
+
/** Cache TTL in ms (default: 5 minutes) */
|
|
9
|
+
cacheTtl?: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Provider for GitHub repository search (supplementary source)
|
|
13
|
+
*
|
|
14
|
+
* Uses topic-based search + SKILL.md detection.
|
|
15
|
+
* Good for finding new/trending skills not yet in registries.
|
|
16
|
+
*/
|
|
17
|
+
export declare class GitHubProvider implements DiscoveryProvider {
|
|
18
|
+
readonly id: "github";
|
|
19
|
+
private githubToken;
|
|
20
|
+
private cacheTtl;
|
|
21
|
+
private cache;
|
|
22
|
+
constructor(options?: GitHubProviderOptions);
|
|
23
|
+
/**
|
|
24
|
+
* GitHub provider is always configured (token optional, just affects rate limits)
|
|
25
|
+
*/
|
|
26
|
+
isConfigured(): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Search skills on GitHub
|
|
29
|
+
*/
|
|
30
|
+
search(options: DiscoverySearchOptions): Promise<DiscoveredSkill[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Convert GitHubSkillResult to DiscoveredSkill
|
|
33
|
+
*/
|
|
34
|
+
private toDiscoveredSkill;
|
|
35
|
+
/**
|
|
36
|
+
* Clear cache
|
|
37
|
+
*/
|
|
38
|
+
clearCache(): void;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Create a GitHub provider
|
|
42
|
+
*/
|
|
43
|
+
export declare function createGitHubProvider(options?: GitHubProviderOptions): GitHubProvider;
|
|
44
|
+
//# sourceMappingURL=github.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../../src/discovery/providers/github.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,EAChB,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAUD;;;;;GAKG;AACH,qBAAa,cAAe,YAAW,iBAAiB;IACtD,QAAQ,CAAC,EAAE,EAAG,QAAQ,CAAU;IAChC,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAAsC;gBAEvC,OAAO,GAAE,qBAA0B;IAK/C;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IA+BzE;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAYzB;;OAEG;IACH,UAAU,IAAI,IAAI;CAGnB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,CAAC,EAAE,qBAAqB,GAC9B,cAAc,CAEhB"}
|