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.
Files changed (59) hide show
  1. package/README.md +137 -20
  2. package/dist/commands/add.d.ts +5 -0
  3. package/dist/commands/add.d.ts.map +1 -0
  4. package/dist/commands/add.js +177 -0
  5. package/dist/commands/add.js.map +1 -0
  6. package/dist/commands/installed.d.ts +4 -0
  7. package/dist/commands/installed.d.ts.map +1 -0
  8. package/dist/commands/installed.js +20 -0
  9. package/dist/commands/installed.js.map +1 -0
  10. package/dist/commands/list.d.ts +2 -0
  11. package/dist/commands/list.d.ts.map +1 -0
  12. package/dist/commands/list.js +28 -0
  13. package/dist/commands/list.js.map +1 -0
  14. package/dist/commands/remove.d.ts +5 -0
  15. package/dist/commands/remove.d.ts.map +1 -0
  16. package/dist/commands/remove.js +26 -0
  17. package/dist/commands/remove.js.map +1 -0
  18. package/dist/commands/search.d.ts +4 -0
  19. package/dist/commands/search.d.ts.map +1 -0
  20. package/dist/commands/search.js +27 -0
  21. package/dist/commands/search.js.map +1 -0
  22. package/dist/commands/update.d.ts +4 -0
  23. package/dist/commands/update.d.ts.map +1 -0
  24. package/dist/commands/update.js +44 -0
  25. package/dist/commands/update.js.map +1 -0
  26. package/dist/index.d.ts +3 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +49 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/lib/agents.d.ts +8 -0
  31. package/dist/lib/agents.d.ts.map +1 -0
  32. package/dist/lib/agents.js +12 -0
  33. package/dist/lib/agents.js.map +1 -0
  34. package/dist/lib/api.d.ts +10 -0
  35. package/dist/lib/api.d.ts.map +1 -0
  36. package/dist/lib/api.js +60 -0
  37. package/dist/lib/api.js.map +1 -0
  38. package/dist/lib/installer.d.ts +11 -0
  39. package/dist/lib/installer.d.ts.map +1 -0
  40. package/dist/lib/installer.js +74 -0
  41. package/dist/lib/installer.js.map +1 -0
  42. package/dist/lib/lockfile.d.ts +8 -0
  43. package/dist/lib/lockfile.d.ts.map +1 -0
  44. package/dist/lib/lockfile.js +45 -0
  45. package/dist/lib/lockfile.js.map +1 -0
  46. package/dist/types.d.ts +52 -0
  47. package/dist/types.d.ts.map +1 -0
  48. package/dist/types.js +2 -0
  49. package/dist/types.js.map +1 -0
  50. package/dist/utils/constants.d.ts +24 -0
  51. package/dist/utils/constants.d.ts.map +1 -0
  52. package/dist/utils/constants.js +27 -0
  53. package/dist/utils/constants.js.map +1 -0
  54. package/dist/utils/display.d.ts +9 -0
  55. package/dist/utils/display.d.ts.map +1 -0
  56. package/dist/utils/display.js +32 -0
  57. package/dist/utils/display.js.map +1 -0
  58. package/package.json +44 -14
  59. package/index.js +0 -11
