natureco-cli 5.18.2 → 5.19.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/package.json +1 -1
- package/skills/airunway-aks-setup/SKILL.md +73 -0
- package/skills/algorithmic-art/SKILL.md +405 -0
- package/skills/appinsights-instrumentation/SKILL.md +76 -0
- package/skills/azure-ai/SKILL.md +71 -0
- package/skills/azure-aigateway/SKILL.md +129 -0
- package/skills/azure-cloud-migrate/SKILL.md +52 -0
- package/skills/azure-compliance/SKILL.md +108 -0
- package/skills/azure-compute/SKILL.md +46 -0
- package/skills/azure-cost/SKILL.md +45 -0
- package/skills/azure-deploy/SKILL.md +97 -0
- package/skills/azure-diagnostics/SKILL.md +151 -0
- package/skills/azure-enterprise-infra-planner/SKILL.md +54 -0
- package/skills/azure-hosted-copilot-sdk/SKILL.md +89 -0
- package/skills/azure-kubernetes/SKILL.md +153 -0
- package/skills/azure-kusto/SKILL.md +231 -0
- package/skills/azure-messaging/SKILL.md +57 -0
- package/skills/azure-prepare/SKILL.md +165 -0
- package/skills/azure-quotas/SKILL.md +276 -0
- package/skills/azure-rbac/SKILL.md +17 -0
- package/skills/azure-reliability/SKILL.md +387 -0
- package/skills/azure-resource-lookup/SKILL.md +108 -0
- package/skills/azure-resource-visualizer/SKILL.md +183 -0
- package/skills/azure-storage/SKILL.md +100 -0
- package/skills/azure-upgrade/SKILL.md +91 -0
- package/skills/azure-validate/SKILL.md +72 -0
- package/skills/brainstorming/SKILL.md +159 -0
- package/skills/brand-guidelines/SKILL.md +73 -0
- package/skills/brandkit/SKILL.md +798 -0
- package/skills/brutalist-skill/SKILL.md +92 -0
- package/skills/canvas-design/SKILL.md +130 -0
- package/skills/cavecrew/SKILL.md +82 -0
- package/skills/caveman-commit/SKILL.md +65 -0
- package/skills/caveman-help/SKILL.md +63 -0
- package/skills/caveman-review/SKILL.md +55 -0
- package/skills/caveman-stats/SKILL.md +10 -0
- package/skills/claude-api/SKILL.md +356 -0
- package/skills/composition-patterns/SKILL.md +89 -0
- package/skills/decision-mapping/SKILL.md +84 -0
- package/skills/deploy-to-vercel/SKILL.md +296 -0
- package/skills/design-an-interface/SKILL.md +94 -0
- package/skills/design-doc-mermaid/SKILL.md +498 -0
- package/skills/develop-userscripts/SKILL.md +84 -0
- package/skills/doc-coauthoring/SKILL.md +375 -0
- package/skills/documentation/SKILL.md +109 -0
- package/skills/docx/SKILL.md +590 -0
- package/skills/edit-article/SKILL.md +15 -0
- package/skills/entra-agent-id/SKILL.md +356 -0
- package/skills/entra-app-registration/SKILL.md +191 -0
- package/skills/faceless-explainer/SKILL.md +202 -0
- package/skills/fastify/SKILL.md +75 -0
- package/skills/general-video/SKILL.md +143 -0
- package/skills/git-guardrails-claude-code/SKILL.md +95 -0
- package/skills/github-actions-docs/SKILL.md +98 -0
- package/skills/gpt-tasteskill/SKILL.md +74 -0
- package/skills/grill-me/SKILL.md +7 -0
- package/skills/grilling/SKILL.md +10 -0
- package/skills/handoff/SKILL.md +16 -0
- package/skills/hyperframes/SKILL.md +152 -0
- package/skills/hyperframes-animation/SKILL.md +82 -0
- package/skills/hyperframes-cli/SKILL.md +109 -0
- package/skills/hyperframes-core/SKILL.md +78 -0
- package/skills/hyperframes-creative/SKILL.md +68 -0
- package/skills/hyperframes-media/SKILL.md +97 -0
- package/skills/image-to-code-skill/SKILL.md +1228 -0
- package/skills/imagegen-frontend-mobile/SKILL.md +1465 -0
- package/skills/imagegen-frontend-web/SKILL.md +987 -0
- package/skills/implement/SKILL.md +15 -0
- package/skills/init/SKILL.md +91 -0
- package/skills/internal-comms/SKILL.md +32 -0
- package/skills/lark-approval/SKILL.md +56 -0
- package/skills/lark-base/SKILL.md +157 -0
- package/skills/lark-doc/SKILL.md +81 -0
- package/skills/lark-shared/SKILL.md +168 -0
- package/skills/lark-workflow-meeting-summary/SKILL.md +122 -0
- package/skills/linting-neostandard-eslint9/SKILL.md +64 -0
- package/skills/loop-me/SKILL.md +32 -0
- package/skills/microsoft-foundry/SKILL.md +262 -0
- package/skills/migrate-to-shoehorn/SKILL.md +118 -0
- package/skills/minimalist-skill/SKILL.md +85 -0
- package/skills/motion-graphics/SKILL.md +170 -0
- package/skills/music-to-video/SKILL.md +197 -0
- package/skills/node/SKILL.md +94 -0
- package/skills/nodejs-core/SKILL.md +156 -0
- package/skills/oauth/SKILL.md +186 -0
- package/skills/obsidian-vault/SKILL.md +59 -0
- package/skills/octocat/SKILL.md +93 -0
- package/skills/openclaw-secure-linux-cloud/SKILL.md +157 -0
- package/skills/opensource-guide-coach/SKILL.md +218 -0
- package/skills/output-skill/SKILL.md +49 -0
- package/skills/pdf/SKILL.md +314 -0
- package/skills/pptx/SKILL.md +232 -0
- package/skills/pr-to-video/SKILL.md +235 -0
- package/skills/product-launch-video/SKILL.md +205 -0
- package/skills/python-appservice-deploy/SKILL.md +36 -0
- package/skills/qa/SKILL.md +130 -0
- package/skills/react-best-practices/SKILL.md +149 -0
- package/skills/react-native-skills/SKILL.md +121 -0
- package/skills/react-view-transitions/SKILL.md +320 -0
- package/skills/readme-i18n/SKILL.md +176 -0
- package/skills/redesign-skill/SKILL.md +178 -0
- package/skills/remotion/SKILL.md +364 -0
- package/skills/request-refactor-plan/SKILL.md +68 -0
- package/skills/resolving-merge-conflicts/SKILL.md +14 -0
- package/skills/running-claude-code-via-litellm-copilot/SKILL.md +263 -0
- package/skills/scaffold-exercises/SKILL.md +106 -0
- package/skills/secure-linux-web-hosting/SKILL.md +162 -0
- package/skills/setup-pre-commit/SKILL.md +91 -0
- package/skills/shadcn/SKILL.md +267 -0
- package/skills/simple/SKILL.md +52 -0
- package/skills/skill-creator/SKILL.md +485 -0
- package/skills/skill-optimizer/SKILL.md +47 -0
- package/skills/skills-cli/SKILL.md +281 -0
- package/skills/slack-gif-creator/SKILL.md +254 -0
- package/skills/snipgrapher/SKILL.md +58 -0
- package/skills/soft-skill/SKILL.md +98 -0
- package/skills/stitch-skill/SKILL.md +184 -0
- package/skills/supabase/SKILL.md +135 -0
- package/skills/supabase-postgres-best-practices/SKILL.md +64 -0
- package/skills/systematic-debugging/SKILL.md +296 -0
- package/skills/talking-head-recut/SKILL.md +1191 -0
- package/skills/taste-skill/SKILL.md +1206 -0
- package/skills/taste-skill-v1/SKILL.md +226 -0
- package/skills/tdd/SKILL.md +108 -0
- package/skills/teach/SKILL.md +140 -0
- package/skills/test-driven-development/SKILL.md +371 -0
- package/skills/theme-factory/SKILL.md +59 -0
- package/skills/to-prd/SKILL.md +75 -0
- package/skills/typescript-magician/SKILL.md +117 -0
- package/skills/tzst/SKILL.md +68 -0
- package/skills/ubiquitous-language/SKILL.md +93 -0
- package/skills/use-my-browser/SKILL.md +110 -0
- package/skills/using-superpowers/SKILL.md +121 -0
- package/skills/vercel-cli-with-tokens/SKILL.md +353 -0
- package/skills/vercel-optimize/SKILL.md +322 -0
- package/skills/viral-instagram-reels/SKILL.md +180 -0
- package/skills/viral-short-form/SKILL.md +147 -0
- package/skills/viral-short-form-ideas/SKILL.md +184 -0
- package/skills/viral-tiktok-content/SKILL.md +180 -0
- package/skills/web-artifacts-builder/SKILL.md +74 -0
- package/skills/web-design-guidelines/SKILL.md +39 -0
- package/skills/webapp-testing/SKILL.md +96 -0
- package/skills/website-to-video/SKILL.md +145 -0
- package/skills/writing-beats/SKILL.md +67 -0
- package/skills/writing-fragments/SKILL.md +79 -0
- package/skills/writing-great-skills/SKILL.md +82 -0
- package/skills/writing-guidelines/SKILL.md +39 -0
- package/skills/writing-plans/SKILL.md +174 -0
- package/skills/writing-shape/SKILL.md +79 -0
- package/skills/xdrop/SKILL.md +78 -0
- package/skills/xget/SKILL.md +87 -0
- package/skills/xlsx/SKILL.md +292 -0
- package/src/tools/browser_use.js +2 -1
- package/src/tools/skills_download.js +217 -0
- package/src/utils/tools.js +2 -2
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* skills_download — Download skills from skills.sh ecosystem or GitHub repos
|
|
3
|
+
*
|
|
4
|
+
* Bulk-imports Agent Skills from the open ecosystem into natureco's skill system.
|
|
5
|
+
* Skills are SKILL.md files following the Agent Skills standard (agentskills.io).
|
|
6
|
+
*
|
|
7
|
+
* Sources:
|
|
8
|
+
* - GitHub repos (anthropics/skills, vercel-labs/agent-skills, etc.)
|
|
9
|
+
* - skills.sh registry
|
|
10
|
+
* - Direct SKILL.md URLs
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
const https = require('https');
|
|
14
|
+
const fs = require('fs');
|
|
15
|
+
const path = require('path');
|
|
16
|
+
const os = require('os');
|
|
17
|
+
|
|
18
|
+
const BUILTIN_SKILLS_DIR = path.join(__dirname, '..', '..', 'skills');
|
|
19
|
+
const USER_SKILLS_DIR = path.join(os.homedir(), '.natureco', 'skills');
|
|
20
|
+
|
|
21
|
+
// Known skill repos with high-quality skills
|
|
22
|
+
const KNOWN_REPOS = [
|
|
23
|
+
{ owner: 'anthropics', repo: 'skills', topic: 'general' },
|
|
24
|
+
{ owner: 'mattpocock', repo: 'skills', topic: 'typescript' },
|
|
25
|
+
{ owner: 'vercel-labs', repo: 'agent-skills', topic: 'vercel' },
|
|
26
|
+
{ owner: 'supabase', repo: 'agent-skills', topic: 'database' },
|
|
27
|
+
{ owner: 'xixu-me', repo: 'skills', topic: 'devops' },
|
|
28
|
+
{ owner: 'microsoft', repo: 'azure-skills', topic: 'cloud' },
|
|
29
|
+
{ owner: 'shadcn', repo: 'ui', topic: 'design' },
|
|
30
|
+
{ owner: 'nrwl', repo: 'nx-ai-agents-config', topic: 'nx' },
|
|
31
|
+
{ owner: 'remotion-dev', repo: 'skills', topic: 'video' },
|
|
32
|
+
{ owner: 'mcollina', repo: 'skills', topic: 'nodejs' },
|
|
33
|
+
{ owner: 'spillwavesolutions', repo: 'design-doc-mermaid', topic: 'design' },
|
|
34
|
+
{ owner: 'nextlevelbuilder', repo: 'ui-ux-pro-max-skill', topic: 'design' },
|
|
35
|
+
{ owner: 'browser-act', repo: 'skills', topic: 'browser' },
|
|
36
|
+
{ owner: 'obra', repo: 'superpowers', topic: 'workflow' },
|
|
37
|
+
];
|
|
38
|
+
|
|
39
|
+
function httpsGet(url) {
|
|
40
|
+
return new Promise((resolve, reject) => {
|
|
41
|
+
https.get(url, { timeout: 15000 }, (res) => {
|
|
42
|
+
let data = '';
|
|
43
|
+
res.on('data', c => data += c);
|
|
44
|
+
res.on('end', () => resolve(data));
|
|
45
|
+
}).on('error', reject).on('timeout', function() { this.destroy(); reject(new Error('Timeout')); });
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function getGithubContentsUrl(owner, repo, path) {
|
|
50
|
+
return `https://api.github.com/repos/${owner}/${repo}/contents/${path}`;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async function listRepos() {
|
|
54
|
+
return KNOWN_REPOS.map(r => ({
|
|
55
|
+
id: `${r.owner}/${r.repo}`,
|
|
56
|
+
owner: r.owner,
|
|
57
|
+
repo: r.repo,
|
|
58
|
+
topic: r.topic,
|
|
59
|
+
}));
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function parseFrontmatter(content) {
|
|
63
|
+
const m = content.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);
|
|
64
|
+
if (!m) return { metadata: {}, body: content };
|
|
65
|
+
const fm = {};
|
|
66
|
+
for (const line of m[1].split('\n')) {
|
|
67
|
+
const kv = line.match(/^(\w+):\s*(.+)$/);
|
|
68
|
+
if (kv) fm[kv[1]] = kv[2].replace(/^["']|["']$/g, '');
|
|
69
|
+
}
|
|
70
|
+
return { metadata: fm, body: (m[2] || '').trim() };
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async function fetchGithubRepo(owner, repo) {
|
|
74
|
+
// Use GitHub API to list contents of /skills directory
|
|
75
|
+
const url = `https://api.github.com/repos/${owner}/${repo}/git/trees/HEAD?recursive=1`;
|
|
76
|
+
const data = await httpsGet(url, { headers: { 'User-Agent': 'natureco-cli', 'Accept': 'application/vnd.github.v3+json' } });
|
|
77
|
+
const tree = JSON.parse(data).tree || [];
|
|
78
|
+
|
|
79
|
+
// Find all SKILL.md files
|
|
80
|
+
const skillFiles = tree.filter(f => f.path.endsWith('SKILL.md'));
|
|
81
|
+
const skills = [];
|
|
82
|
+
|
|
83
|
+
for (const file of skillFiles) {
|
|
84
|
+
const skillDir = path.dirname(file.path);
|
|
85
|
+
const skillName = path.basename(skillDir);
|
|
86
|
+
|
|
87
|
+
// Fetch SKILL.md content
|
|
88
|
+
const rawUrl = `https://raw.githubusercontent.com/${owner}/${repo}/main/${file.path}`;
|
|
89
|
+
let content;
|
|
90
|
+
try {
|
|
91
|
+
content = await httpsGet(rawUrl);
|
|
92
|
+
} catch { continue; }
|
|
93
|
+
|
|
94
|
+
const { metadata, body } = parseFrontmatter(content);
|
|
95
|
+
const name = metadata.name || skillName;
|
|
96
|
+
const description = metadata.description || '';
|
|
97
|
+
|
|
98
|
+
// Find additional files in the skill directory
|
|
99
|
+
const additionalFiles = tree
|
|
100
|
+
.filter(f => f.path.startsWith(skillDir + '/') && f.path !== file.path)
|
|
101
|
+
.map(f => ({ path: f.path.replace(skillDir + '/', ''), url: `https://raw.githubusercontent.com/${owner}/${repo}/main/${f.path}` }));
|
|
102
|
+
|
|
103
|
+
skills.push({
|
|
104
|
+
name,
|
|
105
|
+
description: description.length > 200 ? description.slice(0, 200) + '...' : description,
|
|
106
|
+
fullDescription: description,
|
|
107
|
+
content: body,
|
|
108
|
+
source: `${owner}/${repo}/${skillDir}`,
|
|
109
|
+
metadata,
|
|
110
|
+
additionalFiles,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return skills;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
async function downloadSkill(skill, targetDir) {
|
|
118
|
+
const skillDir = path.join(targetDir, skill.name);
|
|
119
|
+
if (fs.existsSync(skillDir)) {
|
|
120
|
+
return { success: false, error: 'Already exists', path: skillDir };
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
fs.mkdirSync(skillDir, { recursive: true });
|
|
124
|
+
|
|
125
|
+
// Write SKILL.md
|
|
126
|
+
const frontmatter = [
|
|
127
|
+
'---',
|
|
128
|
+
`name: ${skill.name}`,
|
|
129
|
+
`description: ${skill.description}`,
|
|
130
|
+
skill.metadata.license ? `license: ${skill.metadata.license}` : null,
|
|
131
|
+
skill.source ? `metadata:\n source: ${skill.source}` : null,
|
|
132
|
+
'---',
|
|
133
|
+
'',
|
|
134
|
+
skill.content,
|
|
135
|
+
].filter(Boolean).join('\n');
|
|
136
|
+
|
|
137
|
+
fs.writeFileSync(path.join(skillDir, 'SKILL.md'), frontmatter, 'utf8');
|
|
138
|
+
|
|
139
|
+
// Download additional files
|
|
140
|
+
for (const af of (skill.additionalFiles || [])) {
|
|
141
|
+
try {
|
|
142
|
+
const data = await httpsGet(af.url);
|
|
143
|
+
const afDir = path.dirname(path.join(skillDir, af.path));
|
|
144
|
+
fs.mkdirSync(afDir, { recursive: true });
|
|
145
|
+
fs.writeFileSync(path.join(skillDir, af.path), data, 'utf8');
|
|
146
|
+
} catch {}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return { success: true, path: skillDir, name: skill.name };
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
async function execute(params) {
|
|
153
|
+
const { action, source, name, target } = params;
|
|
154
|
+
const targetDir = target === 'user' ? USER_SKILLS_DIR : BUILTIN_SKILLS_DIR;
|
|
155
|
+
|
|
156
|
+
if (action === 'list_sources') {
|
|
157
|
+
const repos = await listRepos();
|
|
158
|
+
return JSON.stringify({ success: true, sources: repos });
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
if (action === 'list_skills') {
|
|
162
|
+
const [owner, repo] = (source || '').split('/');
|
|
163
|
+
if (!owner || !repo) return JSON.stringify({ success: false, error: 'source must be owner/repo (e.g. anthropics/skills)' });
|
|
164
|
+
const skills = await fetchGithubRepo(owner, repo);
|
|
165
|
+
return JSON.stringify({ success: true, source, count: skills.length, skills: skills.map(s => ({ name: s.name, description: s.description })) });
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
if (action === 'download') {
|
|
169
|
+
const [owner, repo] = (source || '').split('/');
|
|
170
|
+
if (!owner || !repo) return JSON.stringify({ success: false, error: 'source must be owner/repo' });
|
|
171
|
+
const skills = await fetchGithubRepo(owner, repo);
|
|
172
|
+
const targetSkill = name ? skills.find(s => s.name === name) : null;
|
|
173
|
+
const toDownload = targetSkill ? [targetSkill] : skills;
|
|
174
|
+
const results = [];
|
|
175
|
+
for (const skill of toDownload) {
|
|
176
|
+
const result = await downloadSkill(skill, targetDir);
|
|
177
|
+
results.push({ name: skill.name, ...result });
|
|
178
|
+
}
|
|
179
|
+
const succeeded = results.filter(r => r.success).length;
|
|
180
|
+
return JSON.stringify({ success: true, source, total: results.length, succeeded, failed: results.length - succeeded, results });
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
if (action === 'download_all') {
|
|
184
|
+
const repos = await listRepos();
|
|
185
|
+
const allResults = [];
|
|
186
|
+
for (const repo of repos) {
|
|
187
|
+
try {
|
|
188
|
+
const skills = await fetchGithubRepo(repo.owner, repo.repo);
|
|
189
|
+
for (const skill of skills) {
|
|
190
|
+
const result = await downloadSkill(skill, targetDir);
|
|
191
|
+
allResults.push({ repo: repo.id, name: skill.name, ...result });
|
|
192
|
+
}
|
|
193
|
+
} catch (e) {
|
|
194
|
+
allResults.push({ repo: repo.id, error: e.message });
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
const succeeded = allResults.filter(r => r.success).length;
|
|
198
|
+
return JSON.stringify({ success: true, total: allResults.length, succeeded, failed: allResults.length - succeeded, results: allResults });
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
return JSON.stringify({ success: false, error: 'Unknown action. Use: list_sources, list_skills, download, download_all' });
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
const name = 'skills_download';
|
|
205
|
+
const description = 'Download skills from skills.sh ecosystem or GitHub repos. Bulk-import Agent Skills from anthropics/skills, vercel-labs/agent-skills, supabase/agent-skills and more. Actions: list_sources, list_skills, download, download_all.';
|
|
206
|
+
const parameters = {
|
|
207
|
+
type: 'object',
|
|
208
|
+
properties: {
|
|
209
|
+
action: { type: 'string', enum: ['list_sources', 'list_skills', 'download', 'download_all'] },
|
|
210
|
+
source: { type: 'string', description: 'Source repo in owner/repo format (e.g. anthropics/skills)' },
|
|
211
|
+
name: { type: 'string', description: 'Specific skill name to download (optional, downloads all if not set)' },
|
|
212
|
+
target: { type: 'string', enum: ['builtin', 'user'], description: 'Target directory: builtin (project) or user (~/.natureco)' },
|
|
213
|
+
},
|
|
214
|
+
required: ['action'],
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
module.exports = { name, description, parameters, execute };
|
package/src/utils/tools.js
CHANGED
|
@@ -24,7 +24,7 @@ const EMOJI_MAP = {
|
|
|
24
24
|
// Memory
|
|
25
25
|
memory: '🧠', memory_write: '🧠', memory_search: '🔍',
|
|
26
26
|
// Skills
|
|
27
|
-
skill_view: '📚', skills_list: '📋', skill_generate: '✨',
|
|
27
|
+
skill_view: '📚', skills_list: '📋', skill_generate: '✨', skills_autoload: '🔄', skills_marketplace: '🏪', skill_manage: '🛠️', skills_download: '📥',
|
|
28
28
|
// Agent
|
|
29
29
|
delegate_task: '👥', llm_task: '🤖', sub_agent: '👤',
|
|
30
30
|
// Documents
|
|
@@ -89,7 +89,7 @@ const TOOLSET_MAP = {
|
|
|
89
89
|
memory: 'memory', memory_write: 'memory', memory_search: 'memory',
|
|
90
90
|
// Skills
|
|
91
91
|
skill_view: 'skills', skills_list: 'skills', skill_generate: 'skills',
|
|
92
|
-
skills_autoload: 'skills', skills_marketplace: 'skills', skill_manage: 'skills',
|
|
92
|
+
skills_autoload: 'skills', skills_marketplace: 'skills', skill_manage: 'skills', skills_download: 'skills',
|
|
93
93
|
// Agent
|
|
94
94
|
delegate_task: 'agent', llm_task: 'agent',
|
|
95
95
|
// Documents
|