skillsauth 0.1.0 → 1.0.2
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/README.md +137 -20
- package/dist/commands/add.d.ts +5 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +177 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/installed.d.ts +4 -0
- package/dist/commands/installed.d.ts.map +1 -0
- package/dist/commands/installed.js +20 -0
- package/dist/commands/installed.js.map +1 -0
- package/dist/commands/list.d.ts +2 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +28 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/remove.d.ts +5 -0
- package/dist/commands/remove.d.ts.map +1 -0
- package/dist/commands/remove.js +26 -0
- package/dist/commands/remove.js.map +1 -0
- package/dist/commands/search.d.ts +4 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +27 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/update.d.ts +4 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +44 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/agents.d.ts +8 -0
- package/dist/lib/agents.d.ts.map +1 -0
- package/dist/lib/agents.js +12 -0
- package/dist/lib/agents.js.map +1 -0
- package/dist/lib/api.d.ts +10 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +60 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/installer.d.ts +11 -0
- package/dist/lib/installer.d.ts.map +1 -0
- package/dist/lib/installer.js +74 -0
- package/dist/lib/installer.js.map +1 -0
- package/dist/lib/lockfile.d.ts +8 -0
- package/dist/lib/lockfile.d.ts.map +1 -0
- package/dist/lib/lockfile.js +45 -0
- package/dist/lib/lockfile.js.map +1 -0
- package/dist/types.d.ts +52 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/constants.d.ts +24 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +27 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/display.d.ts +9 -0
- package/dist/utils/display.d.ts.map +1 -0
- package/dist/utils/display.js +32 -0
- package/dist/utils/display.js.map +1 -0
- package/package.json +44 -14
- package/index.js +0 -11
package/README.md
CHANGED
|
@@ -1,20 +1,137 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
## Installation
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
npm install skillsauth
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
1
|
+
# skillsauth
|
|
2
|
+
|
|
3
|
+
Install verified AI agent skills from the [SkillsAI](https://skillsauth.com) marketplace.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g skillsauth
|
|
9
|
+
# or
|
|
10
|
+
npx skillsauth <command>
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Quick Start
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# Search for skills
|
|
17
|
+
skillsauth search "react"
|
|
18
|
+
|
|
19
|
+
# List skills in a repository
|
|
20
|
+
skillsauth list facebook/react
|
|
21
|
+
|
|
22
|
+
# Install all skills from a repo
|
|
23
|
+
skillsauth add facebook/react
|
|
24
|
+
|
|
25
|
+
# Install with auto-confirm
|
|
26
|
+
skillsauth add facebook/react --yes
|
|
27
|
+
|
|
28
|
+
# Install globally (all projects)
|
|
29
|
+
skillsauth add facebook/react --global
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Commands
|
|
33
|
+
|
|
34
|
+
### `add <repo> [skill]`
|
|
35
|
+
Install skills from a repository.
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
skillsauth add owner/repo # Interactive install
|
|
39
|
+
skillsauth add owner/repo --yes # Auto-confirm
|
|
40
|
+
skillsauth add owner/repo --global # Install globally
|
|
41
|
+
skillsauth add owner/repo skill-name # Install specific skill
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Options:
|
|
45
|
+
- `-g, --global` — Install to global directory (~/.claude/skills/)
|
|
46
|
+
- `-y, --yes` — Skip all prompts
|
|
47
|
+
|
|
48
|
+
### `list <repo>`
|
|
49
|
+
List all verified skills in a repository.
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
skillsauth list facebook/react
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### `search <query>`
|
|
56
|
+
Search the SkillsAI marketplace.
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
skillsauth search "typescript"
|
|
60
|
+
skillsauth search "api" --limit 20
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Options:
|
|
64
|
+
- `-l, --limit <n>` — Max results (default: 10)
|
|
65
|
+
|
|
66
|
+
### `installed`
|
|
67
|
+
Show installed skills.
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
skillsauth installed # Local installs
|
|
71
|
+
skillsauth installed --global # Global installs
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Options:
|
|
75
|
+
- `-g, --global` — Show global installs
|
|
76
|
+
|
|
77
|
+
### `update`
|
|
78
|
+
Update all installed skills to latest versions.
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
skillsauth update # Update local
|
|
82
|
+
skillsauth update --global # Update global
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Options:
|
|
86
|
+
- `-g, --global` — Update global installs
|
|
87
|
+
|
|
88
|
+
### `remove <slug>`
|
|
89
|
+
Remove an installed skill.
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
skillsauth remove facebook-react-flow
|
|
93
|
+
skillsauth remove facebook-react-flow --yes
|
|
94
|
+
skillsauth remove facebook-react-flow --global
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Options:
|
|
98
|
+
- `-g, --global` — Remove from global install
|
|
99
|
+
- `-y, --yes` — Skip confirmation
|
|
100
|
+
|
|
101
|
+
## Supported AI Agents
|
|
102
|
+
|
|
103
|
+
skillsauth automatically detects and installs to:
|
|
104
|
+
|
|
105
|
+
| Agent | Local Path | Global Path |
|
|
106
|
+
|-------|------------|-------------|
|
|
107
|
+
| Claude Code | `.claude/skills/` | `~/.claude/skills/` |
|
|
108
|
+
| Cursor | `.cursor/skills/` | `~/.cursor/skills/` |
|
|
109
|
+
| Windsurf | `.windsurf/memories/` | `~/.windsurf/memories/` |
|
|
110
|
+
|
|
111
|
+
## Security
|
|
112
|
+
|
|
113
|
+
All skills on SkillsAI are:
|
|
114
|
+
- ✓ Scanned with mcp-scan
|
|
115
|
+
- ✓ Analyzed with Semgrep
|
|
116
|
+
- ✓ Verified by VirusTotal
|
|
117
|
+
|
|
118
|
+
Skills that fail security scans are quarantined and cannot be installed.
|
|
119
|
+
|
|
120
|
+
## Environment Variables
|
|
121
|
+
|
|
122
|
+
| Variable | Description |
|
|
123
|
+
|----------|-------------|
|
|
124
|
+
| `SKILLSAI_API_URL` | API base URL (default: https://skillsauth.com/api/cli) |
|
|
125
|
+
| `SKILLSAI_YES` | Set to `true` to skip all prompts |
|
|
126
|
+
| `SKILLSAI_NO_ANALYTICS` | Set to `true` to disable download tracking |
|
|
127
|
+
| `SKILLSAI_DEBUG` | Set to `true` for verbose output |
|
|
128
|
+
|
|
129
|
+
## Lockfile
|
|
130
|
+
|
|
131
|
+
skillsauth maintains a lockfile to track installed skills:
|
|
132
|
+
- Local: `.skillsai-lock.json` (in project root)
|
|
133
|
+
- Global: `~/.skillsai/lock.json`
|
|
134
|
+
|
|
135
|
+
## License
|
|
136
|
+
|
|
137
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAUA,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GACxC,OAAO,CAAC,IAAI,CAAC,CAwKf"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import * as p from '@clack/prompts';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { fetchRepo, fetchSkill, recordDownload, APIError } from '../lib/api.js';
|
|
4
|
+
import { detectAgents } from '../lib/agents.js';
|
|
5
|
+
import { installSkill } from '../lib/installer.js';
|
|
6
|
+
import { addSkillToLockfile } from '../lib/lockfile.js';
|
|
7
|
+
import { printScanBadge, printError, separator } from '../utils/display.js';
|
|
8
|
+
import { SKIP_PROMPTS } from '../utils/constants.js';
|
|
9
|
+
export async function addCommand(repoArg, specificSkill, opts) {
|
|
10
|
+
const parts = repoArg.split('/');
|
|
11
|
+
if (parts.length !== 2 || !parts[0] || !parts[1]) {
|
|
12
|
+
printError('Use: skillsauth add owner/repo');
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
15
|
+
const [owner, repo] = parts;
|
|
16
|
+
const scope = opts.global ? 'global' : 'local';
|
|
17
|
+
const skipAll = opts.yes || SKIP_PROMPTS;
|
|
18
|
+
p.intro(chalk.bold('◆ SkillsAuth') + chalk.dim(' — Trusted AI Agent Skills'));
|
|
19
|
+
const spinner = p.spinner();
|
|
20
|
+
spinner.start(`Fetching skills from ${chalk.cyan(repoArg)}...`);
|
|
21
|
+
let skills;
|
|
22
|
+
try {
|
|
23
|
+
if (specificSkill) {
|
|
24
|
+
const slug = `${owner}-${repo}-${specificSkill}`
|
|
25
|
+
.toLowerCase()
|
|
26
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
27
|
+
.replace(/^-|-$/g, '');
|
|
28
|
+
try {
|
|
29
|
+
skills = [await fetchSkill(owner, repo, slug)];
|
|
30
|
+
}
|
|
31
|
+
catch (e) {
|
|
32
|
+
if (e instanceof APIError && e.status === 404) {
|
|
33
|
+
const { skills: repoSkills } = await fetchRepo(owner, repo);
|
|
34
|
+
const matched = repoSkills.find((s) => s.name.toLowerCase() === specificSkill.toLowerCase());
|
|
35
|
+
if (matched)
|
|
36
|
+
skills = [matched];
|
|
37
|
+
else
|
|
38
|
+
throw e;
|
|
39
|
+
}
|
|
40
|
+
else
|
|
41
|
+
throw e;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
skills = (await fetchRepo(owner, repo)).skills;
|
|
46
|
+
}
|
|
47
|
+
spinner.stop(`Found ${chalk.green(skills.length)} verified skill(s) ${chalk.dim('(all scan-clean)')}`);
|
|
48
|
+
}
|
|
49
|
+
catch (e) {
|
|
50
|
+
spinner.stop('Failed');
|
|
51
|
+
if (e instanceof APIError) {
|
|
52
|
+
if (e.status === 404)
|
|
53
|
+
printError(`No published skills found for ${repoArg}`);
|
|
54
|
+
else if (e.status === 403)
|
|
55
|
+
printError(`Skills from ${repoArg} are quarantined (failed security scan)`);
|
|
56
|
+
else
|
|
57
|
+
printError(e.message);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
const error = e;
|
|
61
|
+
printError(error.message);
|
|
62
|
+
}
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
// Select skills
|
|
66
|
+
let selectedSkills = skills;
|
|
67
|
+
if (!skipAll && !specificSkill) {
|
|
68
|
+
const sel = await p.multiselect({
|
|
69
|
+
message: 'Which skills to install?',
|
|
70
|
+
options: skills.map((s) => ({
|
|
71
|
+
value: s.slug,
|
|
72
|
+
label: `${s.name.padEnd(24)} ${chalk.dim(s.description.slice(0, 50))}`,
|
|
73
|
+
hint: `★${(s.stars ?? 0) >= 1000 ? Math.floor((s.stars ?? 0) / 1000) + 'k' : s.stars ?? 0}`,
|
|
74
|
+
})),
|
|
75
|
+
required: true,
|
|
76
|
+
});
|
|
77
|
+
if (p.isCancel(sel)) {
|
|
78
|
+
p.cancel('Cancelled');
|
|
79
|
+
process.exit(0);
|
|
80
|
+
}
|
|
81
|
+
selectedSkills = skills.filter((s) => sel.includes(s.slug));
|
|
82
|
+
}
|
|
83
|
+
// Select scope
|
|
84
|
+
let finalScope = scope;
|
|
85
|
+
if (!opts.global && !skipAll) {
|
|
86
|
+
const s = await p.select({
|
|
87
|
+
message: 'Install scope?',
|
|
88
|
+
options: [
|
|
89
|
+
{ value: 'local', label: 'Local (this project)', hint: '.cursor/skills/, .claude/skills/' },
|
|
90
|
+
{ value: 'global', label: 'Global (all projects)', hint: '~/.cursor/skills/, ~/.claude/skills/' },
|
|
91
|
+
],
|
|
92
|
+
});
|
|
93
|
+
if (p.isCancel(s)) {
|
|
94
|
+
p.cancel('Cancelled');
|
|
95
|
+
process.exit(0);
|
|
96
|
+
}
|
|
97
|
+
finalScope = s;
|
|
98
|
+
}
|
|
99
|
+
// Select agents
|
|
100
|
+
const agentList = detectAgents(finalScope, process.cwd());
|
|
101
|
+
let selectedAgents;
|
|
102
|
+
if (skipAll) {
|
|
103
|
+
selectedAgents = agentList.filter((a) => a.detected).map((a) => a.id);
|
|
104
|
+
if (selectedAgents.length === 0)
|
|
105
|
+
selectedAgents = ['claude-code'];
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
const ag = await p.multiselect({
|
|
109
|
+
message: 'Install to which AI agents?',
|
|
110
|
+
options: agentList.map((a) => ({
|
|
111
|
+
value: a.id,
|
|
112
|
+
label: a.name,
|
|
113
|
+
hint: a.detected ? 'detected ✓' : 'not found',
|
|
114
|
+
})),
|
|
115
|
+
initialValues: agentList.filter((a) => a.detected).map((a) => a.id),
|
|
116
|
+
});
|
|
117
|
+
if (p.isCancel(ag)) {
|
|
118
|
+
p.cancel('Cancelled');
|
|
119
|
+
process.exit(0);
|
|
120
|
+
}
|
|
121
|
+
selectedAgents = ag;
|
|
122
|
+
}
|
|
123
|
+
if (selectedAgents.length === 0) {
|
|
124
|
+
printError('No agents selected');
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
// Security notice + confirmation
|
|
128
|
+
if (!skipAll) {
|
|
129
|
+
separator();
|
|
130
|
+
console.log(chalk.yellow(' ⚠ Security Notice'));
|
|
131
|
+
console.log(chalk.dim(` Publisher: ${owner}/${repo}`));
|
|
132
|
+
printScanBadge(selectedSkills[0]);
|
|
133
|
+
separator();
|
|
134
|
+
const ok = await p.confirm({
|
|
135
|
+
message: `Confirm install of ${selectedSkills.length} skill(s) to ${selectedAgents.join(', ')}?`,
|
|
136
|
+
});
|
|
137
|
+
if (p.isCancel(ok) || !ok) {
|
|
138
|
+
p.cancel('Cancelled');
|
|
139
|
+
process.exit(0);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Install (re-fetch each skill by slug so we get full files including assets; repo list only returns SKILL.md)
|
|
143
|
+
console.log('');
|
|
144
|
+
for (const skill of selectedSkills) {
|
|
145
|
+
const full = await fetchSkill(skill.repoOwner, skill.repoName, skill.slug);
|
|
146
|
+
const results = installSkill(full, selectedAgents, finalScope);
|
|
147
|
+
for (const r of results) {
|
|
148
|
+
if (r.status === 'error') {
|
|
149
|
+
console.log(chalk.red(` ✗ ${skill.name} → ${r.path}: ${r.error}`));
|
|
150
|
+
}
|
|
151
|
+
else if (r.status === 'skipped') {
|
|
152
|
+
console.log(chalk.dim(` ○ ${skill.name} → ${r.path} (unchanged)`));
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
console.log(chalk.green(` ✓ `) + `${skill.repoOwner}/${skill.name} → ${r.path}`);
|
|
156
|
+
recordDownload(skill.id, r.agent);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
addSkillToLockfile(finalScope, {
|
|
160
|
+
slug: skill.slug,
|
|
161
|
+
name: skill.name,
|
|
162
|
+
repoOwner: skill.repoOwner,
|
|
163
|
+
repoName: skill.repoName,
|
|
164
|
+
version: skill.version,
|
|
165
|
+
sha: skill.sha,
|
|
166
|
+
description: skill.description,
|
|
167
|
+
installedAt: new Date().toISOString(),
|
|
168
|
+
updatedAt: new Date().toISOString(),
|
|
169
|
+
agents: selectedAgents,
|
|
170
|
+
scope: finalScope,
|
|
171
|
+
paths: Object.fromEntries(results.filter((r) => r.status !== 'error').map((r) => [r.agent, r.path])),
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
console.log(chalk.green('\n ✓ ') + chalk.dim('Updated .skillsai-lock.json'));
|
|
175
|
+
p.outro(chalk.dim("Run 'skillsauth installed' to see all installed skills."));
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=add.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installed.d.ts","sourceRoot":"","sources":["../../src/commands/installed.ts"],"names":[],"mappings":"AAIA,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAiBjE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { getAllInstalled } from '../lib/lockfile.js';
|
|
3
|
+
import { printInstalledRow } from '../utils/display.js';
|
|
4
|
+
export function installedCommand(opts) {
|
|
5
|
+
const scope = opts.global ? 'global' : 'local';
|
|
6
|
+
const skills = getAllInstalled(scope);
|
|
7
|
+
if (!skills.length) {
|
|
8
|
+
console.log(chalk.dim(`\n No ${scope} skills installed.\n`));
|
|
9
|
+
console.log(chalk.dim(' Install: npx skillsauth add owner/repo\n'));
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
console.log('');
|
|
13
|
+
console.log(chalk.dim(' ' + 'SKILL'.padEnd(38) + 'VERSION'.padEnd(12) + 'AGENTS'));
|
|
14
|
+
console.log(chalk.dim(' ' + '─'.repeat(60)));
|
|
15
|
+
skills.forEach((s) => printInstalledRow(s));
|
|
16
|
+
console.log('');
|
|
17
|
+
console.log(chalk.dim(` ${skills.length} skill(s) — ${scope}`));
|
|
18
|
+
console.log('');
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=installed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installed.js","sourceRoot":"","sources":["../../src/commands/installed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,UAAU,gBAAgB,CAAC,IAA0B;IACzD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;IAC/C,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAEtC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,KAAK,sBAAsB,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC,CAAC;QACrE,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9C,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,MAAM,eAAe,KAAK,EAAE,CAAC,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAKA,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBhE"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import * as p from '@clack/prompts';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { fetchRepo } from '../lib/api.js';
|
|
4
|
+
import { printSkillRow, printError } from '../utils/display.js';
|
|
5
|
+
export async function listCommand(repoArg) {
|
|
6
|
+
const parts = repoArg.split('/');
|
|
7
|
+
if (parts.length !== 2) {
|
|
8
|
+
printError('Use: skillsauth list owner/repo');
|
|
9
|
+
process.exit(1);
|
|
10
|
+
}
|
|
11
|
+
const spinner = p.spinner();
|
|
12
|
+
spinner.start(`Fetching ${chalk.cyan(repoArg)}...`);
|
|
13
|
+
try {
|
|
14
|
+
const { skills, totalSkills } = await fetchRepo(parts[0], parts[1]);
|
|
15
|
+
spinner.stop(`${totalSkills} verified skills in ${chalk.cyan(repoArg)}`);
|
|
16
|
+
console.log('');
|
|
17
|
+
skills.forEach((s, i) => printSkillRow(s, i));
|
|
18
|
+
console.log('');
|
|
19
|
+
console.log(chalk.dim(` Install: npx skillsauth add ${repoArg}`));
|
|
20
|
+
}
|
|
21
|
+
catch (e) {
|
|
22
|
+
const error = e;
|
|
23
|
+
spinner.stop('Failed');
|
|
24
|
+
printError(error.message);
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEhE,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAe;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,UAAU,CAAC,iCAAiC,CAAC,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IAC5B,OAAO,CAAC,KAAK,CAAC,YAAY,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAEpD,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,GAAG,WAAW,uBAAuB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAiC,OAAO,EAAE,CAAC,CAAC,CAAC;IACrE,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,CAAU,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvB,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove.d.ts","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":"AAOA,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GACxC,OAAO,CAAC,IAAI,CAAC,CAsBf"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as p from '@clack/prompts';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { getInstalledSkill, removeSkillFromLockfile } from '../lib/lockfile.js';
|
|
4
|
+
import { uninstallSkill } from '../lib/installer.js';
|
|
5
|
+
import { printError, printSuccess } from '../utils/display.js';
|
|
6
|
+
export async function removeCommand(slug, opts) {
|
|
7
|
+
const scope = opts.global ? 'global' : 'local';
|
|
8
|
+
const skill = getInstalledSkill(scope, slug);
|
|
9
|
+
if (!skill) {
|
|
10
|
+
printError(`"${slug}" is not installed (${scope})`);
|
|
11
|
+
process.exit(1);
|
|
12
|
+
}
|
|
13
|
+
if (!opts.yes) {
|
|
14
|
+
const ok = await p.confirm({
|
|
15
|
+
message: `Remove ${chalk.cyan(slug)} from ${skill.agents.join(', ')}?`,
|
|
16
|
+
});
|
|
17
|
+
if (p.isCancel(ok) || !ok) {
|
|
18
|
+
p.cancel('Cancelled');
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
uninstallSkill(slug, skill.agents, scope);
|
|
23
|
+
removeSkillFromLockfile(scope, slug);
|
|
24
|
+
printSuccess(`Removed ${slug}`);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=remove.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove.js","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAG/D,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAY,EACZ,IAAyC;IAEzC,MAAM,KAAK,GAAiB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;IAC7D,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAE7C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,UAAU,CAAC,IAAI,IAAI,uBAAuB,KAAK,GAAG,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACd,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC;YACzB,OAAO,EAAE,UAAU,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;SACvE,CAAC,CAAC;QACH,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YAC1B,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YACtB,OAAO;QACT,CAAC;IACH,CAAC;IAED,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC1C,uBAAuB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACrC,YAAY,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAKA,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACvB,OAAO,CAAC,IAAI,CAAC,CAuBf"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import * as p from '@clack/prompts';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { searchSkills } from '../lib/api.js';
|
|
4
|
+
import { printSkillRow, printError } from '../utils/display.js';
|
|
5
|
+
export async function searchCommand(query, opts) {
|
|
6
|
+
const spinner = p.spinner();
|
|
7
|
+
spinner.start(`Searching "${chalk.cyan(query)}"...`);
|
|
8
|
+
try {
|
|
9
|
+
const { results, total } = await searchSkills(query, opts.limit ?? 10);
|
|
10
|
+
spinner.stop(`${total} result(s) for "${query}"`);
|
|
11
|
+
if (!results.length) {
|
|
12
|
+
console.log(chalk.dim('\n No results found.\n'));
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
console.log('');
|
|
16
|
+
results.forEach((s, i) => printSkillRow(s, i));
|
|
17
|
+
console.log('');
|
|
18
|
+
console.log(chalk.dim(' Install: npx skillsauth add owner/repo skill-name'));
|
|
19
|
+
}
|
|
20
|
+
catch (e) {
|
|
21
|
+
const error = e;
|
|
22
|
+
spinner.stop('Failed');
|
|
23
|
+
printError(error.message);
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEhE,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAa,EACb,IAAwB;IAExB,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IAC5B,OAAO,CAAC,KAAK,CAAC,cAAc,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAErD,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QACvE,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,mBAAmB,KAAK,GAAG,CAAC,CAAC;QAElD,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC;YAClD,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC,CAAC;IAChF,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,CAAU,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvB,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAQA,wBAAsB,aAAa,CAAC,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA2C7E"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import * as p from '@clack/prompts';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { fetchSkill, APIError } from '../lib/api.js';
|
|
4
|
+
import { getAllInstalled, addSkillToLockfile } from '../lib/lockfile.js';
|
|
5
|
+
import { installSkill } from '../lib/installer.js';
|
|
6
|
+
import { printError } from '../utils/display.js';
|
|
7
|
+
export async function updateCommand(opts) {
|
|
8
|
+
const scope = opts.global ? 'global' : 'local';
|
|
9
|
+
const installed = getAllInstalled(scope);
|
|
10
|
+
if (!installed.length) {
|
|
11
|
+
console.log(chalk.dim('\n No skills installed.\n'));
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
p.intro(`Checking ${installed.length} skill(s) for updates...`);
|
|
15
|
+
let updated = 0;
|
|
16
|
+
let quarantined = 0;
|
|
17
|
+
let errors = 0;
|
|
18
|
+
for (const skill of installed) {
|
|
19
|
+
try {
|
|
20
|
+
const latest = await fetchSkill(skill.repoOwner, skill.repoName, skill.slug);
|
|
21
|
+
if (latest.sha === skill.sha) {
|
|
22
|
+
console.log(chalk.dim(` ○ ${skill.slug} (up to date)`));
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
installSkill(latest, skill.agents, scope, true);
|
|
26
|
+
addSkillToLockfile(scope, { ...skill, sha: latest.sha, version: latest.version });
|
|
27
|
+
console.log(chalk.green(` ✓ ${skill.slug}`) + chalk.dim(` → v${latest.version}`));
|
|
28
|
+
updated++;
|
|
29
|
+
}
|
|
30
|
+
catch (e) {
|
|
31
|
+
if (e instanceof APIError && e.status === 403) {
|
|
32
|
+
console.log(chalk.red(` ✗ ${skill.slug} QUARANTINED — run: skillsauth remove ${skill.slug}`));
|
|
33
|
+
quarantined++;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
const error = e;
|
|
37
|
+
printError(`${skill.slug}: ${error.message}`);
|
|
38
|
+
errors++;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
p.outro(`${updated} updated · ${quarantined} quarantine warnings · ${errors} errors`);
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGjD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAA0B;IAC5D,MAAM,KAAK,GAAiB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;IAC7D,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAEzC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACrD,OAAO;IACT,CAAC;IAED,CAAC,CAAC,KAAK,CAAC,YAAY,SAAS,CAAC,MAAM,0BAA0B,CAAC,CAAC;IAEhE,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAE7E,IAAI,MAAM,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,EAAE,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC;gBACzD,SAAS;YACX,CAAC;YAED,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YAChD,kBAAkB,CAAC,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YAClF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACnF,OAAO,EAAE,CAAC;QACZ,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,IAAI,CAAC,YAAY,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC9C,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,yCAAyC,KAAK,CAAC,IAAI,EAAE,CAAC,CAClF,CAAC;gBACF,WAAW,EAAE,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,GAAG,CAAU,CAAC;gBACzB,UAAU,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC9C,MAAM,EAAE,CAAC;YACX,CAAC;QACH,CAAC;IACH,CAAC;IAED,CAAC,CAAC,KAAK,CAAC,GAAG,OAAO,cAAc,WAAW,0BAA0B,MAAM,SAAS,CAAC,CAAC;AACxF,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { readFileSync } from 'fs';
|
|
4
|
+
import { fileURLToPath } from 'url';
|
|
5
|
+
import { dirname, join } from 'path';
|
|
6
|
+
import { addCommand } from './commands/add.js';
|
|
7
|
+
import { listCommand } from './commands/list.js';
|
|
8
|
+
import { searchCommand } from './commands/search.js';
|
|
9
|
+
import { installedCommand } from './commands/installed.js';
|
|
10
|
+
import { updateCommand } from './commands/update.js';
|
|
11
|
+
import { removeCommand } from './commands/remove.js';
|
|
12
|
+
const pkg = JSON.parse(readFileSync(join(dirname(fileURLToPath(import.meta.url)), '../package.json'), 'utf8'));
|
|
13
|
+
const program = new Command()
|
|
14
|
+
.name('skillsauth')
|
|
15
|
+
.description('Install verified AI agent skills from the SkillsAI marketplace')
|
|
16
|
+
.version(pkg.version);
|
|
17
|
+
program
|
|
18
|
+
.command('add <repo> [skill]')
|
|
19
|
+
.description('Install skills (format: owner/repo)')
|
|
20
|
+
.option('-g, --global', 'Install globally')
|
|
21
|
+
.option('-y, --yes', 'Skip all prompts')
|
|
22
|
+
.action(addCommand);
|
|
23
|
+
program
|
|
24
|
+
.command('list <repo>')
|
|
25
|
+
.description('List skills in a repo')
|
|
26
|
+
.action(listCommand);
|
|
27
|
+
program
|
|
28
|
+
.command('search <query>')
|
|
29
|
+
.description('Search the marketplace')
|
|
30
|
+
.option('-l, --limit <n>', 'Max results', '10')
|
|
31
|
+
.action((q, o) => searchCommand(q, { limit: parseInt(o.limit) }));
|
|
32
|
+
program
|
|
33
|
+
.command('installed')
|
|
34
|
+
.description('Show installed skills')
|
|
35
|
+
.option('-g, --global', 'Show global installs')
|
|
36
|
+
.action(installedCommand);
|
|
37
|
+
program
|
|
38
|
+
.command('update')
|
|
39
|
+
.description('Update all installed skills')
|
|
40
|
+
.option('-g, --global', 'Update global installs')
|
|
41
|
+
.action(updateCommand);
|
|
42
|
+
program
|
|
43
|
+
.command('remove <slug>')
|
|
44
|
+
.description('Remove an installed skill')
|
|
45
|
+
.option('-g, --global', 'Remove from global install')
|
|
46
|
+
.option('-y, --yes', 'Skip confirmation')
|
|
47
|
+
.action(removeCommand);
|
|
48
|
+
program.parse();
|
|
49
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CACpB,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,iBAAiB,CAAC,EAAE,MAAM,CAAC,CAChE,CAAC;AAEzB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;KAC1B,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,gEAAgE,CAAC;KAC7E,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,oBAAoB,CAAC;KAC7B,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,cAAc,EAAE,kBAAkB,CAAC;KAC1C,MAAM,CAAC,WAAW,EAAE,kBAAkB,CAAC;KACvC,MAAM,CAAC,UAAU,CAAC,CAAC;AAEtB,OAAO;KACJ,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,uBAAuB,CAAC;KACpC,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,wBAAwB,CAAC;KACrC,MAAM,CAAC,iBAAiB,EAAE,aAAa,EAAE,IAAI,CAAC;KAC9C,MAAM,CAAC,CAAC,CAAS,EAAE,CAAoB,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AAE/F,OAAO;KACJ,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,uBAAuB,CAAC;KACpC,MAAM,CAAC,cAAc,EAAE,sBAAsB,CAAC;KAC9C,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAE5B,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,cAAc,EAAE,wBAAwB,CAAC;KAChD,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,2BAA2B,CAAC;KACxC,MAAM,CAAC,cAAc,EAAE,4BAA4B,CAAC;KACpD,MAAM,CAAC,WAAW,EAAE,mBAAmB,CAAC;KACxC,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AgentType } from '../types.js';
|
|
2
|
+
export interface AgentDetection {
|
|
3
|
+
id: AgentType;
|
|
4
|
+
name: string;
|
|
5
|
+
detected: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function detectAgents(scope: 'local' | 'global', cwd: string): AgentDetection[];
|
|
8
|
+
//# sourceMappingURL=agents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/lib/agents.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,SAAS,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,cAAc,EAAE,CAOrF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { existsSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { homedir } from 'os';
|
|
4
|
+
export function detectAgents(scope, cwd) {
|
|
5
|
+
const base = scope === 'local' ? cwd : homedir();
|
|
6
|
+
return [
|
|
7
|
+
{ id: 'claude-code', name: 'Claude Code', detected: existsSync(join(base, '.claude')) },
|
|
8
|
+
{ id: 'cursor', name: 'Cursor', detected: existsSync(join(base, '.cursor')) },
|
|
9
|
+
{ id: 'windsurf', name: 'Windsurf', detected: existsSync(join(base, '.windsurf')) },
|
|
10
|
+
];
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=agents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/lib/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAS7B,MAAM,UAAU,YAAY,CAAC,KAAyB,EAAE,GAAW;IACjE,MAAM,IAAI,GAAG,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IACjD,OAAO;QACL,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE;QACvF,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE;QAC7E,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,EAAE;KACpF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { CLISkill, RepoResponse, SearchResponse } from '../types.js';
|
|
2
|
+
export declare class APIError extends Error {
|
|
3
|
+
status: number;
|
|
4
|
+
constructor(status: number, message: string);
|
|
5
|
+
}
|
|
6
|
+
export declare function fetchRepo(owner: string, repo: string): Promise<RepoResponse>;
|
|
7
|
+
export declare function fetchSkill(owner: string, repo: string, slug: string): Promise<CLISkill>;
|
|
8
|
+
export declare function searchSkills(query: string, limit?: number): Promise<SearchResponse>;
|
|
9
|
+
export declare function recordDownload(skillId: string, agentType: string): void;
|
|
10
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE1E,qBAAa,QAAS,SAAQ,KAAK;IACd,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAInD;AAmCD,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAElF;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAE7F;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,cAAc,CAAC,CAErF;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAQvE"}
|
package/dist/lib/api.js
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { API_BASE_URL, DEBUG, NO_ANALYTICS } from '../utils/constants.js';
|
|
2
|
+
export class APIError extends Error {
|
|
3
|
+
status;
|
|
4
|
+
constructor(status, message) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.status = status;
|
|
7
|
+
this.name = 'APIError';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
async function apiFetch(path) {
|
|
11
|
+
const url = `${API_BASE_URL}${path}`;
|
|
12
|
+
if (DEBUG)
|
|
13
|
+
console.error(`[debug] GET ${url}`);
|
|
14
|
+
let res;
|
|
15
|
+
try {
|
|
16
|
+
res = await fetch(url, {
|
|
17
|
+
headers: { 'User-Agent': 'skillsauth-cli/1.0.0' },
|
|
18
|
+
signal: AbortSignal.timeout(15000),
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
catch (e) {
|
|
22
|
+
const error = e;
|
|
23
|
+
if (error.name === 'TimeoutError') {
|
|
24
|
+
throw new Error(`Request timed out (${API_BASE_URL}). Is the server running?`);
|
|
25
|
+
}
|
|
26
|
+
const hint = !process.env['SKILLSAI_API_URL']
|
|
27
|
+
? `\n Hint: set SKILLSAI_API_URL to point to your SkillsAI instance.`
|
|
28
|
+
: '';
|
|
29
|
+
throw new Error(`Cannot reach SkillsAI API at ${API_BASE_URL}: ${error.message}${hint}`);
|
|
30
|
+
}
|
|
31
|
+
if (!res.ok) {
|
|
32
|
+
const body = await res.json().catch(() => ({}));
|
|
33
|
+
const msg = body.error ?? `HTTP ${res.status}`;
|
|
34
|
+
if (res.status === 404 && !DEBUG) {
|
|
35
|
+
throw new APIError(res.status, `${msg} — ${url}`);
|
|
36
|
+
}
|
|
37
|
+
throw new APIError(res.status, msg);
|
|
38
|
+
}
|
|
39
|
+
return res.json();
|
|
40
|
+
}
|
|
41
|
+
export async function fetchRepo(owner, repo) {
|
|
42
|
+
return apiFetch(`/repo/${owner}/${repo}`);
|
|
43
|
+
}
|
|
44
|
+
export async function fetchSkill(owner, repo, slug) {
|
|
45
|
+
return apiFetch(`/repo/${owner}/${repo}/${slug}`);
|
|
46
|
+
}
|
|
47
|
+
export async function searchSkills(query, limit = 10) {
|
|
48
|
+
return apiFetch(`/search?${new URLSearchParams({ q: query, limit: String(limit) })}`);
|
|
49
|
+
}
|
|
50
|
+
export function recordDownload(skillId, agentType) {
|
|
51
|
+
if (NO_ANALYTICS)
|
|
52
|
+
return;
|
|
53
|
+
fetch(`${API_BASE_URL}/download`, {
|
|
54
|
+
method: 'POST',
|
|
55
|
+
headers: { 'Content-Type': 'application/json', 'User-Agent': 'skillsauth-cli/1.0.0' },
|
|
56
|
+
body: JSON.stringify({ skillId, agentType }),
|
|
57
|
+
signal: AbortSignal.timeout(5000),
|
|
58
|
+
}).catch(() => { });
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { CLISkill, AgentType, InstallScope } from '../types.js';
|
|
2
|
+
export interface InstallResult {
|
|
3
|
+
agent: AgentType;
|
|
4
|
+
path: string;
|
|
5
|
+
status: 'installed' | 'updated' | 'skipped' | 'error';
|
|
6
|
+
error?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function getInstallPath(slug: string, agent: AgentType, scope: InstallScope): string;
|
|
9
|
+
export declare function installSkill(skill: CLISkill, agents: AgentType[], scope: InstallScope, force?: boolean): InstallResult[];
|
|
10
|
+
export declare function uninstallSkill(slug: string, agents: AgentType[], scope: InstallScope): void;
|
|
11
|
+
//# sourceMappingURL=installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/lib/installer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGrE,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,GAAG,MAAM,CAI1F;AAQD,wBAAgB,YAAY,CAC1B,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE,SAAS,EAAE,EACnB,KAAK,EAAE,YAAY,EACnB,KAAK,UAAQ,GACZ,aAAa,EAAE,CAyCjB;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAY3F"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { writeFileSync, mkdirSync, existsSync, readFileSync, rmSync } from 'fs';
|
|
2
|
+
import { dirname, join, resolve, sep } from 'path';
|
|
3
|
+
import { AGENT_PATHS } from '../utils/constants.js';
|
|
4
|
+
export function getInstallPath(slug, agent, scope) {
|
|
5
|
+
return scope === 'global'
|
|
6
|
+
? AGENT_PATHS[agent].global(slug)
|
|
7
|
+
: AGENT_PATHS[agent].local(slug);
|
|
8
|
+
}
|
|
9
|
+
function isPathUnderBase(absPath, baseDirAbs) {
|
|
10
|
+
const base = resolve(baseDirAbs) + sep;
|
|
11
|
+
const resolved = resolve(absPath);
|
|
12
|
+
return resolved === resolve(baseDirAbs) || resolved.startsWith(base);
|
|
13
|
+
}
|
|
14
|
+
export function installSkill(skill, agents, scope, force = false) {
|
|
15
|
+
return agents.map((agent) => {
|
|
16
|
+
const filePath = getInstallPath(skill.slug, agent, scope);
|
|
17
|
+
const baseDirRel = dirname(filePath);
|
|
18
|
+
const baseDirAbs = scope === 'local' ? resolve(process.cwd(), baseDirRel) : resolve(baseDirRel);
|
|
19
|
+
try {
|
|
20
|
+
const baseExisted = existsSync(baseDirAbs);
|
|
21
|
+
let anyWritten = false;
|
|
22
|
+
let allUnchanged = true;
|
|
23
|
+
for (const file of skill.files) {
|
|
24
|
+
if (!file.path || file.path.includes('..') || file.path.startsWith('/'))
|
|
25
|
+
continue;
|
|
26
|
+
const normalizedPath = file.path.replace(/\\/g, '/');
|
|
27
|
+
const absPath = resolve(join(baseDirAbs, normalizedPath));
|
|
28
|
+
if (!isPathUnderBase(absPath, baseDirAbs))
|
|
29
|
+
continue;
|
|
30
|
+
const alreadyExists = existsSync(absPath);
|
|
31
|
+
const content = file.content ?? '';
|
|
32
|
+
if (alreadyExists && !force) {
|
|
33
|
+
try {
|
|
34
|
+
if (readFileSync(absPath, 'utf8') === content)
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// file missing or unreadable, write it
|
|
39
|
+
}
|
|
40
|
+
allUnchanged = false;
|
|
41
|
+
}
|
|
42
|
+
mkdirSync(dirname(absPath), { recursive: true });
|
|
43
|
+
writeFileSync(absPath, content, 'utf8');
|
|
44
|
+
anyWritten = true;
|
|
45
|
+
allUnchanged = false;
|
|
46
|
+
}
|
|
47
|
+
if (allUnchanged && !force)
|
|
48
|
+
return { agent, path: filePath, status: 'skipped' };
|
|
49
|
+
const status = anyWritten
|
|
50
|
+
? (baseExisted ? 'updated' : 'installed')
|
|
51
|
+
: 'skipped';
|
|
52
|
+
return { agent, path: filePath, status };
|
|
53
|
+
}
|
|
54
|
+
catch (e) {
|
|
55
|
+
const error = e;
|
|
56
|
+
return { agent, path: filePath, status: 'error', error: error.message };
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
export function uninstallSkill(slug, agents, scope) {
|
|
61
|
+
agents.forEach((agent) => {
|
|
62
|
+
const p = getInstallPath(slug, agent, scope);
|
|
63
|
+
const skillBaseDir = scope === 'local' ? join(process.cwd(), dirname(p)) : dirname(p);
|
|
64
|
+
try {
|
|
65
|
+
if (existsSync(skillBaseDir)) {
|
|
66
|
+
rmSync(skillBaseDir, { recursive: true, force: true });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// Directory may already be missing or permission error
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/lib/installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Lockfile, InstalledSkill, InstallScope } from '../types.js';
|
|
2
|
+
export declare function readLockfile(scope: InstallScope): Lockfile;
|
|
3
|
+
export declare function writeLockfile(scope: InstallScope, lock: Lockfile): void;
|
|
4
|
+
export declare function addSkillToLockfile(scope: InstallScope, skill: InstalledSkill): void;
|
|
5
|
+
export declare function removeSkillFromLockfile(scope: InstallScope, slug: string): void;
|
|
6
|
+
export declare const getInstalledSkill: (scope: InstallScope, slug: string) => InstalledSkill | null;
|
|
7
|
+
export declare const getAllInstalled: (scope: InstallScope) => InstalledSkill[];
|
|
8
|
+
//# sourceMappingURL=lockfile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lockfile.d.ts","sourceRoot":"","sources":["../../src/lib/lockfile.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAW1E,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,QAAQ,CAQ1D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAOvE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,cAAc,GAAG,IAAI,CASnF;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAI/E;AAED,eAAO,MAAM,iBAAiB,GAAI,OAAO,YAAY,EAAE,MAAM,MAAM,KAAG,cAAc,GAAG,IAC7C,CAAC;AAE3C,eAAO,MAAM,eAAe,GAAI,OAAO,YAAY,KAAG,cAAc,EACzB,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
|
|
2
|
+
import { LOCAL_LOCK, GLOBAL_LOCK, LOCKFILE_VERSION, GLOBAL_DIR } from '../utils/constants.js';
|
|
3
|
+
const getPath = (scope) => scope === 'global' ? GLOBAL_LOCK : LOCAL_LOCK;
|
|
4
|
+
const empty = () => ({
|
|
5
|
+
version: LOCKFILE_VERSION,
|
|
6
|
+
generatedAt: new Date().toISOString(),
|
|
7
|
+
skills: {},
|
|
8
|
+
});
|
|
9
|
+
export function readLockfile(scope) {
|
|
10
|
+
const path = getPath(scope);
|
|
11
|
+
if (!existsSync(path))
|
|
12
|
+
return empty();
|
|
13
|
+
try {
|
|
14
|
+
return JSON.parse(readFileSync(path, 'utf8'));
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return empty();
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function writeLockfile(scope, lock) {
|
|
21
|
+
const path = getPath(scope);
|
|
22
|
+
lock.generatedAt = new Date().toISOString();
|
|
23
|
+
if (scope === 'global' && !existsSync(GLOBAL_DIR)) {
|
|
24
|
+
mkdirSync(GLOBAL_DIR, { recursive: true });
|
|
25
|
+
}
|
|
26
|
+
writeFileSync(path, JSON.stringify(lock, null, 2) + '\n', 'utf8');
|
|
27
|
+
}
|
|
28
|
+
export function addSkillToLockfile(scope, skill) {
|
|
29
|
+
const lock = readLockfile(scope);
|
|
30
|
+
const prev = lock.skills[skill.slug];
|
|
31
|
+
lock.skills[skill.slug] = {
|
|
32
|
+
...skill,
|
|
33
|
+
installedAt: prev?.installedAt ?? new Date().toISOString(),
|
|
34
|
+
updatedAt: new Date().toISOString(),
|
|
35
|
+
};
|
|
36
|
+
writeLockfile(scope, lock);
|
|
37
|
+
}
|
|
38
|
+
export function removeSkillFromLockfile(scope, slug) {
|
|
39
|
+
const lock = readLockfile(scope);
|
|
40
|
+
delete lock.skills[slug];
|
|
41
|
+
writeLockfile(scope, lock);
|
|
42
|
+
}
|
|
43
|
+
export const getInstalledSkill = (scope, slug) => readLockfile(scope).skills[slug] ?? null;
|
|
44
|
+
export const getAllInstalled = (scope) => Object.values(readLockfile(scope).skills);
|
|
45
|
+
//# sourceMappingURL=lockfile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lockfile.js","sourceRoot":"","sources":["../../src/lib/lockfile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAG9F,MAAM,OAAO,GAAG,CAAC,KAAmB,EAAU,EAAE,CAC9C,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC;AAEhD,MAAM,KAAK,GAAG,GAAa,EAAE,CAAC,CAAC;IAC7B,OAAO,EAAE,gBAAgB;IACzB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;IACrC,MAAM,EAAE,EAAE;CACX,CAAC,CAAC;AAEH,MAAM,UAAU,YAAY,CAAC,KAAmB;IAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,EAAE,CAAC;IACtC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAa,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,EAAE,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAmB,EAAE,IAAc;IAC/D,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAI,KAAK,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAClD,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAmB,EAAE,KAAqB;IAC3E,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG;QACxB,GAAG,KAAK;QACR,WAAW,EAAE,IAAI,EAAE,WAAW,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC1D,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;IACF,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAmB,EAAE,IAAY;IACvE,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACjC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACzB,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAmB,EAAE,IAAY,EAAyB,EAAE,CAC5F,YAAY,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AAE3C,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAmB,EAAoB,EAAE,CACvE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export interface CLISkill {
|
|
2
|
+
id: string;
|
|
3
|
+
slug: string;
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
version: string;
|
|
7
|
+
sha: string;
|
|
8
|
+
repoOwner: string;
|
|
9
|
+
repoName: string;
|
|
10
|
+
triggerPhrase: string;
|
|
11
|
+
category: string;
|
|
12
|
+
stars: number;
|
|
13
|
+
scanStatus: 'clean';
|
|
14
|
+
scannedAt: string | null;
|
|
15
|
+
files: Array<{
|
|
16
|
+
path: string;
|
|
17
|
+
content: string;
|
|
18
|
+
}>;
|
|
19
|
+
}
|
|
20
|
+
export interface RepoResponse {
|
|
21
|
+
repoOwner: string;
|
|
22
|
+
repoName: string;
|
|
23
|
+
totalSkills: number;
|
|
24
|
+
skills: CLISkill[];
|
|
25
|
+
}
|
|
26
|
+
export interface SearchResponse {
|
|
27
|
+
query: string;
|
|
28
|
+
total: number;
|
|
29
|
+
results: CLISkill[];
|
|
30
|
+
}
|
|
31
|
+
export type AgentType = 'claude-code' | 'cursor' | 'windsurf';
|
|
32
|
+
export type InstallScope = 'local' | 'global';
|
|
33
|
+
export interface InstalledSkill {
|
|
34
|
+
slug: string;
|
|
35
|
+
name: string;
|
|
36
|
+
repoOwner: string;
|
|
37
|
+
repoName: string;
|
|
38
|
+
version: string;
|
|
39
|
+
sha: string;
|
|
40
|
+
description: string;
|
|
41
|
+
installedAt: string;
|
|
42
|
+
updatedAt: string;
|
|
43
|
+
agents: AgentType[];
|
|
44
|
+
scope: InstallScope;
|
|
45
|
+
paths: Partial<Record<AgentType, string>>;
|
|
46
|
+
}
|
|
47
|
+
export interface Lockfile {
|
|
48
|
+
version: number;
|
|
49
|
+
generatedAt: string;
|
|
50
|
+
skills: Record<string, InstalledSkill>;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,QAAQ,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,QAAQ,EAAE,CAAC;CACrB;AAED,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,QAAQ,GAAG,UAAU,CAAC;AAC9D,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE9C,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,KAAK,EAAE,YAAY,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CACxC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export declare const API_BASE_URL: string;
|
|
2
|
+
export declare const SKIP_PROMPTS: boolean;
|
|
3
|
+
export declare const NO_ANALYTICS: boolean;
|
|
4
|
+
export declare const DEBUG: boolean;
|
|
5
|
+
export declare const HOME_DIR: string;
|
|
6
|
+
export declare const GLOBAL_DIR: string;
|
|
7
|
+
export declare const GLOBAL_LOCK: string;
|
|
8
|
+
export declare const LOCAL_LOCK = ".skillsai-lock.json";
|
|
9
|
+
export declare const LOCKFILE_VERSION = 1;
|
|
10
|
+
export declare const AGENT_PATHS: {
|
|
11
|
+
readonly 'claude-code': {
|
|
12
|
+
readonly local: (slug: string) => string;
|
|
13
|
+
readonly global: (slug: string) => string;
|
|
14
|
+
};
|
|
15
|
+
readonly cursor: {
|
|
16
|
+
readonly local: (slug: string) => string;
|
|
17
|
+
readonly global: (slug: string) => string;
|
|
18
|
+
};
|
|
19
|
+
readonly windsurf: {
|
|
20
|
+
readonly local: (slug: string) => string;
|
|
21
|
+
readonly global: (slug: string) => string;
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,YAAY,QAAsE,CAAC;AAChG,eAAO,MAAM,YAAY,SAAyC,CAAC;AACnE,eAAO,MAAM,YAAY,SAAkD,CAAC;AAC5E,eAAO,MAAM,KAAK,SAA2C,CAAC;AAC9D,eAAO,MAAM,QAAQ,QAAY,CAAC;AAClC,eAAO,MAAM,UAAU,QAA8B,CAAC;AACtD,eAAO,MAAM,WAAW,QAAgC,CAAC;AACzD,eAAO,MAAM,UAAU,wBAAwB,CAAC;AAChD,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,eAAO,MAAM,WAAW;;+BAEN,MAAM;gCACL,MAAM;;;+BAGP,MAAM;gCACL,MAAM;;;+BAGP,MAAM;gCACL,MAAM;;CAEf,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { homedir } from 'os';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
// Production default: https://skillsauth.com/api/cli; override with SKILLSAI_API_URL (e.g. http://localhost:3000/api/cli for dev).
|
|
4
|
+
export const API_BASE_URL = process.env['SKILLSAI_API_URL'] ?? 'https://skillsauth.com/api/cli';
|
|
5
|
+
export const SKIP_PROMPTS = process.env['SKILLSAI_YES'] === 'true';
|
|
6
|
+
export const NO_ANALYTICS = process.env['SKILLSAI_NO_ANALYTICS'] === 'true';
|
|
7
|
+
export const DEBUG = process.env['SKILLSAI_DEBUG'] === 'true';
|
|
8
|
+
export const HOME_DIR = homedir();
|
|
9
|
+
export const GLOBAL_DIR = join(HOME_DIR, '.skillsai');
|
|
10
|
+
export const GLOBAL_LOCK = join(GLOBAL_DIR, 'lock.json');
|
|
11
|
+
export const LOCAL_LOCK = '.skillsai-lock.json';
|
|
12
|
+
export const LOCKFILE_VERSION = 1;
|
|
13
|
+
export const AGENT_PATHS = {
|
|
14
|
+
'claude-code': {
|
|
15
|
+
local: (slug) => `.claude/skills/${slug}/SKILL.md`,
|
|
16
|
+
global: (slug) => join(HOME_DIR, `.claude/skills/${slug}/SKILL.md`),
|
|
17
|
+
},
|
|
18
|
+
'cursor': {
|
|
19
|
+
local: (slug) => `.cursor/skills/${slug}/SKILL.md`,
|
|
20
|
+
global: (slug) => join(HOME_DIR, `.cursor/skills/${slug}/SKILL.md`),
|
|
21
|
+
},
|
|
22
|
+
'windsurf': {
|
|
23
|
+
local: (slug) => `.windsurf/memories/${slug}.md`,
|
|
24
|
+
global: (slug) => join(HOME_DIR, `.windsurf/memories/${slug}.md`),
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,mIAAmI;AACnI,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,gCAAgC,CAAC;AAChG,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,MAAM,CAAC;AACnE,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,KAAK,MAAM,CAAC;AAC5E,MAAM,CAAC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,MAAM,CAAC;AAC9D,MAAM,CAAC,MAAM,QAAQ,GAAG,OAAO,EAAE,CAAC;AAClC,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AACtD,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;AACzD,MAAM,CAAC,MAAM,UAAU,GAAG,qBAAqB,CAAC;AAChD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAElC,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,aAAa,EAAE;QACb,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,kBAAkB,IAAI,WAAW;QAC1D,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,kBAAkB,IAAI,WAAW,CAAC;KAC5E;IACD,QAAQ,EAAE;QACR,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,kBAAkB,IAAI,WAAW;QAC1D,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,kBAAkB,IAAI,WAAW,CAAC;KAC5E;IACD,UAAU,EAAE;QACV,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,sBAAsB,IAAI,KAAK;QACxD,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,sBAAsB,IAAI,KAAK,CAAC;KAC1E;CACO,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { CLISkill, InstalledSkill } from '../types.js';
|
|
2
|
+
export declare const printError: (m: string) => void;
|
|
3
|
+
export declare const printSuccess: (m: string) => void;
|
|
4
|
+
export declare const printWarning: (m: string) => void;
|
|
5
|
+
export declare const separator: () => void;
|
|
6
|
+
export declare function printSkillRow(s: CLISkill, i?: number): void;
|
|
7
|
+
export declare function printInstalledRow(s: InstalledSkill): void;
|
|
8
|
+
export declare function printScanBadge(s: CLISkill): void;
|
|
9
|
+
//# sourceMappingURL=display.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../src/utils/display.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE5D,eAAO,MAAM,UAAU,GAAI,GAAG,MAAM,KAAG,IAAuD,CAAC;AAC/F,eAAO,MAAM,YAAY,GAAI,GAAG,MAAM,KAAG,IAA4C,CAAC;AACtF,eAAO,MAAM,YAAY,GAAI,GAAG,MAAM,KAAG,IAA6C,CAAC;AACvF,eAAO,MAAM,SAAS,QAAO,IAAqD,CAAC;AAEnF,wBAAgB,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAW3D;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,cAAc,GAAG,IAAI,CAUzD;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAQhD"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
export const printError = (m) => console.error(chalk.red(' ✗ ') + chalk.red(m));
|
|
3
|
+
export const printSuccess = (m) => console.log(chalk.green(' ✓ ') + m);
|
|
4
|
+
export const printWarning = (m) => console.log(chalk.yellow(' ⚠ ') + m);
|
|
5
|
+
export const separator = () => console.log(chalk.dim(' ' + '─'.repeat(60)));
|
|
6
|
+
export function printSkillRow(s, i) {
|
|
7
|
+
const num = i !== undefined ? chalk.dim(`${i + 1}.`) : ' ';
|
|
8
|
+
const name = chalk.white.bold(s.name.padEnd(28));
|
|
9
|
+
const desc = chalk.dim((s.description.length > 50 ? s.description.slice(0, 49) + '…' : s.description).padEnd(52));
|
|
10
|
+
const starCount = s.stars ?? 0;
|
|
11
|
+
const stars = chalk.yellow(`★${starCount >= 1000 ? Math.floor(starCount / 1000) + 'k' : starCount}`);
|
|
12
|
+
console.log(` ${num} ${name} ${desc} ${stars}`);
|
|
13
|
+
}
|
|
14
|
+
export function printInstalledRow(s) {
|
|
15
|
+
const name = chalk.white.bold(s.slug.padEnd(36));
|
|
16
|
+
const agentLabels = {
|
|
17
|
+
'claude-code': 'Claude',
|
|
18
|
+
cursor: 'Cursor',
|
|
19
|
+
windsurf: 'Windsurf',
|
|
20
|
+
};
|
|
21
|
+
const agents = s.agents.map((a) => chalk.cyan(agentLabels[a] ?? a)).join(', ');
|
|
22
|
+
const version = chalk.dim(`v${s.version}`);
|
|
23
|
+
console.log(` ${name} ${version} ${agents}`);
|
|
24
|
+
}
|
|
25
|
+
export function printScanBadge(s) {
|
|
26
|
+
const date = s.scannedAt ? new Date(s.scannedAt).toLocaleDateString() : 'recently';
|
|
27
|
+
console.log(chalk.dim(` Scanned: ${date}`) +
|
|
28
|
+
chalk.green(' ✓ mcp-scan') +
|
|
29
|
+
chalk.green(' ✓ Semgrep') +
|
|
30
|
+
chalk.green(' ✓ VirusTotal'));
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=display.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/utils/display.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,21 +1,51 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "skillsauth",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
|
|
3
|
+
"version": "1.0.2",
|
|
4
|
+
"description": "Install verified AI agent skills from the SkillsAuth marketplace",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"skillsauth": "./dist/index.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist/**/*",
|
|
11
|
+
"README.md"
|
|
12
|
+
],
|
|
13
|
+
"engines": {
|
|
14
|
+
"node": ">=18.0.0"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"ai",
|
|
18
|
+
"agents",
|
|
19
|
+
"claude",
|
|
20
|
+
"cursor",
|
|
21
|
+
"skills",
|
|
22
|
+
"skillsauth",
|
|
23
|
+
"windsurf"
|
|
24
|
+
],
|
|
25
|
+
"author": "SkillsAuth",
|
|
8
26
|
"license": "MIT",
|
|
9
27
|
"repository": {
|
|
10
28
|
"type": "git",
|
|
11
|
-
"url": "
|
|
29
|
+
"url": "https://github.com/beinghimansh/skillsauth"
|
|
12
30
|
},
|
|
13
|
-
"
|
|
14
|
-
|
|
31
|
+
"homepage": "https://skillsauth.com",
|
|
32
|
+
"publishConfig": {
|
|
33
|
+
"registry": "https://registry.npmjs.org/"
|
|
15
34
|
},
|
|
16
|
-
"
|
|
17
|
-
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
|
|
21
|
-
|
|
35
|
+
"dependencies": {
|
|
36
|
+
"@clack/prompts": "^0.9.0",
|
|
37
|
+
"chalk": "^5.3.0",
|
|
38
|
+
"commander": "^12.1.0"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"typescript": "^5.5.0",
|
|
42
|
+
"@types/node": "^22.0.0",
|
|
43
|
+
"tsx": "^4.0.0",
|
|
44
|
+
"vitest": "^2.0.0"
|
|
45
|
+
},
|
|
46
|
+
"scripts": {
|
|
47
|
+
"build": "tsc",
|
|
48
|
+
"dev": "tsx watch src/index.ts",
|
|
49
|
+
"test": "vitest run"
|
|
50
|
+
}
|
|
51
|
+
}
|
package/index.js
DELETED