agent-skills-cli 1.0.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.
- package/LICENSE +21 -0
- package/README.md +226 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +1181 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/executor.d.ts +22 -0
- package/dist/core/executor.d.ts.map +1 -0
- package/dist/core/executor.js +147 -0
- package/dist/core/executor.js.map +1 -0
- package/dist/core/index.d.ts +12 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +17 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/injector.d.ts +24 -0
- package/dist/core/injector.d.ts.map +1 -0
- package/dist/core/injector.js +99 -0
- package/dist/core/injector.js.map +1 -0
- package/dist/core/loader.d.ts +39 -0
- package/dist/core/loader.d.ts.map +1 -0
- package/dist/core/loader.js +161 -0
- package/dist/core/loader.js.map +1 -0
- package/dist/core/marketplace.d.ts +55 -0
- package/dist/core/marketplace.d.ts.map +1 -0
- package/dist/core/marketplace.js +399 -0
- package/dist/core/marketplace.js.map +1 -0
- package/dist/core/skillsmp.d.ts +38 -0
- package/dist/core/skillsmp.d.ts.map +1 -0
- package/dist/core/skillsmp.js +142 -0
- package/dist/core/skillsmp.js.map +1 -0
- package/dist/core/validator.d.ts +18 -0
- package/dist/core/validator.d.ts.map +1 -0
- package/dist/core/validator.js +177 -0
- package/dist/core/validator.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +108 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/marketplace.d.ts +81 -0
- package/dist/types/marketplace.d.ts.map +1 -0
- package/dist/types/marketplace.js +20 -0
- package/dist/types/marketplace.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Loader Module
|
|
3
|
+
* Handles discovery and loading of skills from the filesystem
|
|
4
|
+
*/
|
|
5
|
+
import { glob } from 'glob';
|
|
6
|
+
import matter from 'gray-matter';
|
|
7
|
+
import { readFile } from 'fs/promises';
|
|
8
|
+
import { dirname, join } from 'path';
|
|
9
|
+
import { existsSync } from 'fs';
|
|
10
|
+
/**
|
|
11
|
+
* Default search paths for skills
|
|
12
|
+
*/
|
|
13
|
+
export const DEFAULT_SKILL_PATHS = [
|
|
14
|
+
// Global user skills
|
|
15
|
+
join(process.env.HOME || '~', '.antigravity', 'skills'),
|
|
16
|
+
// Project-level skills
|
|
17
|
+
'.antigravity/skills',
|
|
18
|
+
// Local development skills
|
|
19
|
+
'./skills'
|
|
20
|
+
];
|
|
21
|
+
/**
|
|
22
|
+
* Discover all skills in the configured search paths
|
|
23
|
+
* Only loads metadata (Level 1) - doesn't load full body
|
|
24
|
+
*/
|
|
25
|
+
export async function discoverSkills(config = {}) {
|
|
26
|
+
const searchPaths = config.searchPaths || DEFAULT_SKILL_PATHS;
|
|
27
|
+
const skills = [];
|
|
28
|
+
for (const basePath of searchPaths) {
|
|
29
|
+
try {
|
|
30
|
+
// Find all SKILL.md files
|
|
31
|
+
const pattern = join(basePath, '**/SKILL.md');
|
|
32
|
+
const skillFiles = await glob(pattern, {
|
|
33
|
+
absolute: true,
|
|
34
|
+
maxDepth: config.maxDepth || 3
|
|
35
|
+
});
|
|
36
|
+
for (const skillMdPath of skillFiles) {
|
|
37
|
+
try {
|
|
38
|
+
const metadata = await loadSkillMetadata(skillMdPath);
|
|
39
|
+
if (metadata) {
|
|
40
|
+
skills.push({
|
|
41
|
+
name: metadata.name,
|
|
42
|
+
description: metadata.description,
|
|
43
|
+
path: dirname(skillMdPath)
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
// Skip invalid skills silently during discovery
|
|
49
|
+
console.warn(`Warning: Could not load skill at ${skillMdPath}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// Search path doesn't exist, skip silently
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return skills;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Load only skill metadata from SKILL.md (Level 1 loading)
|
|
61
|
+
*/
|
|
62
|
+
export async function loadSkillMetadata(skillMdPath) {
|
|
63
|
+
if (!existsSync(skillMdPath)) {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
const content = await readFile(skillMdPath, 'utf-8');
|
|
67
|
+
const { data } = matter(content);
|
|
68
|
+
// Validate required fields
|
|
69
|
+
if (!data.name || !data.description) {
|
|
70
|
+
throw new Error(`Invalid skill: missing required fields (name, description)`);
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
name: data.name,
|
|
74
|
+
description: data.description,
|
|
75
|
+
license: data.license,
|
|
76
|
+
compatibility: data.compatibility,
|
|
77
|
+
metadata: data.metadata,
|
|
78
|
+
allowedTools: data['allowed-tools']
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Load full skill including body content (Level 2 loading)
|
|
83
|
+
*/
|
|
84
|
+
export async function loadSkill(skillPath) {
|
|
85
|
+
const skillMdPath = skillPath.endsWith('SKILL.md')
|
|
86
|
+
? skillPath
|
|
87
|
+
: join(skillPath, 'SKILL.md');
|
|
88
|
+
if (!existsSync(skillMdPath)) {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
const content = await readFile(skillMdPath, 'utf-8');
|
|
92
|
+
const { data, content: body } = matter(content);
|
|
93
|
+
// Validate required fields
|
|
94
|
+
if (!data.name || !data.description) {
|
|
95
|
+
throw new Error(`Invalid skill at ${skillPath}: missing required fields`);
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
metadata: {
|
|
99
|
+
name: data.name,
|
|
100
|
+
description: data.description,
|
|
101
|
+
license: data.license,
|
|
102
|
+
compatibility: data.compatibility,
|
|
103
|
+
metadata: data.metadata,
|
|
104
|
+
allowedTools: data['allowed-tools']
|
|
105
|
+
},
|
|
106
|
+
body: body.trim(),
|
|
107
|
+
path: dirname(skillMdPath),
|
|
108
|
+
skillMdPath
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Load a referenced file from a skill (Level 3 loading)
|
|
113
|
+
*/
|
|
114
|
+
export async function loadSkillResource(skillPath, resourcePath) {
|
|
115
|
+
const fullPath = join(skillPath, resourcePath);
|
|
116
|
+
if (!existsSync(fullPath)) {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
return await readFile(fullPath, 'utf-8');
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* List all available resource files in a skill
|
|
123
|
+
*/
|
|
124
|
+
export async function listSkillResources(skillPath) {
|
|
125
|
+
const result = {
|
|
126
|
+
scripts: [],
|
|
127
|
+
references: [],
|
|
128
|
+
assets: []
|
|
129
|
+
};
|
|
130
|
+
// Find scripts
|
|
131
|
+
const scriptsPath = join(skillPath, 'scripts');
|
|
132
|
+
if (existsSync(scriptsPath)) {
|
|
133
|
+
const scripts = await glob('*', { cwd: scriptsPath });
|
|
134
|
+
result.scripts = scripts;
|
|
135
|
+
}
|
|
136
|
+
// Find references
|
|
137
|
+
const referencesPath = join(skillPath, 'references');
|
|
138
|
+
if (existsSync(referencesPath)) {
|
|
139
|
+
const refs = await glob('*.md', { cwd: referencesPath });
|
|
140
|
+
result.references = refs;
|
|
141
|
+
}
|
|
142
|
+
// Find assets
|
|
143
|
+
const assetsPath = join(skillPath, 'assets');
|
|
144
|
+
if (existsSync(assetsPath)) {
|
|
145
|
+
const assets = await glob('*', { cwd: assetsPath });
|
|
146
|
+
result.assets = assets;
|
|
147
|
+
}
|
|
148
|
+
return result;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Get skill by name from discovered skills
|
|
152
|
+
*/
|
|
153
|
+
export async function getSkillByName(name, config = {}) {
|
|
154
|
+
const skills = await discoverSkills(config);
|
|
155
|
+
const skillRef = skills.find(s => s.name === name);
|
|
156
|
+
if (!skillRef) {
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
return loadSkill(skillRef.path);
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/core/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Marketplace Module
|
|
3
|
+
* Fetches and installs skills from GitHub-based marketplaces
|
|
4
|
+
*/
|
|
5
|
+
import type { MarketplaceSource, MarketplaceSkill, InstalledSkill, MarketplaceConfig } from '../types/marketplace.js';
|
|
6
|
+
/**
|
|
7
|
+
* Load marketplace configuration
|
|
8
|
+
*/
|
|
9
|
+
export declare function loadConfig(): Promise<MarketplaceConfig>;
|
|
10
|
+
/**
|
|
11
|
+
* Save marketplace configuration
|
|
12
|
+
*/
|
|
13
|
+
export declare function saveConfig(config: MarketplaceConfig): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Add a marketplace source
|
|
16
|
+
*/
|
|
17
|
+
export declare function addMarketplace(source: MarketplaceSource): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Remove a marketplace source
|
|
20
|
+
*/
|
|
21
|
+
export declare function removeMarketplace(id: string): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* List available skills from a marketplace
|
|
24
|
+
*/
|
|
25
|
+
export declare function listMarketplaceSkills(sourceId?: string): Promise<MarketplaceSkill[]>;
|
|
26
|
+
/**
|
|
27
|
+
* Install a skill from a marketplace
|
|
28
|
+
*/
|
|
29
|
+
export declare function installSkill(skillName: string, sourceId?: string): Promise<InstalledSkill>;
|
|
30
|
+
/**
|
|
31
|
+
* Uninstall a skill
|
|
32
|
+
*/
|
|
33
|
+
export declare function uninstallSkill(skillName: string): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Check for skill updates
|
|
36
|
+
*/
|
|
37
|
+
export declare function checkUpdates(): Promise<Array<{
|
|
38
|
+
skill: InstalledSkill;
|
|
39
|
+
currentVersion?: string;
|
|
40
|
+
latestVersion?: string;
|
|
41
|
+
hasUpdate: boolean;
|
|
42
|
+
}>>;
|
|
43
|
+
/**
|
|
44
|
+
* Search for skills across all marketplaces
|
|
45
|
+
*/
|
|
46
|
+
export declare function searchSkills(query: string): Promise<MarketplaceSkill[]>;
|
|
47
|
+
/**
|
|
48
|
+
* Get list of installed skills
|
|
49
|
+
*/
|
|
50
|
+
export declare function getInstalledSkills(): Promise<InstalledSkill[]>;
|
|
51
|
+
/**
|
|
52
|
+
* List registered marketplace sources
|
|
53
|
+
*/
|
|
54
|
+
export declare function listMarketplaces(): Promise<MarketplaceSource[]>;
|
|
55
|
+
//# sourceMappingURL=marketplace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketplace.d.ts","sourceRoot":"","sources":["../../src/core/marketplace.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,KAAK,EACR,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACpB,MAAM,yBAAyB,CAAC;AAcjC;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAgC7D;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAGzE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAU7E;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAejE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACvC,QAAQ,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAkB7B;AAoLD;;GAEG;AACH,wBAAsB,YAAY,CAC9B,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,cAAc,CAAC,CAiDzB;AA8CD;;GAEG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBrE;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,KAAK,CAAC;IAChD,KAAK,EAAE,cAAc,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;CACtB,CAAC,CAAC,CA+BF;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAS7E;AAED;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAGpE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAGrE"}
|
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Marketplace Module
|
|
3
|
+
* Fetches and installs skills from GitHub-based marketplaces
|
|
4
|
+
*/
|
|
5
|
+
import { mkdir, writeFile, readFile, rm, cp } from 'fs/promises';
|
|
6
|
+
import { existsSync } from 'fs';
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
import { tmpdir } from 'os';
|
|
9
|
+
import { exec } from 'child_process';
|
|
10
|
+
import { promisify } from 'util';
|
|
11
|
+
import { DEFAULT_MARKETPLACES } from '../types/marketplace.js';
|
|
12
|
+
import { loadSkillMetadata } from './loader.js';
|
|
13
|
+
import { validateMetadata } from './validator.js';
|
|
14
|
+
const execAsync = promisify(exec);
|
|
15
|
+
/**
|
|
16
|
+
* Default config file location
|
|
17
|
+
*/
|
|
18
|
+
const CONFIG_DIR = join(process.env.HOME || '~', '.antigravity');
|
|
19
|
+
const CONFIG_FILE = join(CONFIG_DIR, 'marketplace.json');
|
|
20
|
+
const DEFAULT_INSTALL_DIR = join(CONFIG_DIR, 'skills');
|
|
21
|
+
/**
|
|
22
|
+
* Load marketplace configuration
|
|
23
|
+
*/
|
|
24
|
+
export async function loadConfig() {
|
|
25
|
+
if (!existsSync(CONFIG_FILE)) {
|
|
26
|
+
return {
|
|
27
|
+
sources: [...DEFAULT_MARKETPLACES],
|
|
28
|
+
installed: [],
|
|
29
|
+
installDir: DEFAULT_INSTALL_DIR
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const content = await readFile(CONFIG_FILE, 'utf-8');
|
|
34
|
+
const config = JSON.parse(content);
|
|
35
|
+
// Ensure default marketplaces are included
|
|
36
|
+
for (const defaultSource of DEFAULT_MARKETPLACES) {
|
|
37
|
+
if (!config.sources.find(s => s.id === defaultSource.id)) {
|
|
38
|
+
config.sources.push(defaultSource);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Remove deprecated/broken sources
|
|
42
|
+
const deprecatedIds = ['agentskills-examples'];
|
|
43
|
+
config.sources = config.sources.filter(s => !deprecatedIds.includes(s.id));
|
|
44
|
+
return config;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return {
|
|
48
|
+
sources: [...DEFAULT_MARKETPLACES],
|
|
49
|
+
installed: [],
|
|
50
|
+
installDir: DEFAULT_INSTALL_DIR
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Save marketplace configuration
|
|
56
|
+
*/
|
|
57
|
+
export async function saveConfig(config) {
|
|
58
|
+
await mkdir(CONFIG_DIR, { recursive: true });
|
|
59
|
+
await writeFile(CONFIG_FILE, JSON.stringify(config, null, 2));
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Add a marketplace source
|
|
63
|
+
*/
|
|
64
|
+
export async function addMarketplace(source) {
|
|
65
|
+
const config = await loadConfig();
|
|
66
|
+
// Check if already exists
|
|
67
|
+
if (config.sources.find(s => s.id === source.id)) {
|
|
68
|
+
throw new Error(`Marketplace ${source.id} already exists`);
|
|
69
|
+
}
|
|
70
|
+
config.sources.push(source);
|
|
71
|
+
await saveConfig(config);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Remove a marketplace source
|
|
75
|
+
*/
|
|
76
|
+
export async function removeMarketplace(id) {
|
|
77
|
+
const config = await loadConfig();
|
|
78
|
+
const index = config.sources.findIndex(s => s.id === id);
|
|
79
|
+
if (index === -1) {
|
|
80
|
+
throw new Error(`Marketplace ${id} not found`);
|
|
81
|
+
}
|
|
82
|
+
// Don't allow removing verified sources
|
|
83
|
+
if (config.sources[index].verified) {
|
|
84
|
+
throw new Error(`Cannot remove verified marketplace: ${id}`);
|
|
85
|
+
}
|
|
86
|
+
config.sources.splice(index, 1);
|
|
87
|
+
await saveConfig(config);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* List available skills from a marketplace
|
|
91
|
+
*/
|
|
92
|
+
export async function listMarketplaceSkills(sourceId) {
|
|
93
|
+
const config = await loadConfig();
|
|
94
|
+
const sources = sourceId
|
|
95
|
+
? config.sources.filter(s => s.id === sourceId)
|
|
96
|
+
: config.sources;
|
|
97
|
+
const skills = [];
|
|
98
|
+
for (const source of sources) {
|
|
99
|
+
try {
|
|
100
|
+
const sourceSkills = await fetchSkillsFromSource(source);
|
|
101
|
+
skills.push(...sourceSkills);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
console.warn(`Warning: Could not fetch from ${source.id}:`, error);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return skills;
|
|
108
|
+
}
|
|
109
|
+
// In-memory cache for marketplace skills (5 minute TTL)
|
|
110
|
+
const skillsCache = new Map();
|
|
111
|
+
const CACHE_TTL = 5 * 60 * 1000; // 5 minutes
|
|
112
|
+
/**
|
|
113
|
+
* Fetch skills from a GitHub marketplace source (with caching and parallel fetching)
|
|
114
|
+
*/
|
|
115
|
+
async function fetchSkillsFromSource(source) {
|
|
116
|
+
const cacheKey = `${source.owner}/${source.repo}`;
|
|
117
|
+
const cached = skillsCache.get(cacheKey);
|
|
118
|
+
// Return cached result if still valid
|
|
119
|
+
if (cached && Date.now() - cached.timestamp < CACHE_TTL) {
|
|
120
|
+
return cached.skills;
|
|
121
|
+
}
|
|
122
|
+
const branch = source.branch || 'main';
|
|
123
|
+
const skillsPath = source.skillsPath || 'skills';
|
|
124
|
+
// Try index-based fetching first (scalable for 40k+ skills)
|
|
125
|
+
const indexUrl = `https://raw.githubusercontent.com/${source.owner}/${source.repo}/${branch}/${skillsPath}/skills-index.json`;
|
|
126
|
+
try {
|
|
127
|
+
const indexResponse = await fetch(indexUrl);
|
|
128
|
+
if (indexResponse.ok) {
|
|
129
|
+
// Index found - use it (single request for all skills!)
|
|
130
|
+
const index = await indexResponse.json();
|
|
131
|
+
const skills = index.skills.map(s => ({
|
|
132
|
+
name: s.name,
|
|
133
|
+
description: s.description || '',
|
|
134
|
+
path: s.path,
|
|
135
|
+
source,
|
|
136
|
+
license: s.license,
|
|
137
|
+
author: s.author,
|
|
138
|
+
version: s.version
|
|
139
|
+
}));
|
|
140
|
+
skillsCache.set(cacheKey, { skills, timestamp: Date.now() });
|
|
141
|
+
return skills;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
// No index file, fall back to individual fetching
|
|
146
|
+
}
|
|
147
|
+
// Fallback: fetch each SKILL.md (for repos without index)
|
|
148
|
+
const skills = [];
|
|
149
|
+
const apiUrl = `https://api.github.com/repos/${source.owner}/${source.repo}/contents/${skillsPath}?ref=${branch}`;
|
|
150
|
+
try {
|
|
151
|
+
const response = await fetch(apiUrl, {
|
|
152
|
+
headers: {
|
|
153
|
+
'Accept': 'application/vnd.github.v3+json',
|
|
154
|
+
'User-Agent': 'agent-skills-cli'
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
if (!response.ok) {
|
|
158
|
+
throw new Error(`GitHub API error: ${response.status}`);
|
|
159
|
+
}
|
|
160
|
+
const contents = await response.json();
|
|
161
|
+
// Filter for directories (potential skills)
|
|
162
|
+
const skillDirs = contents.filter(item => item.type === 'dir');
|
|
163
|
+
// Fetch all SKILL.md files in parallel (with concurrency limit)
|
|
164
|
+
const BATCH_SIZE = 10;
|
|
165
|
+
for (let i = 0; i < skillDirs.length; i += BATCH_SIZE) {
|
|
166
|
+
const batch = skillDirs.slice(i, i + BATCH_SIZE);
|
|
167
|
+
const fetchPromises = batch.map(async (dir) => {
|
|
168
|
+
try {
|
|
169
|
+
const skillMdUrl = `https://raw.githubusercontent.com/${source.owner}/${source.repo}/${branch}/${dir.path}/SKILL.md`;
|
|
170
|
+
const skillResponse = await fetch(skillMdUrl);
|
|
171
|
+
if (skillResponse.ok) {
|
|
172
|
+
const skillMd = await skillResponse.text();
|
|
173
|
+
const metadata = parseSkillMdFrontmatter(skillMd);
|
|
174
|
+
if (metadata) {
|
|
175
|
+
return {
|
|
176
|
+
name: metadata.name || dir.name,
|
|
177
|
+
description: metadata.description || '',
|
|
178
|
+
path: dir.path,
|
|
179
|
+
source,
|
|
180
|
+
license: metadata.license,
|
|
181
|
+
author: metadata.metadata?.author,
|
|
182
|
+
version: metadata.metadata?.version
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
// Skip skills that can't be parsed
|
|
189
|
+
}
|
|
190
|
+
return null;
|
|
191
|
+
});
|
|
192
|
+
const results = await Promise.all(fetchPromises);
|
|
193
|
+
skills.push(...results.filter((s) => s !== null));
|
|
194
|
+
}
|
|
195
|
+
// Cache the results
|
|
196
|
+
skillsCache.set(cacheKey, { skills, timestamp: Date.now() });
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
throw new Error(`Failed to fetch from ${source.owner}/${source.repo}: ${error}`);
|
|
200
|
+
}
|
|
201
|
+
return skills;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Parse frontmatter from SKILL.md content
|
|
205
|
+
*/
|
|
206
|
+
function parseSkillMdFrontmatter(content) {
|
|
207
|
+
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
208
|
+
if (!frontmatterMatch)
|
|
209
|
+
return null;
|
|
210
|
+
try {
|
|
211
|
+
// Simple YAML parsing (for basic key: value pairs)
|
|
212
|
+
const yaml = frontmatterMatch[1];
|
|
213
|
+
const result = {};
|
|
214
|
+
let currentKey = '';
|
|
215
|
+
let inMetadata = false;
|
|
216
|
+
const metadataObj = {};
|
|
217
|
+
for (const line of yaml.split('\n')) {
|
|
218
|
+
const trimmed = line.trim();
|
|
219
|
+
if (!trimmed)
|
|
220
|
+
continue;
|
|
221
|
+
if (line.startsWith(' ') && inMetadata) {
|
|
222
|
+
// Nested metadata
|
|
223
|
+
const [key, ...valueParts] = trimmed.split(':');
|
|
224
|
+
if (key && valueParts.length > 0) {
|
|
225
|
+
metadataObj[key.trim()] = valueParts.join(':').trim().replace(/^["']|["']$/g, '');
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
else if (trimmed.startsWith('metadata:')) {
|
|
229
|
+
inMetadata = true;
|
|
230
|
+
currentKey = 'metadata';
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
inMetadata = false;
|
|
234
|
+
const colonIndex = trimmed.indexOf(':');
|
|
235
|
+
if (colonIndex > 0) {
|
|
236
|
+
const key = trimmed.slice(0, colonIndex).trim();
|
|
237
|
+
const value = trimmed.slice(colonIndex + 1).trim().replace(/^["']|["']$/g, '');
|
|
238
|
+
result[key] = value;
|
|
239
|
+
currentKey = key;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
if (Object.keys(metadataObj).length > 0) {
|
|
244
|
+
result.metadata = metadataObj;
|
|
245
|
+
}
|
|
246
|
+
return result;
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Install a skill from a marketplace
|
|
254
|
+
*/
|
|
255
|
+
export async function installSkill(skillName, sourceId) {
|
|
256
|
+
const config = await loadConfig();
|
|
257
|
+
// Find the skill in available marketplaces
|
|
258
|
+
const allSkills = await listMarketplaceSkills(sourceId);
|
|
259
|
+
const skill = allSkills.find(s => s.name === skillName);
|
|
260
|
+
if (!skill) {
|
|
261
|
+
throw new Error(`Skill not found: ${skillName}`);
|
|
262
|
+
}
|
|
263
|
+
// Check if already installed
|
|
264
|
+
const existing = config.installed.find(i => i.name === skillName);
|
|
265
|
+
if (existing) {
|
|
266
|
+
throw new Error(`Skill ${skillName} is already installed at ${existing.localPath}`);
|
|
267
|
+
}
|
|
268
|
+
// Create installation directory
|
|
269
|
+
await mkdir(config.installDir, { recursive: true });
|
|
270
|
+
const installPath = join(config.installDir, skillName);
|
|
271
|
+
// Download skill from GitHub
|
|
272
|
+
await downloadSkill(skill, installPath);
|
|
273
|
+
// Validate the installed skill
|
|
274
|
+
const metadata = await loadSkillMetadata(join(installPath, 'SKILL.md'));
|
|
275
|
+
if (metadata) {
|
|
276
|
+
const validation = validateMetadata(metadata);
|
|
277
|
+
if (!validation.valid) {
|
|
278
|
+
// Remove invalid skill
|
|
279
|
+
await rm(installPath, { recursive: true, force: true });
|
|
280
|
+
throw new Error(`Installed skill is invalid: ${validation.errors.map(e => e.message).join(', ')}`);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
// Track installation
|
|
284
|
+
const installed = {
|
|
285
|
+
name: skillName,
|
|
286
|
+
localPath: installPath,
|
|
287
|
+
source: skill.source,
|
|
288
|
+
remotePath: skill.path,
|
|
289
|
+
version: skill.version,
|
|
290
|
+
installedAt: new Date().toISOString()
|
|
291
|
+
};
|
|
292
|
+
config.installed.push(installed);
|
|
293
|
+
await saveConfig(config);
|
|
294
|
+
return installed;
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Download a skill from GitHub
|
|
298
|
+
*/
|
|
299
|
+
async function downloadSkill(skill, destPath) {
|
|
300
|
+
const source = skill.source;
|
|
301
|
+
const branch = source.branch || 'main';
|
|
302
|
+
// Create temp directory
|
|
303
|
+
const tempDir = join(tmpdir(), `skill-${Date.now()}`);
|
|
304
|
+
await mkdir(tempDir, { recursive: true });
|
|
305
|
+
try {
|
|
306
|
+
// Clone just the skill directory using sparse checkout
|
|
307
|
+
const repoUrl = `https://github.com/${source.owner}/${source.repo}.git`;
|
|
308
|
+
// Initialize sparse checkout
|
|
309
|
+
await execAsync(`git init`, { cwd: tempDir });
|
|
310
|
+
await execAsync(`git remote add origin ${repoUrl}`, { cwd: tempDir });
|
|
311
|
+
await execAsync(`git config core.sparseCheckout true`, { cwd: tempDir });
|
|
312
|
+
// Set sparse checkout path
|
|
313
|
+
const sparseFile = join(tempDir, '.git', 'info', 'sparse-checkout');
|
|
314
|
+
await writeFile(sparseFile, skill.path + '\n');
|
|
315
|
+
// Fetch and checkout
|
|
316
|
+
await execAsync(`git fetch --depth=1 origin ${branch}`, { cwd: tempDir });
|
|
317
|
+
await execAsync(`git checkout ${branch}`, { cwd: tempDir });
|
|
318
|
+
// Copy skill to destination
|
|
319
|
+
const skillSourcePath = join(tempDir, skill.path);
|
|
320
|
+
await mkdir(destPath, { recursive: true });
|
|
321
|
+
// Copy all files
|
|
322
|
+
await cp(skillSourcePath, destPath, { recursive: true });
|
|
323
|
+
}
|
|
324
|
+
finally {
|
|
325
|
+
// Cleanup temp directory
|
|
326
|
+
await rm(tempDir, { recursive: true, force: true }).catch(() => { });
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Uninstall a skill
|
|
331
|
+
*/
|
|
332
|
+
export async function uninstallSkill(skillName) {
|
|
333
|
+
const config = await loadConfig();
|
|
334
|
+
const index = config.installed.findIndex(i => i.name === skillName);
|
|
335
|
+
if (index === -1) {
|
|
336
|
+
throw new Error(`Skill ${skillName} is not installed via marketplace`);
|
|
337
|
+
}
|
|
338
|
+
const installed = config.installed[index];
|
|
339
|
+
// Remove skill directory
|
|
340
|
+
if (existsSync(installed.localPath)) {
|
|
341
|
+
await rm(installed.localPath, { recursive: true, force: true });
|
|
342
|
+
}
|
|
343
|
+
// Remove from tracking
|
|
344
|
+
config.installed.splice(index, 1);
|
|
345
|
+
await saveConfig(config);
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Check for skill updates
|
|
349
|
+
*/
|
|
350
|
+
export async function checkUpdates() {
|
|
351
|
+
const config = await loadConfig();
|
|
352
|
+
const updates = [];
|
|
353
|
+
for (const installed of config.installed) {
|
|
354
|
+
if (!installed.source)
|
|
355
|
+
continue;
|
|
356
|
+
try {
|
|
357
|
+
const skills = await fetchSkillsFromSource(installed.source);
|
|
358
|
+
const remote = skills.find(s => s.name === installed.name);
|
|
359
|
+
if (remote) {
|
|
360
|
+
const hasUpdate = remote.version !== installed.version && !!remote.version;
|
|
361
|
+
updates.push({
|
|
362
|
+
skill: installed,
|
|
363
|
+
currentVersion: installed.version,
|
|
364
|
+
latestVersion: remote.version,
|
|
365
|
+
hasUpdate
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
catch {
|
|
370
|
+
// Skip update check for unreachable sources
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
return updates;
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Search for skills across all marketplaces
|
|
377
|
+
*/
|
|
378
|
+
export async function searchSkills(query) {
|
|
379
|
+
const allSkills = await listMarketplaceSkills();
|
|
380
|
+
const lowerQuery = query.toLowerCase();
|
|
381
|
+
return allSkills.filter(skill => skill.name.toLowerCase().includes(lowerQuery) ||
|
|
382
|
+
skill.description.toLowerCase().includes(lowerQuery) ||
|
|
383
|
+
skill.tags?.some(t => t.toLowerCase().includes(lowerQuery)));
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Get list of installed skills
|
|
387
|
+
*/
|
|
388
|
+
export async function getInstalledSkills() {
|
|
389
|
+
const config = await loadConfig();
|
|
390
|
+
return config.installed;
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* List registered marketplace sources
|
|
394
|
+
*/
|
|
395
|
+
export async function listMarketplaces() {
|
|
396
|
+
const config = await loadConfig();
|
|
397
|
+
return config.sources;
|
|
398
|
+
}
|
|
399
|
+
//# sourceMappingURL=marketplace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketplace.js","sourceRoot":"","sources":["../../src/core/marketplace.ts"],"names":[],"mappings":"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"}
|