package/README.md CHANGED
@@ -1,20 +1,137 @@
1
- # SkillsAuth
2
-
3
- Skills authentication and verification (in development).
4
-
5
- ## Installation
6
-
7
- ```bash
8
- npm install skillsauth
9
- ```
10
-
11
- ## Usage
12
-
13
- ```javascript
14
- const skillsauth = require('skillsauth');
15
- console.log(skillsauth.description);
16
- ```
17
-
18
- ## License
19
-
20
- MIT
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,5 @@
1
+ export declare function addCommand(repoArg: string, specificSkill: string | undefined, opts: {
2
+ global?: boolean;
3
+ yes?: boolean;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=add.d.ts.map
@@ -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,4 @@
1
+ export declare function installedCommand(opts: {
2
+ global?: boolean;
3
+ }): void;
4
+ //# sourceMappingURL=installed.d.ts.map
@@ -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,2 @@
1
+ export declare function listCommand(repoArg: string): Promise<void>;
2
+ //# sourceMappingURL=list.d.ts.map
@@ -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,5 @@
1
+ export declare function removeCommand(slug: string, opts: {
2
+ global?: boolean;
3
+ yes?: boolean;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=remove.d.ts.map
@@ -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,4 @@
1
+ export declare function searchCommand(query: string, opts: {
2
+ limit?: number;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=search.d.ts.map
@@ -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,4 @@
1
+ export declare function updateCommand(opts: {
2
+ global?: boolean;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=update.d.ts.map
@@ -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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}
@@ -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":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAG1E,MAAM,OAAO,QAAS,SAAQ,KAAK;IACd;IAAnB,YAAmB,MAAc,EAAE,OAAe;QAChD,KAAK,CAAC,OAAO,CAAC,CAAC;QADE,WAAM,GAAN,MAAM,CAAQ;QAE/B,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,KAAK,UAAU,QAAQ,CAAI,IAAY;IACrC,MAAM,GAAG,GAAG,GAAG,YAAY,GAAG,IAAI,EAAE,CAAC;IACrC,IAAI,KAAK;QAAE,OAAO,CAAC,KAAK,CAAC,eAAe,GAAG,EAAE,CAAC,CAAC;IAE/C,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YACrB,OAAO,EAAE,EAAE,YAAY,EAAE,sBAAsB,EAAE;YACjD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;SACnC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,CAAU,CAAC;QACzB,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,sBAAsB,YAAY,2BAA2B,CAAC,CAAC;QACjF,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;YAC3C,CAAC,CAAC,oEAAoE;YACtE,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,gCAAgC,YAAY,KAAK,KAAK,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC,CAAC;IAC3F,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAChD,MAAM,GAAG,GAAI,IAA2B,CAAC,KAAK,IAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;QACvE,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YACjC,MAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,GAAG,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,MAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,GAAG,CAAC,IAAI,EAAgB,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAa,EAAE,IAAY;IACzD,OAAO,QAAQ,CAAe,SAAS,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAa,EAAE,IAAY,EAAE,IAAY;IACxE,OAAO,QAAQ,CAAW,SAAS,KAAK,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAa,EAAE,KAAK,GAAG,EAAE;IAC1D,OAAO,QAAQ,CAAiB,WAAW,IAAI,eAAe,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACxG,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,SAAiB;IAC/D,IAAI,YAAY;QAAE,OAAO;IACzB,KAAK,CAAC,GAAG,YAAY,WAAW,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,YAAY,EAAE,sBAAsB,EAAE;QACrF,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;QAC5C,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;KAClC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AACrB,CAAC"}
@@ -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"}
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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": "0.1.0",
4
- "description": "Skills authentication and verification (in development)",
5
- "main": "index.js",
6
- "keywords": ["ai", "skills", "auth", "verification", "registry"],
7
- "author": "Himanshu",
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": "git+https://github.com/beinghimansh/skillsauth.git"
29
+ "url": "https://github.com/beinghimansh/skillsauth"
12
30
  },
13
- "bugs": {
14
- "url": "https://github.com/beinghimansh/skillsauth/issues"
31
+ "homepage": "https://skillsauth.com",
32
+ "publishConfig": {
33
+ "registry": "https://registry.npmjs.org/"
15
34
  },
16
- "homepage": "https://github.com/beinghimansh/skillsauth#readme",
17
- "files": [
18
- "index.js",
19
- "README.md"
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
@@ -1,11 +0,0 @@
1
- /**
2
- * SkillsAuth - Skills authentication and verification
3
- * (in development)
4
- * @module skillsauth
5
- */
6
-
7
- module.exports = {
8
- name: 'skillsauth',
9
- version: '0.1.0',
10
- description: 'Skills authentication and verification (in development)',
11
- };