@veyralabs/skills 0.1.0 → 0.3.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 (36) hide show
  1. package/README.md +65 -101
  2. package/bin/cli.js +84 -40
  3. package/commands/brandaudit.md +3 -0
  4. package/commands/competitornames.md +3 -0
  5. package/commands/domainforge.md +3 -0
  6. package/commands/namingguide.md +3 -0
  7. package/commands/webcloner.md +5 -0
  8. package/install.sh +24 -1
  9. package/package.json +4 -3
  10. package/skills/webcloner/SKILL.md +565 -0
  11. package/skills/webcloner/references/animation-playbook.md +292 -0
  12. package/skills/webcloner/references/behavior-spec-format.md +259 -0
  13. package/skills/webcloner/references/component-detection.md +209 -0
  14. package/skills/webcloner/references/stack-presets.md +328 -0
  15. package/skills/webcloner/scripts/compare.mjs +87 -0
  16. package/skills/webcloner/scripts/download-assets.mjs +160 -0
  17. package/skills/webcloner/scripts/extract.py +344 -0
  18. package/validate.js +14 -4
  19. /package/skills/{brandaudit → naming-suite/brandaudit}/SKILL.md +0 -0
  20. /package/skills/{brandaudit → naming-suite/brandaudit}/references/audit-framework.md +0 -0
  21. /package/skills/{brandaudit → naming-suite/brandaudit}/references/examples/sample-audits.md +0 -0
  22. /package/skills/{brandaudit → naming-suite/brandaudit}/references/rebrand-decisions.md +0 -0
  23. /package/skills/{brandaudit → naming-suite/brandaudit}/references/weakness-patterns.md +0 -0
  24. /package/skills/{competitornames → naming-suite/competitornames}/SKILL.md +0 -0
  25. /package/skills/{competitornames → naming-suite/competitornames}/references/examples/sample-analyses.md +0 -0
  26. /package/skills/{competitornames → naming-suite/competitornames}/references/pattern-analysis.md +0 -0
  27. /package/skills/{competitornames → naming-suite/competitornames}/references/whitespace-mapping.md +0 -0
  28. /package/skills/{domainforge → naming-suite/domainforge}/SKILL.md +0 -0
  29. /package/skills/{domainforge → naming-suite/domainforge}/references/brand-archetypes.md +0 -0
  30. /package/skills/{domainforge → naming-suite/domainforge}/references/examples/sample-outputs.md +0 -0
  31. /package/skills/{domainforge → naming-suite/domainforge}/references/naming-patterns.md +0 -0
  32. /package/skills/{domainforge → naming-suite/domainforge}/references/scoring-rubric.md +0 -0
  33. /package/skills/{domainforge → naming-suite/domainforge}/references/tld-strategy.md +0 -0
  34. /package/skills/{namingguide → naming-suite/namingguide}/SKILL.md +0 -0
  35. /package/skills/{namingguide → naming-suite/namingguide}/references/examples/sample-guides.md +0 -0
  36. /package/skills/{namingguide → naming-suite/namingguide}/references/guide-structure.md +0 -0
package/README.md CHANGED
@@ -1,10 +1,13 @@
1
- # VeyraLabs Skills
1
+ # VeyraSkills
2
2
 
