skilldex-cli 0.1.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/README.md +147 -5
  2. package/dist/cli/commands/config.d.ts +3 -0
  3. package/dist/cli/commands/config.d.ts.map +1 -0
  4. package/dist/cli/commands/config.js +115 -0
  5. package/dist/cli/commands/config.js.map +1 -0
  6. package/dist/cli/commands/install-action.d.ts.map +1 -1
  7. package/dist/cli/commands/install-action.js +71 -0
  8. package/dist/cli/commands/install-action.js.map +1 -1
  9. package/dist/cli/commands/install.d.ts.map +1 -1
  10. package/dist/cli/commands/install.js +4 -1
  11. package/dist/cli/commands/install.js.map +1 -1
  12. package/dist/cli/commands/list-action.d.ts.map +1 -1
  13. package/dist/cli/commands/list-action.js +5 -1
  14. package/dist/cli/commands/list-action.js.map +1 -1
  15. package/dist/cli/commands/publish.d.ts.map +1 -1
  16. package/dist/cli/commands/publish.js +118 -4
  17. package/dist/cli/commands/publish.js.map +1 -1
  18. package/dist/cli/commands/search-action.d.ts +7 -0
  19. package/dist/cli/commands/search-action.d.ts.map +1 -0
  20. package/dist/cli/commands/search-action.js +61 -0
  21. package/dist/cli/commands/search-action.js.map +1 -0
  22. package/dist/cli/commands/search.d.ts +3 -0
  23. package/dist/cli/commands/search.d.ts.map +1 -0
  24. package/dist/cli/commands/search.js +14 -0
  25. package/dist/cli/commands/search.js.map +1 -0
  26. package/dist/cli/commands/skillset-init-action.d.ts +2 -0
  27. package/dist/cli/commands/skillset-init-action.d.ts.map +1 -0
  28. package/dist/cli/commands/skillset-init-action.js +65 -0
  29. package/dist/cli/commands/skillset-init-action.js.map +1 -0
  30. package/dist/cli/commands/skillset-install-action.d.ts +7 -0
  31. package/dist/cli/commands/skillset-install-action.d.ts.map +1 -0
  32. package/dist/cli/commands/skillset-install-action.js +174 -0
  33. package/dist/cli/commands/skillset-install-action.js.map +1 -0
  34. package/dist/cli/commands/skillset-list-action.d.ts +6 -0
  35. package/dist/cli/commands/skillset-list-action.d.ts.map +1 -0
  36. package/dist/cli/commands/skillset-list-action.js +46 -0
  37. package/dist/cli/commands/skillset-list-action.js.map +1 -0
  38. package/dist/cli/commands/skillset-publish-action.d.ts +7 -0
  39. package/dist/cli/commands/skillset-publish-action.d.ts.map +1 -0
  40. package/dist/cli/commands/skillset-publish-action.js +113 -0
  41. package/dist/cli/commands/skillset-publish-action.js.map +1 -0
  42. package/dist/cli/commands/skillset-uninstall-action.d.ts +6 -0
  43. package/dist/cli/commands/skillset-uninstall-action.d.ts.map +1 -0
  44. package/dist/cli/commands/skillset-uninstall-action.js +24 -0
  45. package/dist/cli/commands/skillset-uninstall-action.js.map +1 -0
  46. package/dist/cli/commands/skillset-update-action.d.ts +7 -0
  47. package/dist/cli/commands/skillset-update-action.d.ts.map +1 -0
  48. package/dist/cli/commands/skillset-update-action.js +84 -0
  49. package/dist/cli/commands/skillset-update-action.js.map +1 -0
  50. package/dist/cli/commands/skillset-validate-action.d.ts +4 -0
  51. package/dist/cli/commands/skillset-validate-action.d.ts.map +1 -0
  52. package/dist/cli/commands/skillset-validate-action.js +49 -0
  53. package/dist/cli/commands/skillset-validate-action.js.map +1 -0
  54. package/dist/cli/commands/skillset.d.ts +3 -0
  55. package/dist/cli/commands/skillset.d.ts.map +1 -0
  56. package/dist/cli/commands/skillset.js +70 -0
  57. package/dist/cli/commands/skillset.js.map +1 -0
  58. package/dist/cli/commands/update-action.d.ts +7 -0
  59. package/dist/cli/commands/update-action.d.ts.map +1 -0
  60. package/dist/cli/commands/update-action.js +65 -0
  61. package/dist/cli/commands/update-action.js.map +1 -0
  62. package/dist/cli/commands/update.d.ts +3 -0
  63. package/dist/cli/commands/update.d.ts.map +1 -0
  64. package/dist/cli/commands/update.js +13 -0
  65. package/dist/cli/commands/update.js.map +1 -0
  66. package/dist/cli/index.d.ts.map +1 -1
  67. package/dist/cli/index.js +9 -1
  68. package/dist/cli/index.js.map +1 -1
  69. package/dist/core/config.d.ts +18 -0
  70. package/dist/core/config.d.ts.map +1 -0
  71. package/dist/core/config.js +42 -0
  72. package/dist/core/config.js.map +1 -0
  73. package/dist/core/installer.d.ts +2 -0
  74. package/dist/core/installer.d.ts.map +1 -1
  75. package/dist/core/installer.js.map +1 -1
  76. package/dist/core/manifest.d.ts +3 -1
  77. package/dist/core/manifest.d.ts.map +1 -1
  78. package/dist/core/manifest.js +27 -0
  79. package/dist/core/manifest.js.map +1 -1
  80. package/dist/core/resolver.d.ts.map +1 -1
  81. package/dist/core/resolver.js +2 -0
  82. package/dist/core/resolver.js.map +1 -1
  83. package/dist/core/skillset-installer.d.ts +21 -0
  84. package/dist/core/skillset-installer.d.ts.map +1 -0
  85. package/dist/core/skillset-installer.js +116 -0
  86. package/dist/core/skillset-installer.js.map +1 -0
  87. package/dist/core/skillset-validator.d.ts +4 -0
  88. package/dist/core/skillset-validator.d.ts.map +1 -0
  89. package/dist/core/skillset-validator.js +272 -0
  90. package/dist/core/skillset-validator.js.map +1 -0
  91. package/dist/core/suggest-agent.d.ts.map +1 -1
  92. package/dist/core/suggest-agent.js +23 -22
  93. package/dist/core/suggest-agent.js.map +1 -1
  94. package/dist/mcp/server.d.ts.map +1 -1
  95. package/dist/mcp/server.js +111 -6
  96. package/dist/mcp/server.js.map +1 -1
  97. package/dist/registry/index.d.ts +2 -0
  98. package/dist/registry/index.d.ts.map +1 -1
  99. package/dist/registry/index.js +1 -1
  100. package/dist/registry/index.js.map +1 -1
  101. package/dist/registry/sources/github.d.ts.map +1 -1
  102. package/dist/registry/sources/github.js +11 -3
  103. package/dist/registry/sources/github.js.map +1 -1
  104. package/dist/registry/sources/registry.d.ts +108 -0
  105. package/dist/registry/sources/registry.d.ts.map +1 -0
  106. package/dist/registry/sources/registry.js +124 -0
  107. package/dist/registry/sources/registry.js.map +1 -0
  108. package/dist/types/manifest.d.ts +13 -0
  109. package/dist/types/manifest.d.ts.map +1 -1
  110. package/dist/types/scope.d.ts +1 -0
  111. package/dist/types/scope.d.ts.map +1 -1
  112. package/dist/types/skillset.d.ts +26 -0
  113. package/dist/types/skillset.d.ts.map +1 -0
  114. package/dist/types/skillset.js +2 -0
  115. package/dist/types/skillset.js.map +1 -0
  116. package/package.json +1 -1
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 *(coming soon)* |
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 *(stub — coming soon)* |
426
+ | `skilldex_search` | Search the registry |
285
427
 
286
428
  ---
287
429
 
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerConfig(program: Command): void;
3
+ //# sourceMappingURL=config.d.ts.map
@@ -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;AAItD,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,CAwCf"}
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":"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"}
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,CAWtD"}
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;IACnC,CAAC,CAAC,CAAA;AACN,CAAC"}
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;AAMtD,wBAAsB,OAAO,CAAC,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6C3F"}
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
- console.log(` ${chalk.cyan(skill.name.padEnd(30))} score: ${score}/100 source: ${chalk.dim(skill.source)}`);
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":"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"}
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;AAExC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAQtD"}
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 (coming soon)')
5
- .action(() => {
6
- console.error('publish is not yet implemented.');
7
- process.exit(1);
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