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.
Files changed (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +226 -0
  3. package/dist/cli/index.d.ts +7 -0
  4. package/dist/cli/index.d.ts.map +1 -0
  5. package/dist/cli/index.js +1181 -0
  6. package/dist/cli/index.js.map +1 -0
  7. package/dist/core/executor.d.ts +22 -0
  8. package/dist/core/executor.d.ts.map +1 -0
  9. package/dist/core/executor.js +147 -0
  10. package/dist/core/executor.js.map +1 -0
  11. package/dist/core/index.d.ts +12 -0
  12. package/dist/core/index.d.ts.map +1 -0
  13. package/dist/core/index.js +17 -0
  14. package/dist/core/index.js.map +1 -0
  15. package/dist/core/injector.d.ts +24 -0
  16. package/dist/core/injector.d.ts.map +1 -0
  17. package/dist/core/injector.js +99 -0
  18. package/dist/core/injector.js.map +1 -0
  19. package/dist/core/loader.d.ts +39 -0
  20. package/dist/core/loader.d.ts.map +1 -0
  21. package/dist/core/loader.js +161 -0
  22. package/dist/core/loader.js.map +1 -0
  23. package/dist/core/marketplace.d.ts +55 -0
  24. package/dist/core/marketplace.d.ts.map +1 -0
  25. package/dist/core/marketplace.js +399 -0
  26. package/dist/core/marketplace.js.map +1 -0
  27. package/dist/core/skillsmp.d.ts +38 -0
  28. package/dist/core/skillsmp.d.ts.map +1 -0
  29. package/dist/core/skillsmp.js +142 -0
  30. package/dist/core/skillsmp.js.map +1 -0
  31. package/dist/core/validator.d.ts +18 -0
  32. package/dist/core/validator.d.ts.map +1 -0
  33. package/dist/core/validator.js +177 -0
  34. package/dist/core/validator.js.map +1 -0
  35. package/dist/index.d.ts +5 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +5 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/types/index.d.ts +108 -0
  40. package/dist/types/index.d.ts.map +1 -0
  41. package/dist/types/index.js +6 -0
  42. package/dist/types/index.js.map +1 -0
  43. package/dist/types/marketplace.d.ts +81 -0
  44. package/dist/types/marketplace.d.ts.map +1 -0
  45. package/dist/types/marketplace.js +20 -0
  46. package/dist/types/marketplace.js.map +1 -0
  47. 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":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAY,MAAM,MAAM,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAOjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC;;GAEG;AACH,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,cAAc,CAAC,CAAC;AACjE,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;AACzD,MAAM,mBAAmB,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AAEvD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU;IAC5B,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC3B,OAAO;YACH,OAAO,EAAE,CAAC,GAAG,oBAAoB,CAAC;YAClC,SAAS,EAAE,EAAE;YACb,UAAU,EAAE,mBAAmB;SAClC,CAAC;IACN,CAAC;IAED,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAsB,CAAC;QAExD,2CAA2C;QAC3C,KAAK,MAAM,aAAa,IAAI,oBAAoB,EAAE,CAAC;YAC/C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC;gBACvD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACvC,CAAC;QACL,CAAC;QAED,mCAAmC;QACnC,MAAM,aAAa,GAAG,CAAC,sBAAsB,CAAC,CAAC;QAC/C,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAE3E,OAAO,MAAM,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO;YACH,OAAO,EAAE,CAAC,GAAG,oBAAoB,CAAC;YAClC,SAAS,EAAE,EAAE;YACb,UAAU,EAAE,mBAAmB;SAClC,CAAC;IACN,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAyB;IACtD,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAyB;IAC1D,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAElC,0BAA0B;IAC1B,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,eAAe,MAAM,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EAAU;IAC9C,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAEzD,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;IACnD,CAAC;IAED,wCAAwC;IACxC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,uCAAuC,EAAE,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAChC,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACvC,QAAiB;IAEjB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,QAAQ;QACpB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC;QAC/C,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;IAErB,MAAM,MAAM,GAAuB,EAAE,CAAC;IAEtC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,CAAC;YACD,MAAM,YAAY,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,CAAC;YACzD,MAAM,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,iCAAiC,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACvE,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,wDAAwD;AACxD,MAAM,WAAW,GAAmE,IAAI,GAAG,EAAE,CAAC;AAC9F,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;AAE7C;;GAEG;AACH,KAAK,UAAU,qBAAqB,CAChC,MAAyB;IAEzB,MAAM,QAAQ,GAAG,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;IAClD,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEzC,sCAAsC;IACtC,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC;QACtD,OAAO,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC;IACvC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,QAAQ,CAAC;IAEjD,4DAA4D;IAC5D,MAAM,QAAQ,GAAG,qCAAqC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,IAAI,UAAU,oBAAoB,CAAC;IAE9H,IAAI,CAAC;QACD,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;QAE5C,IAAI,aAAa,CAAC,EAAE,EAAE,CAAC;YACnB,wDAAwD;YACxD,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,IAAI,EASrC,CAAC;YAEF,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAClC,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,EAAE;gBAChC,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,MAAM;gBACN,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,OAAO,EAAE,CAAC,CAAC,OAAO;aACA,CAAA,CAAC,CAAC;YAExB,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC7D,OAAO,MAAM,CAAC;QAClB,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACL,kDAAkD;IACtD,CAAC;IAED,0DAA0D;IAC1D,MAAM,MAAM,GAAuB,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,gCAAgC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,aAAa,UAAU,QAAQ,MAAM,EAAE,CAAC;IAElH,IAAI,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE;YACjC,OAAO,EAAE;gBACL,QAAQ,EAAE,gCAAgC;gBAC1C,YAAY,EAAE,kBAAkB;aACnC;SACJ,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,EAIlC,CAAC;QAEH,4CAA4C;QAC5C,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;QAE/D,gEAAgE;QAChE,MAAM,UAAU,GAAG,EAAE,CAAC;QACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC;YACpD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC;YACjD,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;gBAC1C,IAAI,CAAC;oBACD,MAAM,UAAU,GAAG,qCAAqC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,IAAI,GAAG,CAAC,IAAI,WAAW,CAAC;oBACrH,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,CAAC;oBAE9C,IAAI,aAAa,CAAC,EAAE,EAAE,CAAC;wBACnB,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;wBAC3C,MAAM,QAAQ,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;wBAElD,IAAI,QAAQ,EAAE,CAAC;4BACX,OAAO;gCACH,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI;gCAC/B,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,EAAE;gCACvC,IAAI,EAAE,GAAG,CAAC,IAAI;gCACd,MAAM;gCACN,OAAO,EAAE,QAAQ,CAAC,OAAO;gCACzB,MAAM,EAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM;gCACjC,OAAO,EAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO;6BAClB,CAAC;wBAC1B,CAAC;oBACL,CAAC;gBACL,CAAC;gBAAC,MAAM,CAAC;oBACL,mCAAmC;gBACvC,CAAC;gBACD,OAAO,IAAI,CAAC;YAChB,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YACjD,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAyB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;QAC7E,CAAC;QAED,oBAAoB;QACpB,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAEjE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAAC,OAAe;IAC5C,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAChE,IAAI,CAAC,gBAAgB;QAAE,OAAO,IAAI,CAAC;IAEnC,IAAI,CAAC;QACD,mDAAmD;QACnD,MAAM,IAAI,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,MAAM,GAAwB,EAAE,CAAC;QAEvC,IAAI,UAAU,GAAG,EAAE,CAAC;QACpB,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,MAAM,WAAW,GAA2B,EAAE,CAAC;QAE/C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO;gBAAE,SAAS;YAEvB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,EAAE,CAAC;gBACtC,kBAAkB;gBAClB,MAAM,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAChD,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC/B,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;gBACtF,CAAC;YACL,CAAC;iBAAM,IAAI,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBACzC,UAAU,GAAG,IAAI,CAAC;gBAClB,UAAU,GAAG,UAAU,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACJ,UAAU,GAAG,KAAK,CAAC;gBACnB,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBACxC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;oBACjB,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;oBAChD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;oBAC/E,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;oBACpB,UAAU,GAAG,GAAG,CAAC;gBACrB,CAAC;YACL,CAAC;QACL,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,MAAM,CAAC,QAAQ,GAAG,WAAW,CAAC;QAClC,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAC9B,SAAiB,EACjB,QAAiB;IAEjB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAElC,2CAA2C;IAC3C,MAAM,SAAS,GAAG,MAAM,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAExD,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,oBAAoB,SAAS,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,6BAA6B;IAC7B,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAClE,IAAI,QAAQ,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,SAAS,SAAS,4BAA4B,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;IACxF,CAAC;IAED,gCAAgC;IAChC,MAAM,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAEvD,6BAA6B;IAC7B,MAAM,aAAa,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAExC,+BAA+B;IAC/B,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;IACxE,IAAI,QAAQ,EAAE,CAAC;QACX,MAAM,UAAU,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACpB,uBAAuB;YACvB,MAAM,EAAE,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,+BAA+B,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvG,CAAC;IACL,CAAC;IAED,qBAAqB;IACrB,MAAM,SAAS,GAAmB;QAC9B,IAAI,EAAE,SAAS;QACf,SAAS,EAAE,WAAW;QACtB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,UAAU,EAAE,KAAK,CAAC,IAAI;QACtB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACxC,CAAC;IAEF,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACjC,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;IAEzB,OAAO,SAAS,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,aAAa,CACxB,KAAuB,EACvB,QAAgB;IAEhB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC;IAEvC,wBAAwB;IACxB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACtD,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1C,IAAI,CAAC;QACD,uDAAuD;QACvD,MAAM,OAAO,GAAG,sBAAsB,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,MAAM,CAAC;QAExE,6BAA6B;QAC7B,MAAM,SAAS,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9C,MAAM,SAAS,CAAC,yBAAyB,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QACtE,MAAM,SAAS,CAAC,qCAAqC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QAEzE,2BAA2B;QAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,CAAC,CAAC;QACpE,MAAM,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;QAE/C,qBAAqB;QACrB,MAAM,SAAS,CAAC,8BAA8B,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1E,MAAM,SAAS,CAAC,gBAAgB,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QAE5D,4BAA4B;QAC5B,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE3C,iBAAiB;QACjB,MAAM,EAAE,CAAC,eAAe,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7D,CAAC;YAAS,CAAC;QACP,yBAAyB;QACzB,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACzE,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,SAAiB;IAClD,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAElC,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IACpE,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,SAAS,SAAS,mCAAmC,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAE1C,yBAAyB;IACzB,IAAI,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;QAClC,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,uBAAuB;IACvB,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAClC,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAM9B,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,OAAO,GAKR,EAAE,CAAC;IAER,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACvC,IAAI,CAAC,SAAS,CAAC,MAAM;YAAE,SAAS;QAEhC,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAC7D,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC;YAE3D,IAAI,MAAM,EAAE,CAAC;gBACT,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC3E,OAAO,CAAC,IAAI,CAAC;oBACT,KAAK,EAAE,SAAS;oBAChB,cAAc,EAAE,SAAS,CAAC,OAAO;oBACjC,aAAa,EAAE,MAAM,CAAC,OAAO;oBAC7B,SAAS;iBACZ,CAAC,CAAC;YACP,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,4CAA4C;QAChD,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAa;IAC5C,MAAM,SAAS,GAAG,MAAM,qBAAqB,EAAE,CAAC;IAChD,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAEvC,OAAO,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC5B,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC7C,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;QACpD,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAC9D,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACpC,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,OAAO,MAAM,CAAC,SAAS,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IAClC,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,OAAO,MAAM,CAAC,OAAO,CAAC;AAC1B,CAAC"}