@skillbase/spm 0.1.4 → 0.2.1
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/CHANGELOG.md +33 -0
- package/dist/cli/command.d.ts +43 -0
- package/dist/cli/command.d.ts.map +1 -0
- package/dist/cli/command.js +8 -0
- package/dist/cli/command.js.map +1 -0
- package/dist/cli/commands/add.d.ts +17 -0
- package/dist/cli/commands/add.d.ts.map +1 -0
- package/dist/cli/commands/add.js +348 -0
- package/dist/cli/commands/add.js.map +1 -0
- package/dist/cli/commands/connect.d.ts +2 -0
- package/dist/cli/commands/connect.d.ts.map +1 -1
- package/dist/cli/commands/connect.js +28 -13
- package/dist/cli/commands/connect.js.map +1 -1
- package/dist/cli/commands/convert.d.ts +2 -0
- package/dist/cli/commands/convert.d.ts.map +1 -1
- package/dist/cli/commands/convert.js +55 -39
- package/dist/cli/commands/convert.js.map +1 -1
- package/dist/cli/commands/create.d.ts +3 -3
- package/dist/cli/commands/create.d.ts.map +1 -1
- package/dist/cli/commands/create.js +15 -15
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/info.d.ts +2 -0
- package/dist/cli/commands/info.d.ts.map +1 -1
- package/dist/cli/commands/info.js +24 -17
- package/dist/cli/commands/info.js.map +1 -1
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +13 -6
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/install.d.ts +3 -3
- package/dist/cli/commands/install.d.ts.map +1 -1
- package/dist/cli/commands/install.js +23 -240
- package/dist/cli/commands/install.js.map +1 -1
- package/dist/cli/commands/link.d.ts +4 -0
- package/dist/cli/commands/link.d.ts.map +1 -0
- package/dist/cli/commands/link.js +56 -0
- package/dist/cli/commands/link.js.map +1 -0
- package/dist/cli/commands/list.d.ts +2 -0
- package/dist/cli/commands/list.d.ts.map +1 -1
- package/dist/cli/commands/list.js +35 -12
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/login.d.ts +2 -0
- package/dist/cli/commands/login.d.ts.map +1 -1
- package/dist/cli/commands/login.js +62 -28
- package/dist/cli/commands/login.js.map +1 -1
- package/dist/cli/commands/persona.d.ts +3 -0
- package/dist/cli/commands/persona.d.ts.map +1 -0
- package/dist/cli/commands/persona.js +253 -0
- package/dist/cli/commands/persona.js.map +1 -0
- package/dist/cli/commands/publish.d.ts +2 -0
- package/dist/cli/commands/publish.d.ts.map +1 -1
- package/dist/cli/commands/publish.js +30 -32
- package/dist/cli/commands/publish.js.map +1 -1
- package/dist/cli/commands/rate.d.ts +2 -0
- package/dist/cli/commands/rate.d.ts.map +1 -1
- package/dist/cli/commands/rate.js +15 -5
- package/dist/cli/commands/rate.js.map +1 -1
- package/dist/cli/commands/reindex.d.ts +3 -0
- package/dist/cli/commands/reindex.d.ts.map +1 -0
- package/dist/cli/commands/reindex.js +35 -0
- package/dist/cli/commands/reindex.js.map +1 -0
- package/dist/cli/commands/remove.d.ts +8 -0
- package/dist/cli/commands/remove.d.ts.map +1 -0
- package/dist/cli/commands/remove.js +126 -0
- package/dist/cli/commands/remove.js.map +1 -0
- package/dist/cli/commands/search.d.ts +2 -0
- package/dist/cli/commands/search.d.ts.map +1 -1
- package/dist/cli/commands/search.js +25 -12
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/serve.d.ts +3 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +17 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/stats.d.ts +2 -0
- package/dist/cli/commands/stats.d.ts.map +1 -1
- package/dist/cli/commands/stats.js +16 -10
- package/dist/cli/commands/stats.js.map +1 -1
- package/dist/cli/commands/uninstall.d.ts +2 -0
- package/dist/cli/commands/uninstall.d.ts.map +1 -1
- package/dist/cli/commands/uninstall.js +50 -14
- package/dist/cli/commands/uninstall.js.map +1 -1
- package/dist/cli/commands/update.d.ts +2 -0
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +27 -32
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/commands/validate.d.ts +2 -0
- package/dist/cli/commands/validate.d.ts.map +1 -1
- package/dist/cli/commands/validate.js +16 -18
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/help.d.ts +7 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +72 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/index.js +5 -151
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/loader.d.ts +3 -0
- package/dist/cli/loader.d.ts.map +1 -0
- package/dist/cli/loader.js +69 -0
- package/dist/cli/loader.js.map +1 -0
- package/dist/cli/logger.d.ts +9 -0
- package/dist/cli/logger.d.ts.map +1 -0
- package/dist/cli/logger.js +13 -0
- package/dist/cli/logger.js.map +1 -0
- package/dist/cli/theme.d.ts +17 -0
- package/dist/cli/theme.d.ts.map +1 -0
- package/dist/cli/theme.js +29 -0
- package/dist/cli/theme.js.map +1 -0
- package/dist/cli/ui.d.ts +8 -0
- package/dist/cli/ui.d.ts.map +1 -0
- package/dist/cli/ui.js +17 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +4 -0
- package/dist/core/config.js.map +1 -1
- package/dist/core/paths.d.ts +2 -0
- package/dist/core/paths.d.ts.map +1 -1
- package/dist/core/paths.js +7 -0
- package/dist/core/paths.js.map +1 -1
- package/dist/core/persona.d.ts +17 -0
- package/dist/core/persona.d.ts.map +1 -0
- package/dist/core/persona.js +118 -0
- package/dist/core/persona.js.map +1 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +91 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/schema/persona-schema.d.ts +6 -0
- package/dist/schema/persona-schema.d.ts.map +1 -0
- package/dist/schema/persona-schema.js +72 -0
- package/dist/schema/persona-schema.js.map +1 -0
- package/dist/types/index.d.ts +25 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +3 -2
|
@@ -4,13 +4,18 @@ import { readConfig } from "../../core/config.js";
|
|
|
4
4
|
import { validateSkillManifest } from "../../schema/skill-schema.js";
|
|
5
5
|
import { RegistryClient } from "../../core/registry-client.js";
|
|
6
6
|
import { packSkill } from "../../core/storage/index.js";
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
7
|
+
import { log, spinner, note, exitError, formatSize } from "../ui.js";
|
|
8
|
+
export const command = {
|
|
9
|
+
name: "update",
|
|
10
|
+
description: "Update an existing skill in the registry (re-publish)",
|
|
11
|
+
group: "registry",
|
|
12
|
+
args: [{ name: "source", required: true }],
|
|
13
|
+
options: [
|
|
14
|
+
{ flags: "--registry <name>", description: "Target registry" },
|
|
15
|
+
{ flags: "--dry-run", description: "Show what would happen without executing" },
|
|
16
|
+
],
|
|
17
|
+
handler: updateCommand,
|
|
18
|
+
};
|
|
14
19
|
export async function updateCommand(source, options) {
|
|
15
20
|
const config = await readConfig();
|
|
16
21
|
let registryName = options.registry;
|
|
@@ -18,17 +23,14 @@ export async function updateCommand(source, options) {
|
|
|
18
23
|
registryName = config.scopes["*"];
|
|
19
24
|
}
|
|
20
25
|
if (!registryName) {
|
|
21
|
-
|
|
22
|
-
process.exit(1);
|
|
26
|
+
exitError("No default registry configured. Use 'skills login <url>' first.");
|
|
23
27
|
}
|
|
24
28
|
const reg = config.registries.find((r) => r.name === registryName);
|
|
25
29
|
if (!reg) {
|
|
26
|
-
|
|
27
|
-
process.exit(1);
|
|
30
|
+
exitError(`Registry "${registryName}" not found in config.`);
|
|
28
31
|
}
|
|
29
32
|
if (!reg.token) {
|
|
30
|
-
|
|
31
|
-
process.exit(1);
|
|
33
|
+
exitError(`No token for registry "${registryName}". Use 'skills login' first.`);
|
|
32
34
|
}
|
|
33
35
|
const client = new RegistryClient(reg.url, reg.token);
|
|
34
36
|
// Read and validate local skill
|
|
@@ -40,31 +42,24 @@ export async function updateCommand(source, options) {
|
|
|
40
42
|
const data = JSON.parse(raw);
|
|
41
43
|
const validation = validateSkillManifest(data);
|
|
42
44
|
if (!validation.valid) {
|
|
43
|
-
|
|
44
|
-
for (const error of validation.errors) {
|
|
45
|
-
console.error(` - ${error}`);
|
|
46
|
-
}
|
|
47
|
-
process.exit(1);
|
|
45
|
+
exitError(`Invalid skill.json:\n${validation.errors.map((e) => ` - ${e}`).join("\n")}`);
|
|
48
46
|
}
|
|
49
47
|
manifest = data;
|
|
50
48
|
}
|
|
51
49
|
catch (err) {
|
|
52
50
|
if (err.code === "ENOENT") {
|
|
53
|
-
|
|
54
|
-
process.exit(1);
|
|
51
|
+
exitError(`Cannot read skill.json in "${source}".`);
|
|
55
52
|
}
|
|
56
53
|
throw err;
|
|
57
54
|
}
|
|
58
55
|
// Verify skill exists in registry
|
|
59
56
|
const existing = await client.getSkill(manifest.author, manifest.name);
|
|
60
57
|
if (!existing) {
|
|
61
|
-
|
|
62
|
-
process.exit(1);
|
|
58
|
+
exitError(`"${manifest.author}/${manifest.name}" not found in registry. Use 'skills publish' for first-time publishing.`);
|
|
63
59
|
}
|
|
64
60
|
const previousVersion = existing.version;
|
|
65
61
|
if (!manifest.entry) {
|
|
66
|
-
|
|
67
|
-
process.exit(1);
|
|
62
|
+
exitError("skill.json has no 'entry' field. Bundles cannot be updated — only skills with an entry point.");
|
|
68
63
|
}
|
|
69
64
|
// Read entry content
|
|
70
65
|
const entryPath = path.join(skillDir, manifest.entry);
|
|
@@ -79,19 +74,19 @@ export async function updateCommand(source, options) {
|
|
|
79
74
|
}
|
|
80
75
|
}
|
|
81
76
|
// Package
|
|
82
|
-
|
|
77
|
+
const s = spinner();
|
|
78
|
+
s.start(`Packaging ${manifest.name}@${manifest.version}...`);
|
|
83
79
|
const pkg = await packSkill(skillDir);
|
|
84
80
|
if (options.dryRun) {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
console.log(` Integrity: ${pkg.integrity}`);
|
|
81
|
+
s.stop("Done (dry-run)");
|
|
82
|
+
note(`Would update ${manifest.name}@${manifest.version} (was ${previousVersion})\nPackage size: ${formatSize(pkg.size)} (${pkg.filesCount} files)\nIntegrity: ${pkg.integrity}`, "Dry run");
|
|
88
83
|
return;
|
|
89
84
|
}
|
|
90
85
|
// Publish (server handles update vs insert)
|
|
91
|
-
|
|
86
|
+
s.message(`Updating ${manifest.name} in ${reg.name}...`);
|
|
92
87
|
const result = await client.publishWithArchive({ manifest, content, compact_content: compactContent }, pkg.data);
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
88
|
+
s.stop(`Updated ${result.name}@${result.version} (was ${previousVersion})`);
|
|
89
|
+
log.info(`Size: ${formatSize(result.size ?? pkg.size)}`);
|
|
90
|
+
log.info(`Tokens: ~${Math.ceil(content.length / 4).toLocaleString()}`);
|
|
96
91
|
}
|
|
97
92
|
//# sourceMappingURL=update.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":"AAIA,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,eAAO,MAAM,OAAO,EAAE,UAMrB,CAAC;AAEF,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4DtE"}
|
|
@@ -1,19 +1,25 @@
|
|
|
1
1
|
import fs from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { validateSkillManifest } from "../../schema/skill-schema.js";
|
|
4
|
+
import { log, exitError } from "../ui.js";
|
|
5
|
+
export const command = {
|
|
6
|
+
name: "validate",
|
|
7
|
+
description: "Validate a skill directory",
|
|
8
|
+
group: "system",
|
|
9
|
+
args: [{ name: "path", required: true }],
|
|
10
|
+
handler: validateCommand,
|
|
11
|
+
};
|
|
4
12
|
export async function validateCommand(skillPath) {
|
|
5
13
|
const dir = path.resolve(skillPath);
|
|
6
14
|
// Check directory exists
|
|
7
15
|
try {
|
|
8
16
|
const stat = await fs.stat(dir);
|
|
9
17
|
if (!stat.isDirectory()) {
|
|
10
|
-
|
|
11
|
-
process.exit(1);
|
|
18
|
+
exitError(`"${skillPath}" is not a directory.`);
|
|
12
19
|
}
|
|
13
20
|
}
|
|
14
21
|
catch {
|
|
15
|
-
|
|
16
|
-
process.exit(1);
|
|
22
|
+
exitError(`"${skillPath}" does not exist.`);
|
|
17
23
|
}
|
|
18
24
|
// Check skill.json exists
|
|
19
25
|
const manifestPath = path.join(dir, "skill.json");
|
|
@@ -22,8 +28,7 @@ export async function validateCommand(skillPath) {
|
|
|
22
28
|
rawManifest = await fs.readFile(manifestPath, "utf-8");
|
|
23
29
|
}
|
|
24
30
|
catch {
|
|
25
|
-
|
|
26
|
-
process.exit(1);
|
|
31
|
+
exitError(`skill.json not found in "${skillPath}".`);
|
|
27
32
|
}
|
|
28
33
|
// Parse JSON
|
|
29
34
|
let data;
|
|
@@ -32,17 +37,12 @@ export async function validateCommand(skillPath) {
|
|
|
32
37
|
}
|
|
33
38
|
catch (err) {
|
|
34
39
|
const message = err instanceof Error ? err.message : String(err);
|
|
35
|
-
|
|
36
|
-
process.exit(1);
|
|
40
|
+
exitError(`skill.json is not valid JSON: ${message}`);
|
|
37
41
|
}
|
|
38
42
|
// Validate against schema
|
|
39
43
|
const result = validateSkillManifest(data);
|
|
40
44
|
if (!result.valid) {
|
|
41
|
-
|
|
42
|
-
for (const error of result.errors) {
|
|
43
|
-
console.error(` - ${error}`);
|
|
44
|
-
}
|
|
45
|
-
process.exit(1);
|
|
45
|
+
exitError(`Validation failed:\n${result.errors.map((e) => ` - ${e}`).join("\n")}`);
|
|
46
46
|
}
|
|
47
47
|
const manifest = data;
|
|
48
48
|
// Check entry file exists
|
|
@@ -52,8 +52,7 @@ export async function validateCommand(skillPath) {
|
|
|
52
52
|
await fs.access(entryPath);
|
|
53
53
|
}
|
|
54
54
|
catch {
|
|
55
|
-
|
|
56
|
-
process.exit(1);
|
|
55
|
+
exitError(`Entry file "${manifest.entry}" not found.`);
|
|
57
56
|
}
|
|
58
57
|
}
|
|
59
58
|
// Check compact_entry if specified
|
|
@@ -63,10 +62,9 @@ export async function validateCommand(skillPath) {
|
|
|
63
62
|
await fs.access(compactPath);
|
|
64
63
|
}
|
|
65
64
|
catch {
|
|
66
|
-
|
|
67
|
-
process.exit(1);
|
|
65
|
+
exitError(`compact_entry file "${manifest.compact_entry}" not found.`);
|
|
68
66
|
}
|
|
69
67
|
}
|
|
70
|
-
|
|
68
|
+
log.success(`Valid: ${manifest.name ?? skillPath}`);
|
|
71
69
|
}
|
|
72
70
|
//# sourceMappingURL=validate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
export declare function configureHelp(program: Command): void;
|
|
3
|
+
/**
|
|
4
|
+
* Tag a Commander command with a group key for help formatting.
|
|
5
|
+
*/
|
|
6
|
+
export declare function setCommandGroup(cmd: Command, group: string): void;
|
|
7
|
+
//# sourceMappingURL=help.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAQ,MAAM,WAAW,CAAC;AAI/C,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsEpD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAEjE"}
|
package/dist/cli/help.js
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { theme } from "./theme.js";
|
|
2
|
+
import { GROUPS } from "./command.js";
|
|
3
|
+
export function configureHelp(program) {
|
|
4
|
+
program.configureHelp({
|
|
5
|
+
formatHelp(cmd, helper) {
|
|
6
|
+
const lines = [];
|
|
7
|
+
// Brand header
|
|
8
|
+
const version = cmd._version;
|
|
9
|
+
lines.push("");
|
|
10
|
+
if (version) {
|
|
11
|
+
lines.push(` ${theme.primary("spm")} ${theme.muted(`v${version}`)} ${theme.muted("— AI skills manager")}`);
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
lines.push(` ${theme.primary("spm")} ${theme.muted(cmd.name())}`);
|
|
15
|
+
}
|
|
16
|
+
lines.push("");
|
|
17
|
+
// Group subcommands
|
|
18
|
+
const subs = cmd.commands;
|
|
19
|
+
if (subs.length === 0) {
|
|
20
|
+
return helper.formatHelp(cmd, helper);
|
|
21
|
+
}
|
|
22
|
+
const grouped = new Map();
|
|
23
|
+
for (const sub of subs) {
|
|
24
|
+
// Try to find group from the command's metadata
|
|
25
|
+
const group = sub._group ?? "system";
|
|
26
|
+
if (!grouped.has(group)) {
|
|
27
|
+
grouped.set(group, []);
|
|
28
|
+
}
|
|
29
|
+
grouped.get(group).push({
|
|
30
|
+
name: sub.name(),
|
|
31
|
+
description: sub.description(),
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
// Sort groups by order
|
|
35
|
+
const sortedGroups = [...grouped.entries()].sort((a, b) => {
|
|
36
|
+
const orderA = GROUPS[a[0]]?.order ?? 99;
|
|
37
|
+
const orderB = GROUPS[b[0]]?.order ?? 99;
|
|
38
|
+
return orderA - orderB;
|
|
39
|
+
});
|
|
40
|
+
// Find max command name length for alignment
|
|
41
|
+
const maxLen = Math.max(...subs.map((s) => s.name().length));
|
|
42
|
+
for (const [groupKey, cmds] of sortedGroups) {
|
|
43
|
+
const label = GROUPS[groupKey]?.label ?? groupKey;
|
|
44
|
+
lines.push(` ${theme.bold(label)}`);
|
|
45
|
+
for (const c of cmds) {
|
|
46
|
+
const padded = c.name.padEnd(maxLen + 2);
|
|
47
|
+
lines.push(` ${theme.primary(padded)}${theme.muted(c.description)}`);
|
|
48
|
+
}
|
|
49
|
+
lines.push("");
|
|
50
|
+
}
|
|
51
|
+
// Global options
|
|
52
|
+
const opts = helper.visibleOptions(cmd);
|
|
53
|
+
if (opts.length > 0) {
|
|
54
|
+
const optMaxLen = Math.max(maxLen, ...opts.map((o) => helper.optionTerm(o).length));
|
|
55
|
+
lines.push(` ${theme.bold("Options")}`);
|
|
56
|
+
for (const opt of opts) {
|
|
57
|
+
const flags = helper.optionTerm(opt).padEnd(optMaxLen + 2);
|
|
58
|
+
lines.push(` ${flags} ${theme.muted(helper.optionDescription(opt))}`);
|
|
59
|
+
}
|
|
60
|
+
lines.push("");
|
|
61
|
+
}
|
|
62
|
+
return lines.join("\n");
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Tag a Commander command with a group key for help formatting.
|
|
68
|
+
*/
|
|
69
|
+
export function setCommandGroup(cmd, group) {
|
|
70
|
+
cmd._group = group;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=help.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/cli/help.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
@@ -1,162 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import fs from "node:fs/promises";
|
|
3
2
|
import { createRequire } from "node:module";
|
|
4
3
|
import { Command } from "commander";
|
|
4
|
+
import { loadCommands } from "./loader.js";
|
|
5
|
+
import { configureHelp } from "./help.js";
|
|
5
6
|
const require = createRequire(import.meta.url);
|
|
6
7
|
const pkg = require("../../package.json");
|
|
7
|
-
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
8
|
-
import { createServer } from "../mcp/server.js";
|
|
9
|
-
import { initCommand } from "./commands/init.js";
|
|
10
|
-
import { createCommand } from "./commands/create.js";
|
|
11
|
-
import { validateCommand } from "./commands/validate.js";
|
|
12
|
-
import { installCommand } from "./commands/install.js";
|
|
13
|
-
import { uninstallCommand } from "./commands/uninstall.js";
|
|
14
|
-
import { listCommand } from "./commands/list.js";
|
|
15
|
-
import { infoCommand } from "./commands/info.js";
|
|
16
|
-
import { statsCommand } from "./commands/stats.js";
|
|
17
|
-
import { rateCommand } from "./commands/rate.js";
|
|
18
|
-
import { searchCommand } from "./commands/search.js";
|
|
19
|
-
import { publishCommand } from "./commands/publish.js";
|
|
20
|
-
import { loginCommand, addRegistryCommand } from "./commands/login.js";
|
|
21
|
-
import { updateCommand } from "./commands/update.js";
|
|
22
|
-
import { convertCommand } from "./commands/convert.js";
|
|
23
|
-
import { connectCommand, disconnectCommand } from "./commands/connect.js";
|
|
24
|
-
import { writeIndex } from "../core/indexer.js";
|
|
25
|
-
import { getGlobalSkillsDir, getProjectSkillsDir, getInstalledDir, } from "../core/paths.js";
|
|
26
8
|
const program = new Command();
|
|
27
9
|
program
|
|
28
10
|
.name("spm")
|
|
29
|
-
.description("Skillbase — AI
|
|
11
|
+
.description("Skillbase — AI skills manager")
|
|
30
12
|
.version(pkg.version);
|
|
31
|
-
program
|
|
32
|
-
|
|
33
|
-
.description("Initialize skills directory")
|
|
34
|
-
.option("--project", "Initialize in current project (.skills/) instead of global (~/.skills/)")
|
|
35
|
-
.action(initCommand);
|
|
36
|
-
program
|
|
37
|
-
.command("create <name>")
|
|
38
|
-
.description("Create a new skill scaffold")
|
|
39
|
-
.option("-s, --scope <scope>", "Skill scope", "user")
|
|
40
|
-
.action(createCommand);
|
|
41
|
-
program
|
|
42
|
-
.command("validate <path>")
|
|
43
|
-
.description("Validate a skill directory")
|
|
44
|
-
.action(validateCommand);
|
|
45
|
-
program
|
|
46
|
-
.command("install [source]")
|
|
47
|
-
.description("Install skill(s). Without args installs all from skill.json")
|
|
48
|
-
.option("-g, --global", "Install globally instead of project-local")
|
|
49
|
-
.option("-v, --version <version>", "Specific version to install")
|
|
50
|
-
.option("--github <token>", "GitHub personal access token for private repos")
|
|
51
|
-
.action(installCommand);
|
|
52
|
-
program
|
|
53
|
-
.command("uninstall <name>")
|
|
54
|
-
.description("Uninstall a skill")
|
|
55
|
-
.action(uninstallCommand);
|
|
56
|
-
program
|
|
57
|
-
.command("list")
|
|
58
|
-
.description("List installed skills")
|
|
59
|
-
.option("-v, --verbose", "Show detailed information")
|
|
60
|
-
.action(listCommand);
|
|
61
|
-
program
|
|
62
|
-
.command("info <name>")
|
|
63
|
-
.description("Show detailed information about a skill")
|
|
64
|
-
.action(infoCommand);
|
|
65
|
-
program
|
|
66
|
-
.command("stats")
|
|
67
|
-
.description("Show feedback statistics for installed skills")
|
|
68
|
-
.action(statsCommand);
|
|
69
|
-
program
|
|
70
|
-
.command("rate <name>")
|
|
71
|
-
.description("Rate a skill (explicit feedback)")
|
|
72
|
-
.requiredOption("--score <score>", "Rating from 1 to 5")
|
|
73
|
-
.option("--comment <comment>", "Optional comment")
|
|
74
|
-
.action(rateCommand);
|
|
75
|
-
program
|
|
76
|
-
.command("search <query>")
|
|
77
|
-
.description("Search for skills locally and/or in remote registries")
|
|
78
|
-
.option("--remote", "Search remote registries only")
|
|
79
|
-
.option("--all", "Search both local and remote")
|
|
80
|
-
.action(searchCommand);
|
|
81
|
-
program
|
|
82
|
-
.command("publish <source>")
|
|
83
|
-
.description("Publish a skill to registry")
|
|
84
|
-
.option("--registry <name>", "Publish to a specific registry")
|
|
85
|
-
.option("--github", "Source is a GitHub URL")
|
|
86
|
-
.option("--dry-run", "Show what would happen without executing")
|
|
87
|
-
.action(publishCommand);
|
|
88
|
-
program
|
|
89
|
-
.command("update <source>")
|
|
90
|
-
.description("Update an existing skill in the registry (re-publish)")
|
|
91
|
-
.option("--registry <name>", "Target registry")
|
|
92
|
-
.option("--dry-run", "Show what would happen without executing")
|
|
93
|
-
.action(updateCommand);
|
|
94
|
-
program
|
|
95
|
-
.command("convert <source>")
|
|
96
|
-
.description("Convert prompt files (.md, .txt) into skill scaffolds")
|
|
97
|
-
.option("--author <author>", "Author name")
|
|
98
|
-
.option("--scope <scope>", "Skill scope (default: user)")
|
|
99
|
-
.option("--license <license>", "License (default: MIT)")
|
|
100
|
-
.option("-o, --output <dir>", "Output directory (default: current)")
|
|
101
|
-
.action(convertCommand);
|
|
102
|
-
program
|
|
103
|
-
.command("login [registry-url]")
|
|
104
|
-
.description("Authenticate with a registry server")
|
|
105
|
-
.option("--name <name>", "Your author name (for direct registration)")
|
|
106
|
-
.option("--github", "Authenticate via GitHub OAuth")
|
|
107
|
-
.action(loginCommand);
|
|
108
|
-
// Registry management subcommand
|
|
109
|
-
const registryCmd = program
|
|
110
|
-
.command("registry")
|
|
111
|
-
.description("Manage remote registries");
|
|
112
|
-
registryCmd
|
|
113
|
-
.command("add <url>")
|
|
114
|
-
.description("Add a remote registry")
|
|
115
|
-
.option("--name <name>", "Registry name (auto-generated from URL if omitted)")
|
|
116
|
-
.option("--token <token>", "API token")
|
|
117
|
-
.option("--scope <scope>", "Bind a scope to this registry (e.g. @company)")
|
|
118
|
-
.action(addRegistryCommand);
|
|
119
|
-
program
|
|
120
|
-
.command("connect <client>")
|
|
121
|
-
.description("Connect skills to an AI client (claude, zed)")
|
|
122
|
-
.action(connectCommand);
|
|
123
|
-
program
|
|
124
|
-
.command("disconnect <client>")
|
|
125
|
-
.description("Disconnect skills from an AI client (claude, zed)")
|
|
126
|
-
.action(disconnectCommand);
|
|
127
|
-
program
|
|
128
|
-
.command("reindex")
|
|
129
|
-
.description("Rebuild skill index")
|
|
130
|
-
.option("--project", "Reindex project skills only")
|
|
131
|
-
.action(async (options) => {
|
|
132
|
-
const globalDir = getGlobalSkillsDir();
|
|
133
|
-
const projectDir = getProjectSkillsDir(process.cwd());
|
|
134
|
-
if (!options.project) {
|
|
135
|
-
const index = await writeIndex(globalDir);
|
|
136
|
-
console.log(`Global: ${index.skills.length} skill(s) indexed`);
|
|
137
|
-
}
|
|
138
|
-
if (options.project) {
|
|
139
|
-
const installedDir = getInstalledDir(projectDir);
|
|
140
|
-
try {
|
|
141
|
-
const stat = await fs.stat(installedDir);
|
|
142
|
-
if (stat.isDirectory()) {
|
|
143
|
-
const index = await writeIndex(projectDir);
|
|
144
|
-
console.log(`Project: ${index.skills.length} skill(s) indexed`);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
catch {
|
|
148
|
-
console.log("No .skills/installed/ directory in current project.");
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
});
|
|
152
|
-
program
|
|
153
|
-
.command("serve")
|
|
154
|
-
.description("Start the MCP server (stdio transport)")
|
|
155
|
-
.option("--stdio", "Use stdio transport (default)", true)
|
|
156
|
-
.action(async () => {
|
|
157
|
-
const server = await createServer();
|
|
158
|
-
const transport = new StdioServerTransport();
|
|
159
|
-
await server.connect(transport);
|
|
160
|
-
});
|
|
13
|
+
configureHelp(program);
|
|
14
|
+
await loadCommands(program);
|
|
161
15
|
program.parse();
|
|
162
16
|
//# sourceMappingURL=index.js.map
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAwB,CAAC;AAEjE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,KAAK,CAAC;KACX,WAAW,CAAC,+BAA+B,CAAC;KAC5C,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAExB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;AAE5B,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/cli/loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0CzC,wBAAsB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAgClE"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { GROUPS } from "./command.js";
|
|
5
|
+
import { setCommandGroup } from "./help.js";
|
|
6
|
+
function registerCommand(parent, def) {
|
|
7
|
+
const nameWithArgs = def.args
|
|
8
|
+
? `${def.name} ${def.args.map((a) => (a.required ? `<${a.name}>` : `[${a.name}]`)).join(" ")}`
|
|
9
|
+
: def.name;
|
|
10
|
+
const cmd = parent.command(nameWithArgs).description(def.description);
|
|
11
|
+
// Tag with group for help formatting
|
|
12
|
+
setCommandGroup(cmd, def.group);
|
|
13
|
+
if (def.aliases) {
|
|
14
|
+
for (const alias of def.aliases) {
|
|
15
|
+
cmd.alias(alias);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
if (def.options) {
|
|
19
|
+
for (const opt of def.options) {
|
|
20
|
+
if (opt.required) {
|
|
21
|
+
cmd.requiredOption(opt.flags, opt.description, opt.default);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
cmd.option(opt.flags, opt.description, opt.default);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
if (def.subcommands) {
|
|
29
|
+
for (const sub of def.subcommands) {
|
|
30
|
+
registerCommand(cmd, sub);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (def.handler) {
|
|
34
|
+
cmd.action(def.handler);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export async function loadCommands(program) {
|
|
38
|
+
const dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
39
|
+
const commandsDir = path.join(dirname, "commands");
|
|
40
|
+
const files = await fs.readdir(commandsDir);
|
|
41
|
+
const definitions = [];
|
|
42
|
+
for (const file of files) {
|
|
43
|
+
if (!file.endsWith(".js") && !file.endsWith(".ts"))
|
|
44
|
+
continue;
|
|
45
|
+
// Skip .d.ts and .test files
|
|
46
|
+
if (file.endsWith(".d.ts") || file.includes(".test."))
|
|
47
|
+
continue;
|
|
48
|
+
const mod = (await import(path.join(commandsDir, file)));
|
|
49
|
+
if (mod.command)
|
|
50
|
+
definitions.push(mod.command);
|
|
51
|
+
if (mod.commands && Array.isArray(mod.commands)) {
|
|
52
|
+
definitions.push(...mod.commands);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Sort by group order, then alphabetically
|
|
56
|
+
definitions.sort((a, b) => {
|
|
57
|
+
const groupA = GROUPS[a.group];
|
|
58
|
+
const groupB = GROUPS[b.group];
|
|
59
|
+
const orderA = groupA?.order ?? 99;
|
|
60
|
+
const orderB = groupB?.order ?? 99;
|
|
61
|
+
if (orderA !== orderB)
|
|
62
|
+
return orderA - orderB;
|
|
63
|
+
return a.name.localeCompare(b.name);
|
|
64
|
+
});
|
|
65
|
+
for (const def of definitions) {
|
|
66
|
+
registerCommand(program, def);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/cli/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const log: {
|
|
2
|
+
success: (msg: string) => void;
|
|
3
|
+
error: (msg: string) => void;
|
|
4
|
+
warning: (msg: string) => void;
|
|
5
|
+
info: (msg: string) => void;
|
|
6
|
+
step: (msg: string) => void;
|
|
7
|
+
message: (msg: string) => void;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/cli/logger.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,GAAG;mBACC,MAAM;iBACR,MAAM;mBACJ,MAAM;gBACT,MAAM;gBACN,MAAM;mBACH,MAAM;CACtB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { theme } from "./theme.js";
|
|
2
|
+
function write(symbol, msg) {
|
|
3
|
+
console.log(` ${symbol} ${msg}`);
|
|
4
|
+
}
|
|
5
|
+
export const log = {
|
|
6
|
+
success: (msg) => write(theme.symbols.success, msg),
|
|
7
|
+
error: (msg) => write(theme.symbols.error, theme.error(msg)),
|
|
8
|
+
warning: (msg) => write(theme.symbols.warning, msg),
|
|
9
|
+
info: (msg) => write(theme.symbols.info, msg),
|
|
10
|
+
step: (msg) => write(theme.symbols.arrow, msg),
|
|
11
|
+
message: (msg) => console.log(` ${msg}`),
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=logger.js.map
|