skilldex-cli 0.1.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +147 -5
- package/dist/cli/commands/config.d.ts +3 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +115 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/install-action.d.ts.map +1 -1
- package/dist/cli/commands/install-action.js +71 -0
- package/dist/cli/commands/install-action.js.map +1 -1
- package/dist/cli/commands/install.d.ts.map +1 -1
- package/dist/cli/commands/install.js +4 -1
- package/dist/cli/commands/install.js.map +1 -1
- package/dist/cli/commands/list-action.d.ts.map +1 -1
- package/dist/cli/commands/list-action.js +5 -1
- package/dist/cli/commands/list-action.js.map +1 -1
- package/dist/cli/commands/publish.d.ts.map +1 -1
- package/dist/cli/commands/publish.js +118 -4
- package/dist/cli/commands/publish.js.map +1 -1
- package/dist/cli/commands/search-action.d.ts +7 -0
- package/dist/cli/commands/search-action.d.ts.map +1 -0
- package/dist/cli/commands/search-action.js +61 -0
- package/dist/cli/commands/search-action.js.map +1 -0
- package/dist/cli/commands/search.d.ts +3 -0
- package/dist/cli/commands/search.d.ts.map +1 -0
- package/dist/cli/commands/search.js +14 -0
- package/dist/cli/commands/search.js.map +1 -0
- package/dist/cli/commands/skillset-init-action.d.ts +2 -0
- package/dist/cli/commands/skillset-init-action.d.ts.map +1 -0
- package/dist/cli/commands/skillset-init-action.js +65 -0
- package/dist/cli/commands/skillset-init-action.js.map +1 -0
- package/dist/cli/commands/skillset-install-action.d.ts +7 -0
- package/dist/cli/commands/skillset-install-action.d.ts.map +1 -0
- package/dist/cli/commands/skillset-install-action.js +174 -0
- package/dist/cli/commands/skillset-install-action.js.map +1 -0
- package/dist/cli/commands/skillset-list-action.d.ts +6 -0
- package/dist/cli/commands/skillset-list-action.d.ts.map +1 -0
- package/dist/cli/commands/skillset-list-action.js +46 -0
- package/dist/cli/commands/skillset-list-action.js.map +1 -0
- package/dist/cli/commands/skillset-publish-action.d.ts +7 -0
- package/dist/cli/commands/skillset-publish-action.d.ts.map +1 -0
- package/dist/cli/commands/skillset-publish-action.js +113 -0
- package/dist/cli/commands/skillset-publish-action.js.map +1 -0
- package/dist/cli/commands/skillset-uninstall-action.d.ts +6 -0
- package/dist/cli/commands/skillset-uninstall-action.d.ts.map +1 -0
- package/dist/cli/commands/skillset-uninstall-action.js +24 -0
- package/dist/cli/commands/skillset-uninstall-action.js.map +1 -0
- package/dist/cli/commands/skillset-update-action.d.ts +7 -0
- package/dist/cli/commands/skillset-update-action.d.ts.map +1 -0
- package/dist/cli/commands/skillset-update-action.js +84 -0
- package/dist/cli/commands/skillset-update-action.js.map +1 -0
- package/dist/cli/commands/skillset-validate-action.d.ts +4 -0
- package/dist/cli/commands/skillset-validate-action.d.ts.map +1 -0
- package/dist/cli/commands/skillset-validate-action.js +49 -0
- package/dist/cli/commands/skillset-validate-action.js.map +1 -0
- package/dist/cli/commands/skillset.d.ts +3 -0
- package/dist/cli/commands/skillset.d.ts.map +1 -0
- package/dist/cli/commands/skillset.js +70 -0
- package/dist/cli/commands/skillset.js.map +1 -0
- package/dist/cli/commands/update-action.d.ts +7 -0
- package/dist/cli/commands/update-action.d.ts.map +1 -0
- package/dist/cli/commands/update-action.js +65 -0
- package/dist/cli/commands/update-action.js.map +1 -0
- package/dist/cli/commands/update.d.ts +3 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +13 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +9 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/core/config.d.ts +18 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +42 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/installer.d.ts +2 -0
- package/dist/core/installer.d.ts.map +1 -1
- package/dist/core/installer.js.map +1 -1
- package/dist/core/manifest.d.ts +3 -1
- package/dist/core/manifest.d.ts.map +1 -1
- package/dist/core/manifest.js +27 -0
- package/dist/core/manifest.js.map +1 -1
- package/dist/core/resolver.d.ts.map +1 -1
- package/dist/core/resolver.js +2 -0
- package/dist/core/resolver.js.map +1 -1
- package/dist/core/skillset-installer.d.ts +21 -0
- package/dist/core/skillset-installer.d.ts.map +1 -0
- package/dist/core/skillset-installer.js +116 -0
- package/dist/core/skillset-installer.js.map +1 -0
- package/dist/core/skillset-validator.d.ts +4 -0
- package/dist/core/skillset-validator.d.ts.map +1 -0
- package/dist/core/skillset-validator.js +272 -0
- package/dist/core/skillset-validator.js.map +1 -0
- package/dist/core/suggest-agent.d.ts.map +1 -1
- package/dist/core/suggest-agent.js +23 -22
- package/dist/core/suggest-agent.js.map +1 -1
- package/dist/core/validator.d.ts.map +1 -1
- package/dist/core/validator.js +105 -23
- package/dist/core/validator.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +111 -6
- package/dist/mcp/server.js.map +1 -1
- package/dist/registry/index.d.ts +2 -0
- package/dist/registry/index.d.ts.map +1 -1
- package/dist/registry/index.js +1 -1
- package/dist/registry/index.js.map +1 -1
- package/dist/registry/sources/github.d.ts.map +1 -1
- package/dist/registry/sources/github.js +11 -3
- package/dist/registry/sources/github.js.map +1 -1
- package/dist/registry/sources/registry.d.ts +108 -0
- package/dist/registry/sources/registry.d.ts.map +1 -0
- package/dist/registry/sources/registry.js +124 -0
- package/dist/registry/sources/registry.js.map +1 -0
- package/dist/types/manifest.d.ts +13 -0
- package/dist/types/manifest.d.ts.map +1 -1
- package/dist/types/scope.d.ts +1 -0
- package/dist/types/scope.d.ts.map +1 -1
- package/dist/types/skillset.d.ts +26 -0
- package/dist/types/skillset.d.ts.map +1 -0
- package/dist/types/skillset.js +2 -0
- package/dist/types/skillset.js.map +1 -0
- package/package.json +10 -4
package/README.md
CHANGED
|
@@ -23,6 +23,8 @@ skillpm list
|
|
|
23
23
|
- [Scope System](#scope-system)
|
|
24
24
|
- [Format Validation & Scoring](#format-validation--scoring)
|
|
25
25
|
- [Agent Suggestion Loop](#agent-suggestion-loop)
|
|
26
|
+
- [Skillsets](#skillsets)
|
|
27
|
+
- [Configuration](#configuration)
|
|
26
28
|
- [Claude Code Integration (MCP)](#claude-code-integration-mcp)
|
|
27
29
|
- [Documentation](#documentation)
|
|
28
30
|
- [Contributing](#contributing)
|
|
@@ -33,15 +35,35 @@ skillpm list
|
|
|
33
35
|
|
|
34
36
|
**Requirements:** Node.js 20+
|
|
35
37
|
|
|
38
|
+
**npm** (all platforms)
|
|
39
|
+
```bash
|
|
40
|
+
npm install -g skilldex-cli
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**Homebrew** (macOS/Linux)
|
|
44
|
+
```bash
|
|
45
|
+
brew tap pandemonium-research/skilldex
|
|
46
|
+
brew install skilldex-cli
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**curl** (macOS/Linux)
|
|
50
|
+
```bash
|
|
51
|
+
curl -fsSL https://skilldex-web.vercel.app/install.sh | sh
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**Scoop** (Windows)
|
|
55
|
+
```bash
|
|
56
|
+
scoop bucket add skilldex https://github.com/Pandemonium-Research/scoop-skilldex
|
|
57
|
+
scoop install skilldex-cli
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**From source**
|
|
36
61
|
```bash
|
|
37
|
-
# From source (current)
|
|
38
62
|
git clone https://github.com/Pandemonium-Research/Skilldex.git
|
|
39
63
|
cd Skilldex
|
|
40
64
|
npm install
|
|
41
65
|
npm run build
|
|
42
66
|
npm link # makes skillpm / spm available globally
|
|
43
|
-
|
|
44
|
-
# Future: npm install -g skilldex
|
|
45
67
|
```
|
|
46
68
|
|
|
47
69
|
Both `skillpm` and `spm` are identical — `spm` is a convenience alias:
|
|
@@ -107,6 +129,48 @@ skillpm list
|
|
|
107
129
|
skillpm uninstall forensics-agent --scope project
|
|
108
130
|
```
|
|
109
131
|
|
|
132
|
+
### Update an installed skill
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
skillpm update forensics-agent --scope project
|
|
136
|
+
|
|
137
|
+
# Update all skills in a scope
|
|
138
|
+
skillpm update --all --scope project
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Skills must have been installed from a `git+https://` URL or the registry to be updatable. Local-path installs are skipped.
|
|
142
|
+
|
|
143
|
+
### Search the registry
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
skillpm search forensics
|
|
147
|
+
|
|
148
|
+
# Filter by trust tier or sort order
|
|
149
|
+
skillpm search ctf --tier verified --sort score --limit 20
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
```
|
|
153
|
+
Found 3 skills for "forensics" (showing 3)
|
|
154
|
+
|
|
155
|
+
forensics-agent [verified]
|
|
156
|
+
Full forensic investigation workflow for CTF and incident response
|
|
157
|
+
Score: 91/100 · Installs: 412 · Spec: v1.0
|
|
158
|
+
Tags: forensics, ctf, analysis
|
|
159
|
+
skillpm install forensics-agent
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Publish a skill
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
# Run from inside your skill directory — source URL is auto-detected from git remote
|
|
166
|
+
skillpm publish --tags forensics,analysis
|
|
167
|
+
|
|
168
|
+
# Re-score an already-published skill after changes
|
|
169
|
+
skillpm publish --update
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Requires an auth token: get one at `https://registry.skilldex.dev/auth/github`, then `skillpm config set token <token>`.
|
|
173
|
+
|
|
110
174
|
### AI-powered skill suggestions
|
|
111
175
|
|
|
112
176
|
```bash
|
|
@@ -126,10 +190,14 @@ Full reference: [docs/cli.md](docs/cli.md)
|
|
|
126
190
|
|---|---|
|
|
127
191
|
| `skillpm install <source>` | Install from local path or `git+https://` URL |
|
|
128
192
|
| `skillpm uninstall <name>` | Remove a skill from a scope |
|
|
193
|
+
| `skillpm update [name]` | Re-fetch and reinstall a skill from its source |
|
|
129
194
|
| `skillpm list` | Show all installed skills across scopes |
|
|
130
195
|
| `skillpm validate [path]` | Validate format + show score |
|
|
196
|
+
| `skillpm search <query>` | Search the Skilldex registry |
|
|
131
197
|
| `skillpm suggest` | AI-powered suggestion loop |
|
|
132
|
-
| `skillpm publish` | Publish to registry
|
|
198
|
+
| `skillpm publish` | Publish a skill to the registry |
|
|
199
|
+
| `skillpm skillset <subcommand>` | Manage skillsets (bundles of skills) |
|
|
200
|
+
| `skillpm config <subcommand>` | View and set Skilldex configuration |
|
|
133
201
|
|
|
134
202
|
**Global options:**
|
|
135
203
|
|
|
@@ -244,6 +312,80 @@ This checkpoint is intentional. Most agent frameworks skip it and auto-execute.
|
|
|
244
312
|
|
|
245
313
|
---
|
|
246
314
|
|
|
315
|
+
## Skillsets
|
|
316
|
+
|
|
317
|
+
A skillset is a named bundle of related skills distributed together — for example, a `ctf-toolkit` skillset that installs `forensics-agent`, `pwn-agent`, and `web-recon` in one step.
|
|
318
|
+
|
|
319
|
+
```bash
|
|
320
|
+
# Scaffold a new skillset
|
|
321
|
+
skillpm skillset init my-toolkit
|
|
322
|
+
|
|
323
|
+
# Install a skillset from a local path, git URL, or registry
|
|
324
|
+
skillpm skillset install ./my-toolkit --scope project
|
|
325
|
+
skillpm skillset install git+https://github.com/user/ctf-toolkit --scope project
|
|
326
|
+
|
|
327
|
+
# List installed skillsets
|
|
328
|
+
skillpm skillset list
|
|
329
|
+
|
|
330
|
+
# Validate a skillset directory
|
|
331
|
+
skillpm skillset validate ./my-toolkit
|
|
332
|
+
|
|
333
|
+
# Update an installed skillset from its source
|
|
334
|
+
skillpm skillset update ctf-toolkit --scope project
|
|
335
|
+
skillpm skillset update --all --scope project
|
|
336
|
+
|
|
337
|
+
# Uninstall a skillset and all its skills
|
|
338
|
+
skillpm skillset uninstall ctf-toolkit --scope project
|
|
339
|
+
|
|
340
|
+
# Publish a skillset to the registry
|
|
341
|
+
skillpm skillset publish --tags ctf,forensics
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
**`skillset` subcommands:**
|
|
345
|
+
|
|
346
|
+
| Subcommand | Description |
|
|
347
|
+
|---|---|
|
|
348
|
+
| `skillset init [name]` | Scaffold a new skillset directory with a `SKILLSET.md` template |
|
|
349
|
+
| `skillset install <source>` | Install from local path, git URL, or registry |
|
|
350
|
+
| `skillset uninstall <name>` | Remove an installed skillset and its skills |
|
|
351
|
+
| `skillset list` | List installed skillsets |
|
|
352
|
+
| `skillset validate [path]` | Validate structure and score `SKILLSET.md` |
|
|
353
|
+
| `skillset update [name]` | Re-fetch and reinstall from source |
|
|
354
|
+
| `skillset publish` | Publish to the Skilldex registry |
|
|
355
|
+
|
|
356
|
+
---
|
|
357
|
+
|
|
358
|
+
## Configuration
|
|
359
|
+
|
|
360
|
+
Skilldex stores persistent configuration in `~/.skilldex/config.json`. Values here are overridden by their corresponding environment variables.
|
|
361
|
+
|
|
362
|
+
```bash
|
|
363
|
+
# Show all current config values
|
|
364
|
+
skillpm config get
|
|
365
|
+
|
|
366
|
+
# Get or set a specific key
|
|
367
|
+
skillpm config get registryUrl
|
|
368
|
+
skillpm config set anthropicApiKey sk-ant-...
|
|
369
|
+
skillpm config set defaultScope project
|
|
370
|
+
|
|
371
|
+
# Remove a key
|
|
372
|
+
skillpm config unset token
|
|
373
|
+
|
|
374
|
+
# List all valid keys with descriptions
|
|
375
|
+
skillpm config list
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
**Config keys:**
|
|
379
|
+
|
|
380
|
+
| Key | Environment variable | Description |
|
|
381
|
+
|---|---|---|
|
|
382
|
+
| `registryUrl` | `SKILLDEX_REGISTRY_URL` | Registry API base URL |
|
|
383
|
+
| `token` | `SKILLDEX_TOKEN` | Publisher auth token |
|
|
384
|
+
| `anthropicApiKey` | `ANTHROPIC_API_KEY` | Anthropic API key for `suggest` |
|
|
385
|
+
| `defaultScope` | `SKILLDEX_DEFAULT_SCOPE` | Default install scope (`global`, `shared`, or `project`) |
|
|
386
|
+
|
|
387
|
+
---
|
|
388
|
+
|
|
247
389
|
## Claude Code Integration (MCP)
|
|
248
390
|
|
|
249
391
|
Full reference: [docs/mcp.md](docs/mcp.md)
|
|
@@ -281,7 +423,7 @@ Once configured, Claude Code can:
|
|
|
281
423
|
| `skilldex_list` | List installed skills |
|
|
282
424
|
| `skilldex_validate` | Validate and score a skill |
|
|
283
425
|
| `skilldex_suggest` | Generate skill suggestions |
|
|
284
|
-
| `skilldex_search` | Search registry
|
|
426
|
+
| `skilldex_search` | Search the registry |
|
|
285
427
|
|
|
286
428
|
---
|
|
287
429
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAwBxC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqGrD"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { readConfig, writeConfig } from '../../core/config.js';
|
|
3
|
+
import { printJson, printError, printSuccess } from '../ui/output.js';
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
const CONFIG_PATH = () => path.join(os.homedir(), '.skilldex', 'config.json');
|
|
7
|
+
const VALID_KEYS = [
|
|
8
|
+
'registryUrl',
|
|
9
|
+
'token',
|
|
10
|
+
'anthropicApiKey',
|
|
11
|
+
'defaultScope',
|
|
12
|
+
];
|
|
13
|
+
const KEY_DESCRIPTIONS = {
|
|
14
|
+
registryUrl: 'Registry API base URL (overrides SKILLDEX_REGISTRY_URL)',
|
|
15
|
+
token: 'Publisher auth token (overrides SKILLDEX_TOKEN)',
|
|
16
|
+
anthropicApiKey: 'Anthropic API key for suggest command (overrides ANTHROPIC_API_KEY)',
|
|
17
|
+
defaultScope: 'Default install scope: global, shared, or project (overrides SKILLDEX_DEFAULT_SCOPE)',
|
|
18
|
+
};
|
|
19
|
+
export function registerConfig(program) {
|
|
20
|
+
const cmd = program
|
|
21
|
+
.command('config')
|
|
22
|
+
.description('View and set Skilldex configuration');
|
|
23
|
+
cmd
|
|
24
|
+
.command('get [key]')
|
|
25
|
+
.description('Get a config value (or all values if no key given)')
|
|
26
|
+
.option('--json', 'Output as JSON')
|
|
27
|
+
.action(async (key, options) => {
|
|
28
|
+
const config = await readConfig();
|
|
29
|
+
if (!key) {
|
|
30
|
+
if (options.json) {
|
|
31
|
+
printJson(config);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
console.log(chalk.dim(`Config file: ${CONFIG_PATH()}\n`));
|
|
35
|
+
if (Object.keys(config).length === 0) {
|
|
36
|
+
console.log(chalk.dim('No configuration set. Use `skillpm config set <key> <value>` to configure.'));
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
for (const k of VALID_KEYS) {
|
|
40
|
+
const val = config[k];
|
|
41
|
+
if (val !== undefined) {
|
|
42
|
+
const masked = k === 'token' || k === 'anthropicApiKey'
|
|
43
|
+
? val.slice(0, 6) + '…'
|
|
44
|
+
: val;
|
|
45
|
+
console.log(` ${chalk.cyan(k.padEnd(20))} ${masked}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (!VALID_KEYS.includes(key)) {
|
|
53
|
+
printError(`Unknown config key "${key}". Valid keys: ${VALID_KEYS.join(', ')}`);
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
const val = config[key];
|
|
57
|
+
if (val === undefined) {
|
|
58
|
+
console.log(chalk.dim(`(not set)`));
|
|
59
|
+
}
|
|
60
|
+
else if (options.json) {
|
|
61
|
+
printJson({ [key]: val });
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
console.log(val);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
cmd
|
|
68
|
+
.command('set <key> <value>')
|
|
69
|
+
.description('Set a config value')
|
|
70
|
+
.action(async (key, value) => {
|
|
71
|
+
if (!VALID_KEYS.includes(key)) {
|
|
72
|
+
printError(`Unknown config key "${key}". Valid keys: ${VALID_KEYS.join(', ')}`);
|
|
73
|
+
console.log('');
|
|
74
|
+
for (const k of VALID_KEYS) {
|
|
75
|
+
console.log(` ${chalk.cyan(k.padEnd(20))} ${chalk.dim(KEY_DESCRIPTIONS[k])}`);
|
|
76
|
+
}
|
|
77
|
+
process.exit(1);
|
|
78
|
+
}
|
|
79
|
+
if (key === 'defaultScope' && !['global', 'shared', 'project'].includes(value)) {
|
|
80
|
+
printError('defaultScope must be one of: global, shared, project');
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
83
|
+
const config = await readConfig();
|
|
84
|
+
config[key] = value;
|
|
85
|
+
await writeConfig(config);
|
|
86
|
+
printSuccess(`Set ${key} in ${CONFIG_PATH()}`);
|
|
87
|
+
});
|
|
88
|
+
cmd
|
|
89
|
+
.command('unset <key>')
|
|
90
|
+
.description('Remove a config value')
|
|
91
|
+
.action(async (key) => {
|
|
92
|
+
if (!VALID_KEYS.includes(key)) {
|
|
93
|
+
printError(`Unknown config key "${key}". Valid keys: ${VALID_KEYS.join(', ')}`);
|
|
94
|
+
process.exit(1);
|
|
95
|
+
}
|
|
96
|
+
const config = await readConfig();
|
|
97
|
+
delete config[key];
|
|
98
|
+
await writeConfig(config);
|
|
99
|
+
printSuccess(`Unset ${key}`);
|
|
100
|
+
});
|
|
101
|
+
cmd
|
|
102
|
+
.command('list')
|
|
103
|
+
.description('List all valid config keys and their descriptions')
|
|
104
|
+
.action(() => {
|
|
105
|
+
console.log(chalk.bold('\nConfig keys:'));
|
|
106
|
+
for (const k of VALID_KEYS) {
|
|
107
|
+
console.log(` ${chalk.cyan(k.padEnd(20))} ${chalk.dim(KEY_DESCRIPTIONS[k])}`);
|
|
108
|
+
}
|
|
109
|
+
console.log('');
|
|
110
|
+
console.log(chalk.dim('Environment variables always override config file values.'));
|
|
111
|
+
console.log(chalk.dim(`Config file: ${CONFIG_PATH()}`));
|
|
112
|
+
console.log('');
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-action.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/install-action.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"install-action.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/install-action.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAUtD,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC5D,OAAO,CAAC,IAAI,CAAC,CA6Cf"}
|
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
import ora from 'ora';
|
|
2
2
|
import { installFromPath } from '../../core/installer.js';
|
|
3
3
|
import { printValidationReport, printJson, printError, printSuccess } from '../ui/output.js';
|
|
4
|
+
function isRegistryName(source) {
|
|
5
|
+
// A plain skill name: no path separators, no git+, no protocol, no dots suggesting a path
|
|
6
|
+
return !source.startsWith('git+') && !source.startsWith('/') && !source.startsWith('./') &&
|
|
7
|
+
!source.startsWith('../') && !source.includes('://') && !source.endsWith('.md');
|
|
8
|
+
}
|
|
4
9
|
export async function runInstall(source, options) {
|
|
5
10
|
const isGitUrl = source.startsWith('git+');
|
|
11
|
+
if (!isGitUrl && isRegistryName(source)) {
|
|
12
|
+
await runRegistryInstall(source, options);
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
6
15
|
if (isGitUrl) {
|
|
7
16
|
await runGitInstall(source, options);
|
|
8
17
|
return;
|
|
@@ -43,6 +52,59 @@ export async function runInstall(source, options) {
|
|
|
43
52
|
process.exit(1);
|
|
44
53
|
}
|
|
45
54
|
}
|
|
55
|
+
async function runRegistryInstall(name, options) {
|
|
56
|
+
const spinner = options.json ? null : ora(`Looking up "${name}" in registry...`).start();
|
|
57
|
+
try {
|
|
58
|
+
const { getSkillInstallInfo } = await import('../../registry/sources/registry.js');
|
|
59
|
+
const info = await getSkillInstallInfo(name);
|
|
60
|
+
if (spinner)
|
|
61
|
+
spinner.text = `Installing "${name}" from ${info.source_url}...`;
|
|
62
|
+
const { installFromGitUrl } = await import('../../registry/sources/github.js');
|
|
63
|
+
const { resolveScope } = await import('../../core/resolver.js');
|
|
64
|
+
const scopeConfig = await resolveScope(options.scope);
|
|
65
|
+
const result = await installFromGitUrl(`git+${info.source_url}`, scopeConfig, {
|
|
66
|
+
scope: options.scope,
|
|
67
|
+
force: options.force,
|
|
68
|
+
sourceUrl: info.source_url,
|
|
69
|
+
onMultipleSkills: async (names) => {
|
|
70
|
+
if (spinner)
|
|
71
|
+
spinner.stop();
|
|
72
|
+
const { select } = await import('@inquirer/prompts');
|
|
73
|
+
return select({
|
|
74
|
+
message: 'Multiple skills found in repo. Which one would you like to install?',
|
|
75
|
+
choices: names.map(n => ({ name: n, value: n })),
|
|
76
|
+
});
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
if (spinner)
|
|
80
|
+
spinner.succeed(`Installed "${result.skillName}" at ${result.scope} scope`);
|
|
81
|
+
if (options.json) {
|
|
82
|
+
printJson({
|
|
83
|
+
installed: true,
|
|
84
|
+
skillName: result.skillName,
|
|
85
|
+
scope: result.scope,
|
|
86
|
+
score: result.validation.score,
|
|
87
|
+
diagnostics: result.validation.diagnostics,
|
|
88
|
+
trust_tier: info.trust_tier,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
if (result.validation.warnCount > 0 || result.validation.errorCount > 0) {
|
|
93
|
+
console.log('');
|
|
94
|
+
printValidationReport(result.validation);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
printSuccess(`Score: ${result.validation.score}/100 · Trust: ${info.trust_tier}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch (e) {
|
|
102
|
+
if (spinner)
|
|
103
|
+
spinner.fail();
|
|
104
|
+
printError(e instanceof Error ? e.message : String(e));
|
|
105
|
+
process.exit(1);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
46
108
|
async function runGitInstall(gitUrl, options) {
|
|
47
109
|
const spinner = options.json ? null : ora(`Cloning ${gitUrl}...`).start();
|
|
48
110
|
try {
|
|
@@ -53,6 +115,15 @@ async function runGitInstall(gitUrl, options) {
|
|
|
53
115
|
scope: options.scope,
|
|
54
116
|
force: options.force,
|
|
55
117
|
sourceUrl: gitUrl,
|
|
118
|
+
onMultipleSkills: async (names) => {
|
|
119
|
+
if (spinner)
|
|
120
|
+
spinner.stop();
|
|
121
|
+
const { select } = await import('@inquirer/prompts');
|
|
122
|
+
return select({
|
|
123
|
+
message: 'Multiple skills found in repo. Which one would you like to install?',
|
|
124
|
+
choices: names.map(n => ({ name: n, value: n })),
|
|
125
|
+
});
|
|
126
|
+
},
|
|
56
127
|
});
|
|
57
128
|
if (spinner)
|
|
58
129
|
spinner.succeed(`Installed "${result.skillName}" at ${result.scope} scope`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-action.js","sourceRoot":"","sources":["../../../src/cli/commands/install-action.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAA;AAErB,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,EAAE,qBAAqB,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"install-action.js","sourceRoot":"","sources":["../../../src/cli/commands/install-action.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGxC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGxC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CActD"}
|
|
@@ -6,8 +6,11 @@ export function registerInstall(program) {
|
|
|
6
6
|
.option('-f, --force', 'Overwrite if already installed', false)
|
|
7
7
|
.option('--json', 'Output as JSON')
|
|
8
8
|
.action(async (source, options) => {
|
|
9
|
+
const { getConfigValue } = await import('../../core/config.js');
|
|
10
|
+
const defaultScope = (await getConfigValue('defaultScope')) ?? 'project';
|
|
11
|
+
const scope = options.scope ?? defaultScope;
|
|
9
12
|
const { runInstall } = await import('./install-action.js');
|
|
10
|
-
await runInstall(source, options);
|
|
13
|
+
await runInstall(source, { ...options, scope: scope });
|
|
11
14
|
});
|
|
12
15
|
}
|
|
13
16
|
//# sourceMappingURL=install.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/cli/commands/install.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,OAAO;SACJ,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,yDAAyD,CAAC;SACtE,MAAM,CAAC,qBAAqB,EAAE,gDAAgD,EAAE,SAAS,CAAC;SAC1F,MAAM,CAAC,aAAa,EAAE,gCAAgC,EAAE,KAAK,CAAC;SAC9D,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,OAA6D,EAAE,EAAE;QAC9F,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAA;QAC1D,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/cli/commands/install.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,OAAO;SACJ,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,yDAAyD,CAAC;SACtE,MAAM,CAAC,qBAAqB,EAAE,gDAAgD,EAAE,SAAS,CAAC;SAC1F,MAAM,CAAC,aAAa,EAAE,gCAAgC,EAAE,KAAK,CAAC;SAC9D,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,OAA6D,EAAE,EAAE;QAC9F,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAA;QAC/D,MAAM,YAAY,GAAG,CAAC,MAAM,cAAc,CAAC,cAAc,CAAC,CAAC,IAAI,SAAS,CAAA;QACxE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,YAAY,CAAA;QAC3C,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAA;QAC1D,MAAM,UAAU,CAAC,MAAM,EAAE,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,KAAmB,EAAE,CAAC,CAAA;IACtE,CAAC,CAAC,CAAA;AACN,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-action.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/list-action.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"list-action.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/list-action.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAOtD,wBAAsB,OAAO,CAAC,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgD3F"}
|
|
@@ -2,6 +2,7 @@ import chalk from 'chalk';
|
|
|
2
2
|
import { resolveAllScopes, resolveScope } from '../../core/resolver.js';
|
|
3
3
|
import { readManifest } from '../../core/manifest.js';
|
|
4
4
|
import { printJson, printError } from '../ui/output.js';
|
|
5
|
+
import { SPEC_VERSION } from '../../core/validator.js';
|
|
5
6
|
export async function runList(options) {
|
|
6
7
|
try {
|
|
7
8
|
const scopeConfigs = options.scope
|
|
@@ -31,7 +32,10 @@ export async function runList(options) {
|
|
|
31
32
|
for (const skill of skills) {
|
|
32
33
|
const score = skill.score >= 80 ? chalk.green(`${skill.score}`) :
|
|
33
34
|
skill.score >= 50 ? chalk.yellow(`${skill.score}`) : chalk.red(`${skill.score}`);
|
|
34
|
-
|
|
35
|
+
const stale = skill.specVersion !== SPEC_VERSION
|
|
36
|
+
? chalk.yellow(` [spec v${skill.specVersion} → run: skillpm update ${skill.name}]`)
|
|
37
|
+
: '';
|
|
38
|
+
console.log(` ${chalk.cyan(skill.name.padEnd(30))} score: ${score}/100 source: ${chalk.dim(skill.source)}${stale}`);
|
|
35
39
|
}
|
|
36
40
|
}
|
|
37
41
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-action.js","sourceRoot":"","sources":["../../../src/cli/commands/list-action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"list-action.js","sourceRoot":"","sources":["../../../src/cli/commands/list-action.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/publish.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/publish.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAsCxC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqFtD"}
|
|
@@ -1,10 +1,124 @@
|
|
|
1
|
+
import { readFile } from 'fs/promises';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { parse as parseYaml } from 'yaml';
|
|
5
|
+
import { simpleGit } from 'simple-git';
|
|
6
|
+
import { publishSkill, updateSkill } from '../../registry/sources/registry.js';
|
|
7
|
+
import { printJson, printError, printSuccess, printWarning, printInfo } from '../ui/output.js';
|
|
8
|
+
async function detectSourceUrl(skillPath) {
|
|
9
|
+
try {
|
|
10
|
+
const git = simpleGit(skillPath);
|
|
11
|
+
const remotes = await git.getRemotes(true);
|
|
12
|
+
const origin = remotes.find(r => r.name === 'origin');
|
|
13
|
+
if (!origin?.refs?.fetch)
|
|
14
|
+
return null;
|
|
15
|
+
// Normalise SSH → HTTPS and strip .git suffix
|
|
16
|
+
let url = origin.refs.fetch;
|
|
17
|
+
url = url.replace(/^git@github\.com:/, 'https://github.com/');
|
|
18
|
+
url = url.replace(/\.git$/, '');
|
|
19
|
+
return url;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
async function readSkillName(skillPath) {
|
|
26
|
+
try {
|
|
27
|
+
const content = await readFile(join(skillPath, 'SKILL.md'), 'utf-8');
|
|
28
|
+
const match = content.match(/^---\n([\s\S]*?)\n---/);
|
|
29
|
+
if (!match)
|
|
30
|
+
return null;
|
|
31
|
+
const fm = parseYaml(match[1]);
|
|
32
|
+
return typeof fm['name'] === 'string' ? fm['name'] : null;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
1
38
|
export function registerPublish(program) {
|
|
2
39
|
program
|
|
3
40
|
.command('publish')
|
|
4
|
-
.description('Publish a skill to the Skilldex registry
|
|
5
|
-
.
|
|
6
|
-
|
|
7
|
-
|
|
41
|
+
.description('Publish a skill to the Skilldex registry')
|
|
42
|
+
.option('--source-url <url>', 'GitHub URL of the skill (auto-detected from git remote if omitted)')
|
|
43
|
+
.option('--tags <tags>', 'Comma-separated tags (e.g. forensics,analysis)')
|
|
44
|
+
.option('--update', 'Re-fetch and re-score an already-published skill')
|
|
45
|
+
.option('--json', 'Output as JSON')
|
|
46
|
+
.action(async (options) => {
|
|
47
|
+
const { getConfigValue } = await import('../../core/config.js');
|
|
48
|
+
const token = await getConfigValue('token');
|
|
49
|
+
if (!token) {
|
|
50
|
+
printError('No auth token found. Get your token from https://registry.skilldex.dev/auth/github, then run: skillpm config set token <token>');
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
const skillPath = process.cwd();
|
|
54
|
+
const spinner = options.json ? null : ora('Reading skill...').start();
|
|
55
|
+
try {
|
|
56
|
+
const skillName = await readSkillName(skillPath);
|
|
57
|
+
if (!skillName) {
|
|
58
|
+
if (spinner)
|
|
59
|
+
spinner.fail();
|
|
60
|
+
printError('Could not read skill name from SKILL.md frontmatter. Make sure you are in a skill folder.');
|
|
61
|
+
process.exit(1);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
if (options.update) {
|
|
65
|
+
if (spinner)
|
|
66
|
+
spinner.text = `Re-fetching and re-scoring "${skillName}"...`;
|
|
67
|
+
const result = await updateSkill(token, skillName);
|
|
68
|
+
if (spinner)
|
|
69
|
+
spinner.succeed(`Updated "${skillName}"`);
|
|
70
|
+
if (options.json) {
|
|
71
|
+
printJson(result);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
printSuccess(`Score: ${result.skill.score ?? 'n/a'}/100`);
|
|
75
|
+
for (const d of result.diagnostics) {
|
|
76
|
+
const loc = d.line !== undefined ? `line ${d.line}: ` : '';
|
|
77
|
+
if (d.level === 'error')
|
|
78
|
+
printError(`${loc}${d.message}`);
|
|
79
|
+
else
|
|
80
|
+
printWarning(`${loc}${d.message}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
// Detect source URL — explicit flag wins, then git remote
|
|
86
|
+
const detectedUrl = options.sourceUrl ?? (await detectSourceUrl(skillPath));
|
|
87
|
+
if (!detectedUrl) {
|
|
88
|
+
if (spinner)
|
|
89
|
+
spinner.fail();
|
|
90
|
+
printError('Could not detect GitHub URL from git remote. Pass --source-url <url> explicitly.');
|
|
91
|
+
process.exit(1);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const tags = options.tags ? options.tags.split(',').map(t => t.trim()).filter(Boolean) : [];
|
|
95
|
+
if (spinner)
|
|
96
|
+
spinner.text = `Publishing "${skillName}" to registry...`;
|
|
97
|
+
const result = await publishSkill(token, { name: skillName, source_url: detectedUrl, tags });
|
|
98
|
+
if (spinner)
|
|
99
|
+
spinner.succeed(`Published "${skillName}"`);
|
|
100
|
+
if (options.json) {
|
|
101
|
+
printJson(result);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
printInfo(`Source: ${detectedUrl}`);
|
|
105
|
+
printSuccess(`Score: ${result.skill.score ?? 'n/a'}/100`);
|
|
106
|
+
for (const d of result.diagnostics) {
|
|
107
|
+
const loc = d.line !== undefined ? `line ${d.line}: ` : '';
|
|
108
|
+
if (d.level === 'error')
|
|
109
|
+
printError(`${loc}${d.message}`);
|
|
110
|
+
else
|
|
111
|
+
printWarning(`${loc}${d.message}`);
|
|
112
|
+
}
|
|
113
|
+
printInfo(`Install with: skillpm install ${skillName}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch (e) {
|
|
117
|
+
if (spinner)
|
|
118
|
+
spinner.fail();
|
|
119
|
+
printError(e instanceof Error ? e.message : String(e));
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
8
122
|
});
|
|
9
123
|
}
|
|
10
124
|
//# sourceMappingURL=publish.js.map
|