@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.
Files changed (29) hide show
  1. package/bin/cli.js +66 -41
  2. package/package.json +3 -3
  3. package/skills/webcloner/SKILL.md +565 -0
  4. package/skills/webcloner/references/animation-playbook.md +292 -0
  5. package/skills/webcloner/references/behavior-spec-format.md +259 -0
  6. package/skills/webcloner/references/component-detection.md +209 -0
  7. package/skills/webcloner/references/stack-presets.md +328 -0
  8. package/skills/webcloner/scripts/compare.mjs +87 -0
  9. package/skills/webcloner/scripts/download-assets.mjs +160 -0
  10. package/skills/webcloner/scripts/extract.py +344 -0
  11. package/validate.js +14 -4
  12. /package/skills/{brandaudit → naming-suite/brandaudit}/SKILL.md +0 -0
  13. /package/skills/{brandaudit → naming-suite/brandaudit}/references/audit-framework.md +0 -0
  14. /package/skills/{brandaudit → naming-suite/brandaudit}/references/examples/sample-audits.md +0 -0
  15. /package/skills/{brandaudit → naming-suite/brandaudit}/references/rebrand-decisions.md +0 -0
  16. /package/skills/{brandaudit → naming-suite/brandaudit}/references/weakness-patterns.md +0 -0
  17. /package/skills/{competitornames → naming-suite/competitornames}/SKILL.md +0 -0
  18. /package/skills/{competitornames → naming-suite/competitornames}/references/examples/sample-analyses.md +0 -0
  19. /package/skills/{competitornames → naming-suite/competitornames}/references/pattern-analysis.md +0 -0
  20. /package/skills/{competitornames → naming-suite/competitornames}/references/whitespace-mapping.md +0 -0
  21. /package/skills/{domainforge → naming-suite/domainforge}/SKILL.md +0 -0
  22. /package/skills/{domainforge → naming-suite/domainforge}/references/brand-archetypes.md +0 -0
  23. /package/skills/{domainforge → naming-suite/domainforge}/references/examples/sample-outputs.md +0 -0
  24. /package/skills/{domainforge → naming-suite/domainforge}/references/naming-patterns.md +0 -0
  25. /package/skills/{domainforge → naming-suite/domainforge}/references/scoring-rubric.md +0 -0
  26. /package/skills/{domainforge → naming-suite/domainforge}/references/tld-strategy.md +0 -0
  27. /package/skills/{namingguide → naming-suite/namingguide}/SKILL.md +0 -0
  28. /package/skills/{namingguide → naming-suite/namingguide}/references/examples/sample-guides.md +0 -0
  29. /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', global: '.claude/skills' },
16
- cursor: { local: '.cursor/skills', global: '.cursor/skills' },
17
- windsurf: { local: '.windsurf/skills', global: '.codeium/windsurf/skills' },
18
- gemini: { local: '.gemini/skills', global: '.gemini/skills' },
19
- copilot: { local: '.github/skills', global: '.copilot/skills' },
20
- cline: { local: '.cline/skills', global: '.cline/skills' },
21
- goose: { local: '.goose/skills', global: '.config/goose/skills' },
22
- openhands: { local: '.openhands/skills', global: '.openhands/skills' },
23
- roo: { local: '.roo/skills', global: '.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(src, target, { recursive: true });
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 domainforge --global
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
- availableSkills().forEach(s => console.log(` ${s}`));
104
- console.log('\nPacks:');
105
- Object.entries(PACKS).forEach(([pack, skills]) =>
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 = availableSkills();
120
- } else if (PACKS[target]) {
121
- toInstall = PACKS[target];
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(s => copySkill(s, dest));
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.1.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": "./bin/cli.js"
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"