@veyralabs/skills 0.1.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/LICENSE +21 -0
- package/README.md +182 -0
- package/bin/cli.js +135 -0
- package/install.sh +226 -0
- package/package.json +47 -0
- package/skills/brandaudit/SKILL.md +278 -0
- package/skills/brandaudit/references/audit-framework.md +156 -0
- package/skills/brandaudit/references/examples/sample-audits.md +239 -0
- package/skills/brandaudit/references/rebrand-decisions.md +215 -0
- package/skills/brandaudit/references/weakness-patterns.md +187 -0
- package/skills/competitornames/SKILL.md +250 -0
- package/skills/competitornames/references/examples/sample-analyses.md +185 -0
- package/skills/competitornames/references/pattern-analysis.md +94 -0
- package/skills/competitornames/references/whitespace-mapping.md +146 -0
- package/skills/domainforge/SKILL.md +266 -0
- package/skills/domainforge/references/brand-archetypes.md +147 -0
- package/skills/domainforge/references/examples/sample-outputs.md +141 -0
- package/skills/domainforge/references/naming-patterns.md +168 -0
- package/skills/domainforge/references/scoring-rubric.md +168 -0
- package/skills/domainforge/references/tld-strategy.md +112 -0
- package/skills/namingguide/SKILL.md +264 -0
- package/skills/namingguide/references/examples/sample-guides.md +212 -0
- package/skills/namingguide/references/guide-structure.md +155 -0
- package/validate.js +142 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 VeyraLabs
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
# VeyraLabs Skills
|
|
2
|
+
|
|
3
|
+
[](./LICENSE)
|
|
4
|
+
[](#packs)
|
|
5
|
+
[](#supported-agents)
|
|
6
|
+
|
|
7
|
+
A curated collection of agent skills for founders, developers, and builders. Claude Code, Cursor, Windsurf, Gemini CLI, GitHub Copilot, and 30+ more.
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
bash <(curl -fsSL https://raw.githubusercontent.com/veyralabsgroup/veyraskills/main/install.sh)
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Packs
|
|
16
|
+
|
|
17
|
+
### `naming-suite` — Brand & Naming Intelligence
|
|
18
|
+
|
|
19
|
+
Four skills that work together. Find names, audit brands, map competitors, generate naming guides.
|
|
20
|
+
|
|
21
|
+
| Skill | What it does |
|
|
22
|
+
|-------|-------------|
|
|
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 |
|
|
27
|
+
|
|
28
|
+
**Recommended flow:**
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
competitornames → domainforge
|
|
32
|
+
brandaudit → namingguide
|
|
33
|
+
```
|
|
34
|
+
|
|
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.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Installation
|
|
40
|
+
|
|
41
|
+
### One-line
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
bash <(curl -fsSL https://raw.githubusercontent.com/veyralabsgroup/veyraskills/main/install.sh)
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Installs all available skills into your current project.
|
|
48
|
+
|
|
49
|
+
### Specific skill
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
bash <(curl -fsSL https://raw.githubusercontent.com/veyralabsgroup/veyraskills/main/install.sh) --skill domainforge
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Global install (available across all projects)
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
bash <(curl -fsSL https://raw.githubusercontent.com/veyralabsgroup/veyraskills/main/install.sh) --global
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Manual
|
|
62
|
+
|
|
63
|
+
Copy the skill folder to your agent's skills directory and restart the agent.
|
|
64
|
+
|
|
65
|
+
| Agent | Project | Global |
|
|
66
|
+
|-------|---------|--------|
|
|
67
|
+
| Claude Code | `.claude/skills/` | `~/.claude/skills/` |
|
|
68
|
+
| Cursor | `.cursor/skills/` | `~/.cursor/skills/` |
|
|
69
|
+
| Windsurf | `.windsurf/skills/` | `~/.codeium/windsurf/skills/` |
|
|
70
|
+
| Gemini CLI | `.gemini/skills/` | `~/.gemini/skills/` |
|
|
71
|
+
| GitHub Copilot | `.github/skills/` | `~/.copilot/skills/` |
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Usage
|
|
76
|
+
|
|
77
|
+
Once installed, skills activate contextually — no configuration needed.
|
|
78
|
+
|
|
79
|
+
**DomainForge:**
|
|
80
|
+
```
|
|
81
|
+
Find a domain for my new SaaS
|
|
82
|
+
Name my CLI tool for environment variables
|
|
83
|
+
What should I call this project?
|
|
84
|
+
```
|
|
85
|
+
|
|
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
|
+
```
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## Example Output — DomainForge
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
DomainForge Analysis — Developer Config Management
|
|
111
|
+
|
|
112
|
+
Archetype: DevTool / Infrastructure
|
|
113
|
+
Mode: Indie Hacker
|
|
114
|
+
|
|
115
|
+
Top Recommendations
|
|
116
|
+
|
|
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
|
|
123
|
+
|
|
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
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
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
|
|
151
|
+
|
|
152
|
+
**naming-suite** — stable, all 4 skills available now
|
|
153
|
+
|
|
154
|
+
**brand-suite** *(coming soon)*
|
|
155
|
+
- `brandvoice` — tone of voice guide generator
|
|
156
|
+
- `brandpositioning` — positioning statement + competitive differentiation
|
|
157
|
+
- `taglineforge` — tagline generation with scoring
|
|
158
|
+
|
|
159
|
+
**gtm-suite** *(coming soon)*
|
|
160
|
+
- `icp` — Ideal Customer Profile builder
|
|
161
|
+
- `pricingstrategy` — pricing model analysis
|
|
162
|
+
- `gtmplan` — go-to-market plan generator
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## Contributing
|
|
167
|
+
|
|
168
|
+
See [CONTRIBUTING.md](./CONTRIBUTING.md) for guidelines on submitting new skills.
|
|
169
|
+
|
|
170
|
+
Validate before opening a PR:
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
node validate.js
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## License
|
|
179
|
+
|
|
180
|
+
MIT — use, fork, modify, distribute freely.
|
|
181
|
+
|
|
182
|
+
Built by [VeyraLabs](https://veyralabs.com).
|
package/bin/cli.js
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
const fs = require('fs');
|
|
5
|
+
const path = require('path');
|
|
6
|
+
const os = require('os');
|
|
7
|
+
|
|
8
|
+
const SKILLS_DIR = path.join(__dirname, '..', 'skills');
|
|
9
|
+
|
|
10
|
+
const PACKS = {
|
|
11
|
+
'naming-suite': ['domainforge', 'brandaudit', 'competitornames', 'namingguide'],
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
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' },
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
function detectAgent() {
|
|
27
|
+
const cwd = process.cwd();
|
|
28
|
+
for (const agent of Object.keys(AGENT_PATHS)) {
|
|
29
|
+
const dir = agent === 'copilot' ? '.github' : `.${agent}`;
|
|
30
|
+
if (fs.existsSync(path.join(cwd, dir))) return agent;
|
|
31
|
+
}
|
|
32
|
+
return 'claude';
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function resolveDestination(agent, isGlobal) {
|
|
36
|
+
const entry = AGENT_PATHS[agent];
|
|
37
|
+
if (!entry) {
|
|
38
|
+
console.error(`Unknown agent: ${agent}. Options: ${Object.keys(AGENT_PATHS).join(', ')}`);
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
const rel = isGlobal ? entry.global : entry.local;
|
|
42
|
+
return isGlobal
|
|
43
|
+
? path.join(os.homedir(), rel)
|
|
44
|
+
: path.join(process.cwd(), rel);
|
|
45
|
+
}
|
|
46
|
+
|
|
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
|
+
}
|
|
54
|
+
const target = path.join(dest, name);
|
|
55
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
56
|
+
fs.cpSync(src, target, { recursive: true });
|
|
57
|
+
console.log(` ✓ ${name}`);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function availableSkills() {
|
|
61
|
+
return fs.readdirSync(SKILLS_DIR).filter(
|
|
62
|
+
f => fs.statSync(path.join(SKILLS_DIR, f)).isDirectory()
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function printHelp() {
|
|
67
|
+
console.log(`
|
|
68
|
+
Usage:
|
|
69
|
+
npx @veyralabs/skills install Install all skills
|
|
70
|
+
npx @veyralabs/skills install <skill|pack> Install a skill or pack
|
|
71
|
+
npx @veyralabs/skills list List available skills and packs
|
|
72
|
+
|
|
73
|
+
Options:
|
|
74
|
+
--global Install globally (all projects)
|
|
75
|
+
--agent <name> Target agent (auto-detected if omitted)
|
|
76
|
+
Options: ${Object.keys(AGENT_PATHS).join(', ')}
|
|
77
|
+
|
|
78
|
+
Examples:
|
|
79
|
+
npx @veyralabs/skills install naming-suite
|
|
80
|
+
npx @veyralabs/skills install domainforge --global
|
|
81
|
+
npx @veyralabs/skills install domainforge --agent cursor
|
|
82
|
+
`);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// --- Parse args ---
|
|
86
|
+
|
|
87
|
+
const rawArgs = process.argv.slice(2);
|
|
88
|
+
const command = rawArgs[0];
|
|
89
|
+
const target = rawArgs[1] && !rawArgs[1].startsWith('--') ? rawArgs[1] : undefined;
|
|
90
|
+
const isGlobal = rawArgs.includes('--global');
|
|
91
|
+
const agentIdx = rawArgs.indexOf('--agent');
|
|
92
|
+
const agentArg = agentIdx !== -1 ? rawArgs[agentIdx + 1] : null;
|
|
93
|
+
|
|
94
|
+
// --- Commands ---
|
|
95
|
+
|
|
96
|
+
if (!command || command === 'help' || command === '--help' || command === '-h') {
|
|
97
|
+
printHelp();
|
|
98
|
+
process.exit(0);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (command === 'list') {
|
|
102
|
+
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
|
+
);
|
|
108
|
+
console.log();
|
|
109
|
+
process.exit(0);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (command === 'install') {
|
|
113
|
+
const agent = agentArg || detectAgent();
|
|
114
|
+
const dest = resolveDestination(agent, isGlobal);
|
|
115
|
+
|
|
116
|
+
let toInstall = [];
|
|
117
|
+
|
|
118
|
+
if (!target) {
|
|
119
|
+
toInstall = availableSkills();
|
|
120
|
+
} else if (PACKS[target]) {
|
|
121
|
+
toInstall = PACKS[target];
|
|
122
|
+
} else {
|
|
123
|
+
toInstall = [target];
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const scope = isGlobal ? 'global' : 'project';
|
|
127
|
+
console.log(`\nInstalling into ${dest} [${agent}/${scope}]\n`);
|
|
128
|
+
toInstall.forEach(s => copySkill(s, dest));
|
|
129
|
+
console.log('\nDone. Restart your agent to activate skills.\n');
|
|
130
|
+
process.exit(0);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
console.error(`Unknown command: ${command}`);
|
|
134
|
+
printHelp();
|
|
135
|
+
process.exit(1);
|
package/install.sh
ADDED
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# VeyraLabs Skills installer
|
|
3
|
+
# https://github.com/veyralabsgroup/veyraskills
|
|
4
|
+
|
|
5
|
+
set -euo pipefail
|
|
6
|
+
|
|
7
|
+
REPO="veyralabsgroup/veyraskills"
|
|
8
|
+
GITHUB="https://github.com/${REPO}.git"
|
|
9
|
+
|
|
10
|
+
SKILL_NAME=""
|
|
11
|
+
GLOBAL=false
|
|
12
|
+
AGENT=""
|
|
13
|
+
LIST_ONLY=false
|
|
14
|
+
|
|
15
|
+
# ── argument parsing ─────────────────────────────────────────────────────────
|
|
16
|
+
|
|
17
|
+
usage() {
|
|
18
|
+
cat <<EOF
|
|
19
|
+
VeyraLabs Skills — installer
|
|
20
|
+
|
|
21
|
+
Usage:
|
|
22
|
+
bash install.sh [options]
|
|
23
|
+
|
|
24
|
+
Options:
|
|
25
|
+
--skill <name> Install a specific skill (default: all)
|
|
26
|
+
--global Install globally instead of project-local
|
|
27
|
+
--agent <name> Target agent (auto-detected if omitted)
|
|
28
|
+
--list List available skills
|
|
29
|
+
-h, --help Show this help
|
|
30
|
+
|
|
31
|
+
Supported agents:
|
|
32
|
+
claude, cursor, windsurf, gemini, copilot, cline, goose, openhands, roo
|
|
33
|
+
|
|
34
|
+
Examples:
|
|
35
|
+
# Auto-detect agent, install all skills to current project
|
|
36
|
+
bash install.sh
|
|
37
|
+
|
|
38
|
+
# Install domainforge globally for Claude Code
|
|
39
|
+
bash install.sh --skill domainforge --global --agent claude
|
|
40
|
+
|
|
41
|
+
# List available skills
|
|
42
|
+
bash install.sh --list
|
|
43
|
+
EOF
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
while [[ $# -gt 0 ]]; do
|
|
47
|
+
case "$1" in
|
|
48
|
+
--skill) SKILL_NAME="$2"; shift 2 ;;
|
|
49
|
+
--global) GLOBAL=true; shift ;;
|
|
50
|
+
--agent) AGENT="$2"; shift 2 ;;
|
|
51
|
+
--list) LIST_ONLY=true; shift ;;
|
|
52
|
+
-h|--help) usage; exit 0 ;;
|
|
53
|
+
*) echo "Unknown option: $1"; usage; exit 1 ;;
|
|
54
|
+
esac
|
|
55
|
+
done
|
|
56
|
+
|
|
57
|
+
# ── agent detection ──────────────────────────────────────────────────────────
|
|
58
|
+
|
|
59
|
+
detect_agent() {
|
|
60
|
+
[[ -f ".claude/settings.json" ]] || [[ -d ".claude" ]] && echo "claude" && return
|
|
61
|
+
[[ -d ".cursor" ]] && echo "cursor" && return
|
|
62
|
+
[[ -d ".windsurf" ]] && echo "windsurf" && return
|
|
63
|
+
[[ -d ".gemini" ]] && echo "gemini" && return
|
|
64
|
+
[[ -d ".github/copilot" ]] && echo "copilot" && return
|
|
65
|
+
[[ -d ".cline" ]] && echo "cline" && return
|
|
66
|
+
[[ -d ".goose" ]] && echo "goose" && return
|
|
67
|
+
[[ -d ".openhands" ]] && echo "openhands"&& return
|
|
68
|
+
[[ -d ".roo" ]] && echo "roo" && return
|
|
69
|
+
echo ""
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
skills_dir() {
|
|
73
|
+
local agent="$1"
|
|
74
|
+
|
|
75
|
+
if [[ "$GLOBAL" == "true" ]]; then
|
|
76
|
+
case "$agent" in
|
|
77
|
+
claude) echo "$HOME/.claude/skills" ;;
|
|
78
|
+
cursor) echo "$HOME/.cursor/skills" ;;
|
|
79
|
+
windsurf) echo "$HOME/.codeium/windsurf/skills" ;;
|
|
80
|
+
gemini) echo "$HOME/.gemini/skills" ;;
|
|
81
|
+
copilot) echo "$HOME/.copilot/skills" ;;
|
|
82
|
+
cline) echo "$HOME/.cline/skills" ;;
|
|
83
|
+
goose) echo "$HOME/.config/goose/skills" ;;
|
|
84
|
+
openhands) echo "$HOME/.openhands/skills" ;;
|
|
85
|
+
roo) echo "$HOME/.roo/skills" ;;
|
|
86
|
+
*) echo "$HOME/.skills" ;;
|
|
87
|
+
esac
|
|
88
|
+
else
|
|
89
|
+
case "$agent" in
|
|
90
|
+
claude) echo ".claude/skills" ;;
|
|
91
|
+
cursor) echo ".cursor/skills" ;;
|
|
92
|
+
windsurf) echo ".windsurf/skills" ;;
|
|
93
|
+
gemini) echo ".gemini/skills" ;;
|
|
94
|
+
copilot) echo ".github/skills" ;;
|
|
95
|
+
cline) echo ".cline/skills" ;;
|
|
96
|
+
goose) echo ".goose/skills" ;;
|
|
97
|
+
openhands) echo ".openhands/skills";;
|
|
98
|
+
roo) echo ".roo/skills" ;;
|
|
99
|
+
*) echo ".skills" ;;
|
|
100
|
+
esac
|
|
101
|
+
fi
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
# ── install logic ────────────────────────────────────────────────────────────
|
|
105
|
+
|
|
106
|
+
check_deps() {
|
|
107
|
+
local missing=()
|
|
108
|
+
command -v git &>/dev/null || missing+=("git")
|
|
109
|
+
|
|
110
|
+
if [[ ${#missing[@]} -gt 0 ]]; then
|
|
111
|
+
echo "Error: required tools missing: ${missing[*]}"
|
|
112
|
+
echo "Install git and try again."
|
|
113
|
+
exit 1
|
|
114
|
+
fi
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
install_skill() {
|
|
118
|
+
local skill="$1"
|
|
119
|
+
local dest_dir="$2"
|
|
120
|
+
local tmp
|
|
121
|
+
|
|
122
|
+
tmp=$(mktemp -d)
|
|
123
|
+
# shellcheck disable=SC2064
|
|
124
|
+
trap "rm -rf '$tmp'" EXIT
|
|
125
|
+
|
|
126
|
+
echo " Cloning veyralabsgroup/veyraskills..."
|
|
127
|
+
git clone --depth=1 --filter=blob:none --sparse "$GITHUB" "$tmp" -q
|
|
128
|
+
|
|
129
|
+
(cd "$tmp" && git sparse-checkout set "skills/${skill}")
|
|
130
|
+
|
|
131
|
+
if [[ ! -d "$tmp/skills/${skill}" ]]; then
|
|
132
|
+
echo " Error: skill '${skill}' not found in the repository."
|
|
133
|
+
exit 1
|
|
134
|
+
fi
|
|
135
|
+
|
|
136
|
+
mkdir -p "$dest_dir"
|
|
137
|
+
cp -r "$tmp/skills/${skill}" "$dest_dir/"
|
|
138
|
+
|
|
139
|
+
trap - EXIT
|
|
140
|
+
rm -rf "$tmp"
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
install_all() {
|
|
144
|
+
local dest_dir="$1"
|
|
145
|
+
local tmp
|
|
146
|
+
|
|
147
|
+
tmp=$(mktemp -d)
|
|
148
|
+
# shellcheck disable=SC2064
|
|
149
|
+
trap "rm -rf '$tmp'" EXIT
|
|
150
|
+
|
|
151
|
+
echo " Cloning veyralabsgroup/veyraskills..."
|
|
152
|
+
git clone --depth=1 --filter=blob:none --sparse "$GITHUB" "$tmp" -q
|
|
153
|
+
(cd "$tmp" && git sparse-checkout set "skills")
|
|
154
|
+
|
|
155
|
+
if [[ ! -d "$tmp/skills" ]]; then
|
|
156
|
+
echo " Error: could not retrieve skills from repository."
|
|
157
|
+
exit 1
|
|
158
|
+
fi
|
|
159
|
+
|
|
160
|
+
mkdir -p "$dest_dir"
|
|
161
|
+
cp -r "$tmp/skills/." "$dest_dir/"
|
|
162
|
+
|
|
163
|
+
trap - EXIT
|
|
164
|
+
rm -rf "$tmp"
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
list_skills() {
|
|
168
|
+
local tmp
|
|
169
|
+
tmp=$(mktemp -d)
|
|
170
|
+
trap "rm -rf '$tmp'" EXIT
|
|
171
|
+
|
|
172
|
+
git clone --depth=1 --filter=blob:none --sparse "$GITHUB" "$tmp" -q
|
|
173
|
+
(cd "$tmp" && git sparse-checkout set "skills")
|
|
174
|
+
|
|
175
|
+
echo "Available skills:"
|
|
176
|
+
echo ""
|
|
177
|
+
for d in "$tmp/skills"/*/; do
|
|
178
|
+
local name
|
|
179
|
+
name=$(basename "$d")
|
|
180
|
+
echo " • $name"
|
|
181
|
+
done
|
|
182
|
+
echo ""
|
|
183
|
+
echo "Install: bash install.sh --skill <name>"
|
|
184
|
+
echo "All: bash install.sh"
|
|
185
|
+
|
|
186
|
+
trap - EXIT
|
|
187
|
+
rm -rf "$tmp"
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
# ── main ─────────────────────────────────────────────────────────────────────
|
|
191
|
+
|
|
192
|
+
main() {
|
|
193
|
+
check_deps
|
|
194
|
+
|
|
195
|
+
if [[ "$LIST_ONLY" == "true" ]]; then
|
|
196
|
+
list_skills
|
|
197
|
+
exit 0
|
|
198
|
+
fi
|
|
199
|
+
|
|
200
|
+
if [[ -z "$AGENT" ]]; then
|
|
201
|
+
AGENT=$(detect_agent)
|
|
202
|
+
if [[ -z "$AGENT" ]]; then
|
|
203
|
+
echo "Could not detect an agent in the current directory."
|
|
204
|
+
echo "Specify one with --agent <name> (claude, cursor, windsurf, gemini, copilot, cline, goose)"
|
|
205
|
+
exit 1
|
|
206
|
+
fi
|
|
207
|
+
echo "Detected agent: $AGENT"
|
|
208
|
+
fi
|
|
209
|
+
|
|
210
|
+
local dest
|
|
211
|
+
dest=$(skills_dir "$AGENT")
|
|
212
|
+
|
|
213
|
+
if [[ -n "$SKILL_NAME" ]]; then
|
|
214
|
+
echo "Installing '$SKILL_NAME' → $dest/"
|
|
215
|
+
install_skill "$SKILL_NAME" "$dest"
|
|
216
|
+
echo ""
|
|
217
|
+
echo "Done. ${dest}/${SKILL_NAME}/ is ready."
|
|
218
|
+
else
|
|
219
|
+
echo "Installing all skills → $dest/"
|
|
220
|
+
install_all "$dest"
|
|
221
|
+
echo ""
|
|
222
|
+
echo "Done. All skills installed to ${dest}/"
|
|
223
|
+
fi
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
main
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@veyralabs/skills",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "VeyraSkills — A curated collection of Claude Code skills for founders, developers and AI builders",
|
|
5
|
+
"bin": {
|
|
6
|
+
"veyraskills": "./bin/cli.js"
|
|
7
|
+
},
|
|
8
|
+
"files": [
|
|
9
|
+
"bin/",
|
|
10
|
+
"skills/",
|
|
11
|
+
"install.sh",
|
|
12
|
+
"validate.js"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"validate": "node validate.js"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"claude-code",
|
|
19
|
+
"claude-skill",
|
|
20
|
+
"agent-skill",
|
|
21
|
+
"skills-sh",
|
|
22
|
+
"ai-agents",
|
|
23
|
+
"anthropic",
|
|
24
|
+
"claude",
|
|
25
|
+
"cursor",
|
|
26
|
+
"windsurf",
|
|
27
|
+
"copilot",
|
|
28
|
+
"naming",
|
|
29
|
+
"domain-generator",
|
|
30
|
+
"startup-branding",
|
|
31
|
+
"brand-strategy",
|
|
32
|
+
"developer-tools"
|
|
33
|
+
],
|
|
34
|
+
"author": "VeyraLabs <hello@veyralabs.com>",
|
|
35
|
+
"license": "MIT",
|
|
36
|
+
"repository": {
|
|
37
|
+
"type": "git",
|
|
38
|
+
"url": "https://github.com/veyralabsgroup/veyraskills.git"
|
|
39
|
+
},
|
|
40
|
+
"bugs": {
|
|
41
|
+
"url": "https://github.com/veyralabsgroup/veyraskills/issues"
|
|
42
|
+
},
|
|
43
|
+
"homepage": "https://github.com/veyralabsgroup/veyraskills#readme",
|
|
44
|
+
"engines": {
|
|
45
|
+
"node": ">=18"
|
|
46
|
+
}
|
|
47
|
+
}
|