@veyralabs/skills 0.1.0 → 0.2.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/bin/cli.js +66 -41
- package/package.json +3 -3
- package/skills/webcloner/SKILL.md +565 -0
- package/skills/webcloner/references/animation-playbook.md +292 -0
- package/skills/webcloner/references/behavior-spec-format.md +259 -0
- package/skills/webcloner/references/component-detection.md +209 -0
- package/skills/webcloner/references/stack-presets.md +328 -0
- package/skills/webcloner/scripts/compare.mjs +87 -0
- package/skills/webcloner/scripts/download-assets.mjs +160 -0
- package/skills/webcloner/scripts/extract.py +344 -0
- package/validate.js +14 -4
- /package/skills/{brandaudit → naming-suite/brandaudit}/SKILL.md +0 -0
- /package/skills/{brandaudit → naming-suite/brandaudit}/references/audit-framework.md +0 -0
- /package/skills/{brandaudit → naming-suite/brandaudit}/references/examples/sample-audits.md +0 -0
- /package/skills/{brandaudit → naming-suite/brandaudit}/references/rebrand-decisions.md +0 -0
- /package/skills/{brandaudit → naming-suite/brandaudit}/references/weakness-patterns.md +0 -0
- /package/skills/{competitornames → naming-suite/competitornames}/SKILL.md +0 -0
- /package/skills/{competitornames → naming-suite/competitornames}/references/examples/sample-analyses.md +0 -0
- /package/skills/{competitornames → naming-suite/competitornames}/references/pattern-analysis.md +0 -0
- /package/skills/{competitornames → naming-suite/competitornames}/references/whitespace-mapping.md +0 -0
- /package/skills/{domainforge → naming-suite/domainforge}/SKILL.md +0 -0
- /package/skills/{domainforge → naming-suite/domainforge}/references/brand-archetypes.md +0 -0
- /package/skills/{domainforge → naming-suite/domainforge}/references/examples/sample-outputs.md +0 -0
- /package/skills/{domainforge → naming-suite/domainforge}/references/naming-patterns.md +0 -0
- /package/skills/{domainforge → naming-suite/domainforge}/references/scoring-rubric.md +0 -0
- /package/skills/{domainforge → naming-suite/domainforge}/references/tld-strategy.md +0 -0
- /package/skills/{namingguide → naming-suite/namingguide}/SKILL.md +0 -0
- /package/skills/{namingguide → naming-suite/namingguide}/references/examples/sample-guides.md +0 -0
- /package/skills/{namingguide → naming-suite/namingguide}/references/guide-structure.md +0 -0
package/bin/cli.js
CHANGED
|
@@ -7,22 +7,50 @@ const os = require('os');
|
|
|
7
7
|
|
|
8
8
|
const SKILLS_DIR = path.join(__dirname, '..', 'skills');
|
|
9
9
|
|
|
10
|
-
const PACKS = {
|
|
11
|
-
'naming-suite': ['domainforge', 'brandaudit', 'competitornames', 'namingguide'],
|
|
12
|
-
};
|
|
13
|
-
|
|
14
10
|
const AGENT_PATHS = {
|
|
15
|
-
claude: { local: '.claude/skills',
|
|
16
|
-
cursor: { local: '.cursor/skills',
|
|
17
|
-
windsurf: { local: '.windsurf/skills',
|
|
18
|
-
gemini: { local: '.gemini/skills',
|
|
19
|
-
copilot: { local: '.github/skills',
|
|
20
|
-
cline: { local: '.cline/skills',
|
|
21
|
-
goose: { local: '.goose/skills',
|
|
22
|
-
openhands: { local: '.openhands/skills',
|
|
23
|
-
roo: { local: '.roo/skills',
|
|
11
|
+
claude: { local: '.claude/skills', global: '.claude/skills' },
|
|
12
|
+
cursor: { local: '.cursor/skills', global: '.cursor/skills' },
|
|
13
|
+
windsurf: { local: '.windsurf/skills', global: '.codeium/windsurf/skills' },
|
|
14
|
+
gemini: { local: '.gemini/skills', global: '.gemini/skills' },
|
|
15
|
+
copilot: { local: '.github/skills', global: '.copilot/skills' },
|
|
16
|
+
cline: { local: '.cline/skills', global: '.cline/skills' },
|
|
17
|
+
goose: { local: '.goose/skills', global: '.config/goose/skills' },
|
|
18
|
+
openhands: { local: '.openhands/skills', global: '.openhands/skills' },
|
|
19
|
+
roo: { local: '.roo/skills', global: '.roo/skills' },
|
|
24
20
|
};
|
|
25
21
|
|
|
22
|
+
// Auto-discover skills and packs from filesystem.
|
|
23
|
+
// Standalone skill: skills/<name>/SKILL.md
|
|
24
|
+
// Pack: skills/<pack>/<name>/SKILL.md (no SKILL.md at pack level)
|
|
25
|
+
function discover() {
|
|
26
|
+
const skills = {}; // name → absolute path
|
|
27
|
+
const packs = {}; // packName → [skillName, ...]
|
|
28
|
+
|
|
29
|
+
if (!fs.existsSync(SKILLS_DIR)) return { skills, packs };
|
|
30
|
+
|
|
31
|
+
for (const entry of fs.readdirSync(SKILLS_DIR, { withFileTypes: true })) {
|
|
32
|
+
if (!entry.isDirectory()) continue;
|
|
33
|
+
const entryPath = path.join(SKILLS_DIR, entry.name);
|
|
34
|
+
|
|
35
|
+
if (fs.existsSync(path.join(entryPath, 'SKILL.md'))) {
|
|
36
|
+
skills[entry.name] = entryPath;
|
|
37
|
+
} else {
|
|
38
|
+
const packSkills = [];
|
|
39
|
+
for (const sub of fs.readdirSync(entryPath, { withFileTypes: true })) {
|
|
40
|
+
if (!sub.isDirectory()) continue;
|
|
41
|
+
const subPath = path.join(entryPath, sub.name);
|
|
42
|
+
if (fs.existsSync(path.join(subPath, 'SKILL.md'))) {
|
|
43
|
+
skills[sub.name] = subPath;
|
|
44
|
+
packSkills.push(sub.name);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (packSkills.length > 0) packs[entry.name] = packSkills;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return { skills, packs };
|
|
52
|
+
}
|
|
53
|
+
|
|
26
54
|
function detectAgent() {
|
|
27
55
|
const cwd = process.cwd();
|
|
28
56
|
for (const agent of Object.keys(AGENT_PATHS)) {
|
|
@@ -39,30 +67,16 @@ function resolveDestination(agent, isGlobal) {
|
|
|
39
67
|
process.exit(1);
|
|
40
68
|
}
|
|
41
69
|
const rel = isGlobal ? entry.global : entry.local;
|
|
42
|
-
return isGlobal
|
|
43
|
-
? path.join(os.homedir(), rel)
|
|
44
|
-
: path.join(process.cwd(), rel);
|
|
70
|
+
return isGlobal ? path.join(os.homedir(), rel) : path.join(process.cwd(), rel);
|
|
45
71
|
}
|
|
46
72
|
|
|
47
|
-
function copySkill(name, dest) {
|
|
48
|
-
const src = path.join(SKILLS_DIR, name);
|
|
49
|
-
if (!fs.existsSync(src)) {
|
|
50
|
-
console.error(`Skill not found: ${name}`);
|
|
51
|
-
console.error(`Available: ${availableSkills().join(', ')}`);
|
|
52
|
-
process.exit(1);
|
|
53
|
-
}
|
|
73
|
+
function copySkill(name, skillPath, dest) {
|
|
54
74
|
const target = path.join(dest, name);
|
|
55
75
|
fs.mkdirSync(dest, { recursive: true });
|
|
56
|
-
fs.cpSync(
|
|
76
|
+
fs.cpSync(skillPath, target, { recursive: true });
|
|
57
77
|
console.log(` ✓ ${name}`);
|
|
58
78
|
}
|
|
59
79
|
|
|
60
|
-
function availableSkills() {
|
|
61
|
-
return fs.readdirSync(SKILLS_DIR).filter(
|
|
62
|
-
f => fs.statSync(path.join(SKILLS_DIR, f)).isDirectory()
|
|
63
|
-
);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
80
|
function printHelp() {
|
|
67
81
|
console.log(`
|
|
68
82
|
Usage:
|
|
@@ -77,7 +91,7 @@ Options:
|
|
|
77
91
|
|
|
78
92
|
Examples:
|
|
79
93
|
npx @veyralabs/skills install naming-suite
|
|
80
|
-
npx @veyralabs/skills install
|
|
94
|
+
npx @veyralabs/skills install webcloner --global
|
|
81
95
|
npx @veyralabs/skills install domainforge --agent cursor
|
|
82
96
|
`);
|
|
83
97
|
}
|
|
@@ -98,13 +112,19 @@ if (!command || command === 'help' || command === '--help' || command === '-h')
|
|
|
98
112
|
process.exit(0);
|
|
99
113
|
}
|
|
100
114
|
|
|
115
|
+
const { skills, packs } = discover();
|
|
116
|
+
|
|
101
117
|
if (command === 'list') {
|
|
118
|
+
if (Object.keys(packs).length > 0) {
|
|
119
|
+
console.log('\nPacks:');
|
|
120
|
+
for (const [pack, members] of Object.entries(packs)) {
|
|
121
|
+
console.log(` ${pack} → ${members.join(', ')}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
102
124
|
console.log('\nSkills:');
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
console.log(` ${pack} → ${skills.join(', ')}`)
|
|
107
|
-
);
|
|
125
|
+
for (const name of Object.keys(skills).sort()) {
|
|
126
|
+
console.log(` ${name}`);
|
|
127
|
+
}
|
|
108
128
|
console.log();
|
|
109
129
|
process.exit(0);
|
|
110
130
|
}
|
|
@@ -116,16 +136,21 @@ if (command === 'install') {
|
|
|
116
136
|
let toInstall = [];
|
|
117
137
|
|
|
118
138
|
if (!target) {
|
|
119
|
-
toInstall =
|
|
120
|
-
} else if (
|
|
121
|
-
toInstall =
|
|
122
|
-
} else {
|
|
139
|
+
toInstall = Object.keys(skills);
|
|
140
|
+
} else if (packs[target]) {
|
|
141
|
+
toInstall = packs[target];
|
|
142
|
+
} else if (skills[target]) {
|
|
123
143
|
toInstall = [target];
|
|
144
|
+
} else {
|
|
145
|
+
console.error(`Not found: "${target}"`);
|
|
146
|
+
console.error(`Available skills: ${Object.keys(skills).join(', ')}`);
|
|
147
|
+
console.error(`Available packs: ${Object.keys(packs).join(', ')}`);
|
|
148
|
+
process.exit(1);
|
|
124
149
|
}
|
|
125
150
|
|
|
126
151
|
const scope = isGlobal ? 'global' : 'project';
|
|
127
152
|
console.log(`\nInstalling into ${dest} [${agent}/${scope}]\n`);
|
|
128
|
-
toInstall.forEach(
|
|
153
|
+
toInstall.forEach(name => copySkill(name, skills[name], dest));
|
|
129
154
|
console.log('\nDone. Restart your agent to activate skills.\n');
|
|
130
155
|
process.exit(0);
|
|
131
156
|
}
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@veyralabs/skills",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "VeyraSkills — A curated collection of Claude Code skills for founders, developers and AI builders",
|
|
5
5
|
"bin": {
|
|
6
|
-
"veyraskills": "
|
|
6
|
+
"veyraskills": "bin/cli.js"
|
|
7
7
|
},
|
|
8
8
|
"files": [
|
|
9
9
|
"bin/",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"license": "MIT",
|
|
36
36
|
"repository": {
|
|
37
37
|
"type": "git",
|
|
38
|
-
"url": "https://github.com/veyralabsgroup/veyraskills.git"
|
|
38
|
+
"url": "git+https://github.com/veyralabsgroup/veyraskills.git"
|
|
39
39
|
},
|
|
40
40
|
"bugs": {
|
|
41
41
|
"url": "https://github.com/veyralabsgroup/veyraskills/issues"
|