3
- [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE)
4
- [![Skills](https://img.shields.io/badge/skills-4_available-brightgreen)](#packs)
5
- [![Works with 30+ agents](https://img.shields.io/badge/works_with-30%2B_agents-blue)](#supported-agents)
3
+ Skills for Claude Code and other AI coding agents. Each skill is a plain text file that teaches your agent a specialized workflow — naming, branding, website cloning, and more.
6
4
 
7
- A curated collection of agent skills for founders, developers, and builders. Claude Code, Cursor, Windsurf, Gemini CLI, GitHub Copilot, and 30+ more.
5
+ ```bash
6
+ npx @veyralabs/skills install naming-suite
7
+ npx @veyralabs/skills install webcloner
8
+ ```
9
+
10
+ Or install everything at once:
8
11
 
9
12
  ```bash
10
13
  bash <(curl -fsSL https://raw.githubusercontent.com/veyralabsgroup/veyraskills/main/install.sh)
@@ -12,47 +15,52 @@ bash <(curl -fsSL https://raw.githubusercontent.com/veyralabsgroup/veyraskills/m
12
15
 
13
16
  ---
14
17
 
15
- ## Packs
18
+ ## Available Skills
16
19
 
17
- ### `naming-suite` — Brand & Naming Intelligence
20
+ ### naming-suite
18
21
 
19
- Four skills that work together. Find names, audit brands, map competitors, generate naming guides.
22
+ Four skills for naming products, auditing brands, mapping competitors, and building naming systems.
20
23
 
21
24
  | Skill | What it does |
22
25
  |-------|-------------|
23
- | [`domainforge`](./skills/domainforge/SKILL.md) | Generate and score startup names. Domain availability, social handles, trademark check, brand narrative |
24
- | [`brandaudit`](./skills/brandaudit/SKILL.md) | Audit an existing brand name across 8 dimensions. Severity scoring, rebrand verdict |
25
- | [`competitornames`](./skills/competitornames/SKILL.md) | Map the naming landscape in your market. Saturation levels, whitespace, naming brief for DomainForge |
26
- | [`namingguide`](./skills/namingguide/SKILL.md) | Generate a complete naming guide for a company or product line. Principles, system, dos/don'ts, approval checklist |
26
+ | [domainforge](./skills/naming-suite/domainforge/SKILL.md) | Generate startup name candidates. Scores each on 8 factors: memorability, distinctiveness, domain availability, trademark risk, pronunciation, spelling, brandability, market fit |
27
+ | [brandaudit](./skills/naming-suite/brandaudit/SKILL.md) | Audit an existing brand name. Returns severity scores across 8 dimensions and a rebrand verdict |
28
+ | [competitornames](./skills/naming-suite/competitornames/SKILL.md) | Map how competitors in a market are named. Identifies saturation, naming clusters, and open whitespace |
29
+ | [namingguide](./skills/naming-suite/namingguide/SKILL.md) | Build a naming system for a company or product line. Covers principles, naming patterns, approval criteria, and anti-patterns |
27
30
 
28
- **Recommended flow:**
31
+ Works best in sequence: run `competitornames` to understand the landscape, then `domainforge` to generate names that stand out from it.
29
32
 
30
- ```
31
- competitornames → domainforge
32
- brandaudit → namingguide
33
- ```
33
+ ### webcloner
34
+
35
+ Clone any landing page, marketing site, portfolio, or ecommerce storefront into a pixel-accurate Next.js replica.
36
+
37
+ | Skill | What it does |
38
+ |-------|-------------|
39
+ | [webcloner](./skills/webcloner/SKILL.md) | Six-phase visual cloning: recon with Scrapling, foundation setup, spec generation per section, parallel component build with git worktrees, assembly, and visual QA |
40
+
41
+ Includes three scripts: a Scrapling-based extractor (`extract.py`), an asset downloader with WebP conversion (`download-assets.mjs`), and a side-by-side screenshot comparison tool (`compare.mjs`).
34
42
 
35
- Run `competitornames` first to map the competitive landscape, then `domainforge` to generate names that stand out from it. Run `brandaudit` on an existing name, `namingguide` to lock in what works.
43
+ Works for landings, marketing sites, portfolios, and ecommerce product pages. Not designed for SaaS dashboards, auth flows, or real-time data apps.
36
44
 
37
45
  ---
38
46
 
39
- ## Installation
47
+ ## Install
40
48
 
41
- ### One-line
49
+ ### A specific pack or skill
42
50
 
43
51
  ```bash
44
- bash <(curl -fsSL https://raw.githubusercontent.com/veyralabsgroup/veyraskills/main/install.sh)
52
+ npx @veyralabs/skills install naming-suite
53
+ npx @veyralabs/skills install webcloner
54
+ npx @veyralabs/skills install domainforge
45
55
  ```
46
56
 
47
- Installs all available skills into your current project.
48
-
49
- ### Specific skill
57
+ ### All skills
50
58
 
51
59
  ```bash
52
- bash <(curl -fsSL https://raw.githubusercontent.com/veyralabsgroup/veyraskills/main/install.sh) --skill domainforge
60
+ bash <(curl -fsSL https://raw.githubusercontent.com/veyralabsgroup/veyraskills/main/install.sh)
53
61
  ```
54
62
 
55
- ### Global install (available across all projects)
63
+ ### Global (available across all projects)
56
64
 
57
65
  ```bash
58
66
  bash <(curl -fsSL https://raw.githubusercontent.com/veyralabsgroup/veyraskills/main/install.sh) --global
@@ -60,10 +68,10 @@ bash <(curl -fsSL https://raw.githubusercontent.com/veyralabsgroup/veyraskills/m
60
68
 
61
69
  ### Manual
62
70
 
63
- Copy the skill folder to your agent's skills directory and restart the agent.
71
+ Copy the skill folder into your agent's skills directory and restart the agent.
64
72
 
65
- | Agent | Project | Global |
66
- |-------|---------|--------|
73
+ | Agent | Project skills | Global skills |
74
+ |-------|---------------|--------------|
67
75
  | Claude Code | `.claude/skills/` | `~/.claude/skills/` |
68
76
  | Cursor | `.cursor/skills/` | `~/.cursor/skills/` |
69
77
  | Windsurf | `.windsurf/skills/` | `~/.codeium/windsurf/skills/` |
@@ -72,111 +80,67 @@ Copy the skill folder to your agent's skills directory and restart the agent.
72
80
 
73
81
  ---
74
82
 
75
- ## Usage
83
+ ## How it works
76
84
 
77
- Once installed, skills activate contextually no configuration needed.
85
+ Skills are Markdown files with a small YAML header. Claude Code reads them at startup and knows when to activate them based on what you type. No configuration, no plugins, no API keys.
78
86
 
79
- **DomainForge:**
80
87
  ```
81
- Find a domain for my new SaaS
82
- Name my CLI tool for environment variables
83
- What should I call this project?
88
+ Find a name for my new developer tool
84
89
  ```
85
90
 
86
- **BrandAudit:**
87
- ```
88
- Audit the brand name "Acme" for a B2B SaaS
89
- Is our brand name working? Company is called Vercel for analytics tools
90
- ```
91
-
92
- **CompetitorNames:**
93
- ```
94
- Map the naming landscape for developer config tools
95
- Who are my competitors and how are they named?
96
- ```
97
-
98
- **NamingGuide:**
99
- ```
100
- Create a naming guide for our company
101
- We're building a product line and need naming conventions
102
- Our feature naming is inconsistent — generate a guide
103
- ```
91
+ That's enough to activate `domainforge`. The skill takes over from there.
104
92
 
105
93
  ---
106
94
 
107
- ## Example Output DomainForge
108
-
109
- ```
110
- DomainForge Analysis — Developer Config Management
111
-
112
- Archetype: DevTool / Infrastructure
113
- Mode: Indie Hacker
95
+ ## Packs vs individual skills
114
96
 
115
- Top Recommendations
97
+ A pack is a folder of related skills that work together. Install a pack and you get all the skills inside it.
116
98
 
117
- 1. krev.dev — 93/100
118
- Hard consonant, 4 chars, terminal-native in lowercase.
119
- Zero overlap with Vault/dotenv cluster. Premium DevTool energy.
120
- Domain: krev.dev — available (~$12/yr Porkbun)
121
- Social: @krev — available on X, GitHub
122
- Trademark: Clean
99
+ ```bash
100
+ # Install the full naming-suite pack (4 skills)
101
+ npx @veyralabs/skills install naming-suite
123
102
 
124
- 2. onyx.sh 89/100
125
- Single hard word, immediate memorability, shell-adjacent TLD.
126
- Domain: onyx.sh — available (~$18/yr)
127
- Social: @onyxdev — available
128
- Trademark: Check in software category
103
+ # Install just one skill from the pack
104
+ npx @veyralabs/skills install domainforge
129
105
  ```
130
106
 
131
107
  ---
132
108
 
133
- ## Supported Agents
134
-
135
- | Agent | Supported |
136
- |-------|-----------|
137
- | Claude Code | ✅ |
138
- | Cursor | ✅ |
139
- | Windsurf | ✅ |
140
- | Gemini CLI | ✅ |
141
- | GitHub Copilot | ✅ |
142
- | Codex | ✅ |
143
- | Cline | ✅ |
144
- | Goose | ✅ |
145
- | OpenHands | ✅ |
146
- | Roo Code | ✅ |
147
-
148
- ---
149
-
150
- ## Roadmap
109
+ ## Coming soon
151
110
 
152
- **naming-suite** — stable, all 4 skills available now
153
-
154
- **brand-suite** *(coming soon)*
111
+ **brand-suite**
155
112
  - `brandvoice` — tone of voice guide generator
156
- - `brandpositioning` — positioning statement + competitive differentiation
113
+ - `brandpositioning` — positioning statement and competitive differentiation
157
114
  - `taglineforge` — tagline generation with scoring
158
115
 
159
- **gtm-suite** *(coming soon)*
116
+ **gtm-suite**
160
117
  - `icp` — Ideal Customer Profile builder
161
118
  - `pricingstrategy` — pricing model analysis
162
119
  - `gtmplan` — go-to-market plan generator
163
120
 
164
121
  ---
165
122
 
166
- ## Contributing
123
+ ## Individual packages
167
124
 
168
- See [CONTRIBUTING.md](./CONTRIBUTING.md) for guidelines on submitting new skills.
125
+ Each skill is also published as a standalone npm package if you only want one:
169
126
 
170
- Validate before opening a PR:
127
+ - `@veyralabs/naming-suite`
128
+ - `@veyralabs/webcloner`
129
+
130
+ ---
131
+
132
+ ## Contributing
133
+
134
+ Validate your skill before opening a PR:
171
135
 
172
136
  ```bash
173
137
  node validate.js
174
138
  ```
175
139
 
140
+ See [CONTRIBUTING.md](./CONTRIBUTING.md) for the full guide.
141
+
176
142
  ---
177
143
 
178
144
  ## License
179
145
 
180
- MIT use, fork, modify, distribute freely.
181
-
182
- Built by [VeyraLabs](https://veyralabs.com).
146
+ MIT. Built by [VeyraLabs](https://veyralabs.com).
package/bin/cli.js CHANGED
@@ -5,24 +5,53 @@ const fs = require('fs');
5
5
  const path = require('path');
6
6
  const os = require('os');
7
7
 
8
- const SKILLS_DIR = path.join(__dirname, '..', 'skills');
9
-
10
- const PACKS = {
11
- 'naming-suite': ['domainforge', 'brandaudit', 'competitornames', 'namingguide'],
12
- };
8
+ const SKILLS_DIR = path.join(__dirname, '..', 'skills');
9
+ const COMMANDS_DIR = path.join(__dirname, '..', 'commands');
13
10
 
14
11
  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' },
12
+ claude: { local: '.claude/skills', global: '.claude/skills' },
13
+ cursor: { local: '.cursor/skills', global: '.cursor/skills' },
14
+ windsurf: { local: '.windsurf/skills', global: '.codeium/windsurf/skills' },
15
+ gemini: { local: '.gemini/skills', global: '.gemini/skills' },
16
+ copilot: { local: '.github/skills', global: '.copilot/skills' },
17
+ cline: { local: '.cline/skills', global: '.cline/skills' },
18
+ goose: { local: '.goose/skills', global: '.config/goose/skills' },
19
+ openhands: { local: '.openhands/skills', global: '.openhands/skills' },
20
+ roo: { local: '.roo/skills', global: '.roo/skills' },
24
21
  };
25
22
 
23
+ // Auto-discover skills and packs from filesystem.
24
+ // Standalone skill: skills/<name>/SKILL.md
25
+ // Pack: skills/<pack>/<name>/SKILL.md (no SKILL.md at pack level)
26
+ function discover() {
27
+ const skills = {}; // name → absolute path
28
+ const packs = {}; // packName → [skillName, ...]
29
+
30
+ if (!fs.existsSync(SKILLS_DIR)) return { skills, packs };
31
+
32
+ for (const entry of fs.readdirSync(SKILLS_DIR, { withFileTypes: true })) {
33
+ if (!entry.isDirectory()) continue;
34
+ const entryPath = path.join(SKILLS_DIR, entry.name);
35
+
36
+ if (fs.existsSync(path.join(entryPath, 'SKILL.md'))) {
37
+ skills[entry.name] = entryPath;
38
+ } else {
39
+ const packSkills = [];
40
+ for (const sub of fs.readdirSync(entryPath, { withFileTypes: true })) {
41
+ if (!sub.isDirectory()) continue;
42
+ const subPath = path.join(entryPath, sub.name);
43
+ if (fs.existsSync(path.join(subPath, 'SKILL.md'))) {
44
+ skills[sub.name] = subPath;
45
+ packSkills.push(sub.name);
46
+ }
47
+ }
48
+ if (packSkills.length > 0) packs[entry.name] = packSkills;
49
+ }
50
+ }
51
+
52
+ return { skills, packs };
53
+ }
54
+
26
55
  function detectAgent() {
27
56
  const cwd = process.cwd();
28
57
  for (const agent of Object.keys(AGENT_PATHS)) {
@@ -39,28 +68,31 @@ function resolveDestination(agent, isGlobal) {
39
68
  process.exit(1);
40
69
  }
41
70
  const rel = isGlobal ? entry.global : entry.local;
42
- return isGlobal
43
- ? path.join(os.homedir(), rel)
44
- : path.join(process.cwd(), rel);
71
+ return isGlobal ? path.join(os.homedir(), rel) : path.join(process.cwd(), rel);
45
72
  }
46
73
 
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
- }
74
+ function copySkill(name, skillPath, dest) {
54
75
  const target = path.join(dest, name);
55
76
  fs.mkdirSync(dest, { recursive: true });
56
- fs.cpSync(src, target, { recursive: true });
77
+ fs.cpSync(skillPath, target, { recursive: true });
57
78
  console.log(` ✓ ${name}`);
58
79
  }
59
80
 
60
- function availableSkills() {
61
- return fs.readdirSync(SKILLS_DIR).filter(
62
- f => fs.statSync(path.join(SKILLS_DIR, f)).isDirectory()
63
- );
81
+ // Copy slash commands — Claude Code only (.claude/commands/)
82
+ function copyCommands(agent, isGlobal) {
83
+ if (agent !== 'claude') return;
84
+ if (!fs.existsSync(COMMANDS_DIR)) return;
85
+
86
+ const cmdDest = isGlobal
87
+ ? path.join(os.homedir(), '.claude', 'commands')
88
+ : path.join(process.cwd(), '.claude', 'commands');
89
+
90
+ fs.mkdirSync(cmdDest, { recursive: true });
91
+ for (const f of fs.readdirSync(COMMANDS_DIR)) {
92
+ if (!f.endsWith('.md')) continue;
93
+ fs.copyFileSync(path.join(COMMANDS_DIR, f), path.join(cmdDest, f));
94
+ }
95
+ console.log(` ✓ slash commands → ${cmdDest}`);
64
96
  }
65
97
 
66
98
  function printHelp() {
@@ -77,7 +109,7 @@ Options:
77
109
 
78
110
  Examples:
79
111
  npx @veyralabs/skills install naming-suite
80
- npx @veyralabs/skills install domainforge --global
112
+ npx @veyralabs/skills install webcloner --global
81
113
  npx @veyralabs/skills install domainforge --agent cursor
82
114
  `);
83
115
  }
@@ -98,13 +130,19 @@ if (!command || command === 'help' || command === '--help' || command === '-h')
98
130
  process.exit(0);
99
131
  }
100
132
 
133
+ const { skills, packs } = discover();
134
+
101
135
  if (command === 'list') {
136
+ if (Object.keys(packs).length > 0) {
137
+ console.log('\nPacks:');
138
+ for (const [pack, members] of Object.entries(packs)) {
139
+ console.log(` ${pack} → ${members.join(', ')}`);
140
+ }
141
+ }
102
142
  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
- );
143
+ for (const name of Object.keys(skills).sort()) {
144
+ console.log(` ${name}`);
145
+ }
108
146
  console.log();
109
147
  process.exit(0);
110
148
  }
@@ -116,16 +154,22 @@ if (command === 'install') {
116
154
  let toInstall = [];
117
155
 
118
156
  if (!target) {
119
- toInstall = availableSkills();
120
- } else if (PACKS[target]) {
121
- toInstall = PACKS[target];
122
- } else {
157
+ toInstall = Object.keys(skills);
158
+ } else if (packs[target]) {
159
+ toInstall = packs[target];
160
+ } else if (skills[target]) {
123
161
  toInstall = [target];
162
+ } else {
163
+ console.error(`Not found: "${target}"`);
164
+ console.error(`Available skills: ${Object.keys(skills).join(', ')}`);
165
+ console.error(`Available packs: ${Object.keys(packs).join(', ')}`);
166
+ process.exit(1);
124
167
  }
125
168
 
126
169
  const scope = isGlobal ? 'global' : 'project';
127
170
  console.log(`\nInstalling into ${dest} [${agent}/${scope}]\n`);
128
- toInstall.forEach(s => copySkill(s, dest));
171
+ toInstall.forEach(name => copySkill(name, skills[name], dest));
172
+ copyCommands(agent, isGlobal);
129
173
  console.log('\nDone. Restart your agent to activate skills.\n');
130
174
  process.exit(0);
131
175
  }
@@ -0,0 +1,3 @@
1
+ Audit this brand name: $ARGUMENTS
2
+
3
+ Use the brandaudit skill. Analyze across 8 dimensions, assign severity scores to each issue, and return a verdict: keep, refine, or rebrand. Include what is working, what is not, and the recommended path forward.
@@ -0,0 +1,3 @@
1
+ Map the naming landscape for: $ARGUMENTS
2
+
3
+ Use the competitornames skill. Identify naming clusters, saturation levels, and open whitespace in this market. Output a competitive naming brief ready to feed into domainforge.
@@ -0,0 +1,3 @@
1
+ Generate startup name candidates for: $ARGUMENTS
2
+
3
+ Use the domainforge skill. Score each candidate on 8 factors: memorability, distinctiveness, domain availability, trademark risk, pronunciation, spelling, brandability, market fit. Check domain availability and social handles. Return a ranked list with scores and a one-line brand narrative per name.
@@ -0,0 +1,3 @@
1
+ Build a naming guide for: $ARGUMENTS
2
+
3
+ Use the namingguide skill. Define naming principles, approved patterns, anti-patterns, real examples, and an approval checklist. Output a complete naming system the team can follow.
@@ -0,0 +1,5 @@
1
+ Clone this website: $ARGUMENTS
2
+
3
+ Use the webcloner skill. Start with the recon phase: run extract.py against the URL to get the full site manifest (DOM structure, computed CSS, assets, animation libraries, tech stack). Do not write any component code until the recon summary is reviewed.
4
+
5
+ If the target is out of scope (SaaS dashboard, auth flow, real-time data), say so before starting.
package/install.sh CHANGED
@@ -140,6 +140,28 @@ install_skill() {
140
140
  rm -rf "$tmp"
141
141
  }
142
142
 
143
+ install_commands() {
144
+ local agent="$1"
145
+ local is_global="$2"
146
+ local tmp="$3"
147
+
148
+ # Slash commands are only supported by Claude Code
149
+ [[ "$agent" != "claude" ]] && return
150
+
151
+ local cmd_dir
152
+ if [[ "$is_global" == "true" ]]; then
153
+ cmd_dir="$HOME/.claude/commands"
154
+ else
155
+ cmd_dir=".claude/commands"
156
+ fi
157
+
158
+ if [[ -d "$tmp/commands" ]]; then
159
+ mkdir -p "$cmd_dir"
160
+ cp "$tmp/commands/"*.md "$cmd_dir/" 2>/dev/null || true
161
+ echo " Slash commands → ${cmd_dir}/"
162
+ fi
163
+ }
164
+
143
165
  install_all() {
144
166
  local dest_dir="$1"
145
167
  local tmp
@@ -150,7 +172,7 @@ install_all() {
150
172
 
151
173
  echo " Cloning veyralabsgroup/veyraskills..."
152
174
  git clone --depth=1 --filter=blob:none --sparse "$GITHUB" "$tmp" -q
153
- (cd "$tmp" && git sparse-checkout set "skills")
175
+ (cd "$tmp" && git sparse-checkout set "skills" "commands")
154
176
 
155
177
  if [[ ! -d "$tmp/skills" ]]; then
156
178
  echo " Error: could not retrieve skills from repository."
@@ -159,6 +181,7 @@ install_all() {
159
181
 
160
182
  mkdir -p "$dest_dir"
161
183
  cp -r "$tmp/skills/." "$dest_dir/"
184
+ install_commands "$AGENT" "$GLOBAL" "$tmp"
162
185
 
163
186
  trap - EXIT
164
187
  rm -rf "$tmp"
package/package.json CHANGED
@@ -1,13 +1,14 @@
1
1
  {
2
2
  "name": "@veyralabs/skills",
3
- "version": "0.1.0",
3
+ "version": "0.3.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/",
10
10
  "skills/",
11
+ "commands/",
11
12
  "install.sh",
12
13
  "validate.js"
13
14
  ],
@@ -35,7 +36,7 @@
35
36
  "license": "MIT",
36
37
  "repository": {
37
38
  "type": "git",
38
- "url": "https://github.com/veyralabsgroup/veyraskills.git"
39
+ "url": "git+https://github.com/veyralabsgroup/veyraskills.git"
39
40
  },
40
41
  "bugs": {
41
42
  "url": "https://github.com/veyralabsgroup/veyraskills/issues"