@skillbase/spm 0.1.4 → 0.2.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 (132) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/dist/cli/command.d.ts +43 -0
  3. package/dist/cli/command.d.ts.map +1 -0
  4. package/dist/cli/command.js +8 -0
  5. package/dist/cli/command.js.map +1 -0
  6. package/dist/cli/commands/add.d.ts +17 -0
  7. package/dist/cli/commands/add.d.ts.map +1 -0
  8. package/dist/cli/commands/add.js +348 -0
  9. package/dist/cli/commands/add.js.map +1 -0
  10. package/dist/cli/commands/connect.d.ts +2 -0
  11. package/dist/cli/commands/connect.d.ts.map +1 -1
  12. package/dist/cli/commands/connect.js +28 -13
  13. package/dist/cli/commands/connect.js.map +1 -1
  14. package/dist/cli/commands/convert.d.ts +2 -0
  15. package/dist/cli/commands/convert.d.ts.map +1 -1
  16. package/dist/cli/commands/convert.js +55 -39
  17. package/dist/cli/commands/convert.js.map +1 -1
  18. package/dist/cli/commands/create.d.ts +3 -3
  19. package/dist/cli/commands/create.d.ts.map +1 -1
  20. package/dist/cli/commands/create.js +15 -15
  21. package/dist/cli/commands/create.js.map +1 -1
  22. package/dist/cli/commands/info.d.ts +2 -0
  23. package/dist/cli/commands/info.d.ts.map +1 -1
  24. package/dist/cli/commands/info.js +24 -17
  25. package/dist/cli/commands/info.js.map +1 -1
  26. package/dist/cli/commands/init.d.ts +2 -0
  27. package/dist/cli/commands/init.d.ts.map +1 -1
  28. package/dist/cli/commands/init.js +13 -6
  29. package/dist/cli/commands/init.js.map +1 -1
  30. package/dist/cli/commands/install.d.ts +3 -3
  31. package/dist/cli/commands/install.d.ts.map +1 -1
  32. package/dist/cli/commands/install.js +23 -240
  33. package/dist/cli/commands/install.js.map +1 -1
  34. package/dist/cli/commands/link.d.ts +4 -0
  35. package/dist/cli/commands/link.d.ts.map +1 -0
  36. package/dist/cli/commands/link.js +56 -0
  37. package/dist/cli/commands/link.js.map +1 -0
  38. package/dist/cli/commands/list.d.ts +2 -0
  39. package/dist/cli/commands/list.d.ts.map +1 -1
  40. package/dist/cli/commands/list.js +35 -12
  41. package/dist/cli/commands/list.js.map +1 -1
  42. package/dist/cli/commands/login.d.ts +2 -0
  43. package/dist/cli/commands/login.d.ts.map +1 -1
  44. package/dist/cli/commands/login.js +62 -28
  45. package/dist/cli/commands/login.js.map +1 -1
  46. package/dist/cli/commands/persona.d.ts +3 -0
  47. package/dist/cli/commands/persona.d.ts.map +1 -0
  48. package/dist/cli/commands/persona.js +253 -0
  49. package/dist/cli/commands/persona.js.map +1 -0
  50. package/dist/cli/commands/publish.d.ts +2 -0
  51. package/dist/cli/commands/publish.d.ts.map +1 -1
  52. package/dist/cli/commands/publish.js +30 -32
  53. package/dist/cli/commands/publish.js.map +1 -1
  54. package/dist/cli/commands/rate.d.ts +2 -0
  55. package/dist/cli/commands/rate.d.ts.map +1 -1
  56. package/dist/cli/commands/rate.js +15 -5
  57. package/dist/cli/commands/rate.js.map +1 -1
  58. package/dist/cli/commands/reindex.d.ts +3 -0
  59. package/dist/cli/commands/reindex.d.ts.map +1 -0
  60. package/dist/cli/commands/reindex.js +35 -0
  61. package/dist/cli/commands/reindex.js.map +1 -0
  62. package/dist/cli/commands/remove.d.ts +8 -0
  63. package/dist/cli/commands/remove.d.ts.map +1 -0
  64. package/dist/cli/commands/remove.js +126 -0
  65. package/dist/cli/commands/remove.js.map +1 -0
  66. package/dist/cli/commands/search.d.ts +2 -0
  67. package/dist/cli/commands/search.d.ts.map +1 -1
  68. package/dist/cli/commands/search.js +25 -12
  69. package/dist/cli/commands/search.js.map +1 -1
  70. package/dist/cli/commands/serve.d.ts +3 -0
  71. package/dist/cli/commands/serve.d.ts.map +1 -0
  72. package/dist/cli/commands/serve.js +17 -0
  73. package/dist/cli/commands/serve.js.map +1 -0
  74. package/dist/cli/commands/stats.d.ts +2 -0
  75. package/dist/cli/commands/stats.d.ts.map +1 -1
  76. package/dist/cli/commands/stats.js +16 -10
  77. package/dist/cli/commands/stats.js.map +1 -1
  78. package/dist/cli/commands/uninstall.d.ts +2 -0
  79. package/dist/cli/commands/uninstall.d.ts.map +1 -1
  80. package/dist/cli/commands/uninstall.js +50 -14
  81. package/dist/cli/commands/uninstall.js.map +1 -1
  82. package/dist/cli/commands/update.d.ts +2 -0
  83. package/dist/cli/commands/update.d.ts.map +1 -1
  84. package/dist/cli/commands/update.js +27 -32
  85. package/dist/cli/commands/update.js.map +1 -1
  86. package/dist/cli/commands/validate.d.ts +2 -0
  87. package/dist/cli/commands/validate.d.ts.map +1 -1
  88. package/dist/cli/commands/validate.js +16 -18
  89. package/dist/cli/commands/validate.js.map +1 -1
  90. package/dist/cli/help.d.ts +7 -0
  91. package/dist/cli/help.d.ts.map +1 -0
  92. package/dist/cli/help.js +72 -0
  93. package/dist/cli/help.js.map +1 -0
  94. package/dist/cli/index.js +5 -151
  95. package/dist/cli/index.js.map +1 -1
  96. package/dist/cli/loader.d.ts +3 -0
  97. package/dist/cli/loader.d.ts.map +1 -0
  98. package/dist/cli/loader.js +69 -0
  99. package/dist/cli/loader.js.map +1 -0
  100. package/dist/cli/logger.d.ts +9 -0
  101. package/dist/cli/logger.d.ts.map +1 -0
  102. package/dist/cli/logger.js +13 -0
  103. package/dist/cli/logger.js.map +1 -0
  104. package/dist/cli/theme.d.ts +17 -0
  105. package/dist/cli/theme.d.ts.map +1 -0
  106. package/dist/cli/theme.js +29 -0
  107. package/dist/cli/theme.js.map +1 -0
  108. package/dist/cli/ui.d.ts +8 -0
  109. package/dist/cli/ui.d.ts.map +1 -0
  110. package/dist/cli/ui.js +17 -0
  111. package/dist/cli/ui.js.map +1 -0
  112. package/dist/core/config.d.ts.map +1 -1
  113. package/dist/core/config.js +4 -0
  114. package/dist/core/config.js.map +1 -1
  115. package/dist/core/paths.d.ts +2 -0
  116. package/dist/core/paths.d.ts.map +1 -1
  117. package/dist/core/paths.js +7 -0
  118. package/dist/core/paths.js.map +1 -1
  119. package/dist/core/persona.d.ts +17 -0
  120. package/dist/core/persona.d.ts.map +1 -0
  121. package/dist/core/persona.js +118 -0
  122. package/dist/core/persona.js.map +1 -0
  123. package/dist/mcp/server.d.ts.map +1 -1
  124. package/dist/mcp/server.js +91 -2
  125. package/dist/mcp/server.js.map +1 -1
  126. package/dist/schema/persona-schema.d.ts +6 -0
  127. package/dist/schema/persona-schema.d.ts.map +1 -0
  128. package/dist/schema/persona-schema.js +72 -0
  129. package/dist/schema/persona-schema.js.map +1 -0
  130. package/dist/types/index.d.ts +25 -0
  131. package/dist/types/index.d.ts.map +1 -1
  132. package/package.json +3 -1
@@ -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
- function formatSize(bytes) {
8
- if (bytes < 1024)
9
- return `${bytes} B`;
10
- if (bytes < 1024 * 1024)
11
- return `${(bytes / 1024).toFixed(1)} KB`;
12
- return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
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
- console.error("Error: no default registry configured. Use 'skills login <url>' first.");
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
- console.error(`Error: registry "${registryName}" not found in config.`);
27
- process.exit(1);
30
+ exitError(`Registry "${registryName}" not found in config.`);
28
31
  }
29
32
  if (!reg.token) {
30
- console.error(`Error: no token for registry "${registryName}". Use 'skills login' first.`);
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
- console.error("Invalid skill.json:");
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
- console.error(`Error: cannot read skill.json in "${source}".`);
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
- console.error(`Error: "${manifest.author}/${manifest.name}" not found in registry. Use 'skills publish' for first-time publishing.`);
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
- console.error("Error: skill.json has no 'entry' field. Bundles cannot be updated — only skills with an entry point.");
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
- console.log(`Packaging ${manifest.name}@${manifest.version}...`);
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
- console.log(`[dry-run] Would update ${manifest.name}@${manifest.version} (was ${previousVersion})`);
86
- console.log(` Package size: ${formatSize(pkg.size)} (${pkg.filesCount} files)`);
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
- console.log(`Updating ${manifest.name} in ${reg.name}...`);
86
+ s.message(`Updating ${manifest.name} in ${reg.name}...`);
92
87
  const result = await client.publishWithArchive({ manifest, content, compact_content: compactContent }, pkg.data);
93
- console.log(`Updated ${result.name}@${result.version} (was ${previousVersion})`);
94
- console.log(` Size: ${formatSize(result.size ?? pkg.size)}`);
95
- console.log(` Tokens: ~${Math.ceil(content.length / 4).toLocaleString()}`);
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":"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"}
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/cli/commands/update.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,4 @@
1
+ import type { CommandDef } from "../command.js";
2
+ export declare const command: CommandDef;
1
3
  export declare function validateCommand(skillPath: string): Promise<void>;
2
4
  //# sourceMappingURL=validate.d.ts.map
@@ -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,CAsEtE"}
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
- console.error(`Error: "${skillPath}" is not a directory.`);
11
- process.exit(1);
18
+ exitError(`"${skillPath}" is not a directory.`);
12
19
  }
13
20
  }
14
21
  catch {
15
- console.error(`Error: "${skillPath}" does not exist.`);
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
- console.error(`Error: skill.json not found in "${skillPath}".`);
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
- console.error(`Error: skill.json is not valid JSON: ${message}`);
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
- console.error("Validation failed:");
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
- console.error(`Error: entry file "${manifest.entry}" not found.`);
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
- console.error(`Error: compact_entry file "${manifest.compact_entry}" not found.`);
67
- process.exit(1);
65
+ exitError(`compact_entry file "${manifest.compact_entry}" not found.`);
68
66
  }
69
67
  }
70
- console.log(`Valid: ${manifest.name ?? skillPath}`);
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":"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"}
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"}
@@ -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 skill manager")
11
+ .description("Skillbase — AI skills manager")
30
12
  .version(pkg.version);
31
- program
32
- .command("init")
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
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAwB,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,KAAK,CAAC;KACX,WAAW,CAAC,8BAA8B,CAAC;KAC3C,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CACL,WAAW,EACX,yEAAyE,CAC1E;KACA,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,qBAAqB,EAAE,aAAa,EAAE,MAAM,CAAC;KACpD,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,4BAA4B,CAAC;KACzC,MAAM,CAAC,eAAe,CAAC,CAAC;AAE3B,OAAO;KACJ,OAAO,CAAC,kBAAkB,CAAC;KAC3B,WAAW,CAAC,6DAA6D,CAAC;KAC1E,MAAM,CAAC,cAAc,EAAE,2CAA2C,CAAC;KACnE,MAAM,CAAC,yBAAyB,EAAE,6BAA6B,CAAC;KAChE,MAAM,CAAC,kBAAkB,EAAE,gDAAgD,CAAC;KAC5E,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,OAAO;KACJ,OAAO,CAAC,kBAAkB,CAAC;KAC3B,WAAW,CAAC,mBAAmB,CAAC;KAChC,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAE5B,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,uBAAuB,CAAC;KACpC,MAAM,CAAC,eAAe,EAAE,2BAA2B,CAAC;KACpD,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,+CAA+C,CAAC;KAC5D,MAAM,CAAC,YAAY,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,kCAAkC,CAAC;KAC/C,cAAc,CAAC,iBAAiB,EAAE,oBAAoB,CAAC;KACvD,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;KACjD,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,uDAAuD,CAAC;KACpE,MAAM,CAAC,UAAU,EAAE,+BAA+B,CAAC;KACnD,MAAM,CAAC,OAAO,EAAE,8BAA8B,CAAC;KAC/C,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,kBAAkB,CAAC;KAC3B,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,mBAAmB,EAAE,gCAAgC,CAAC;KAC7D,MAAM,CAAC,UAAU,EAAE,wBAAwB,CAAC;KAC5C,MAAM,CAAC,WAAW,EAAE,0CAA0C,CAAC;KAC/D,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,OAAO;KACJ,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,uDAAuD,CAAC;KACpE,MAAM,CAAC,mBAAmB,EAAE,iBAAiB,CAAC;KAC9C,MAAM,CAAC,WAAW,EAAE,0CAA0C,CAAC;KAC/D,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,kBAAkB,CAAC;KAC3B,WAAW,CAAC,uDAAuD,CAAC;KACpE,MAAM,CAAC,mBAAmB,EAAE,aAAa,CAAC;KAC1C,MAAM,CAAC,iBAAiB,EAAE,6BAA6B,CAAC;KACxD,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,CAAC;KACvD,MAAM,CAAC,oBAAoB,EAAE,qCAAqC,CAAC;KACnE,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,OAAO;KACJ,OAAO,CAAC,sBAAsB,CAAC;KAC/B,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,eAAe,EAAE,4CAA4C,CAAC;KACrE,MAAM,CAAC,UAAU,EAAE,+BAA+B,CAAC;KACnD,MAAM,CAAC,YAAY,CAAC,CAAC;AAExB,iCAAiC;AACjC,MAAM,WAAW,GAAG,OAAO;KACxB,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,0BAA0B,CAAC,CAAC;AAE3C,WAAW;KACR,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,uBAAuB,CAAC;KACpC,MAAM,CAAC,eAAe,EAAE,oDAAoD,CAAC;KAC7E,MAAM,CAAC,iBAAiB,EAAE,WAAW,CAAC;KACtC,MAAM,CAAC,iBAAiB,EAAE,+CAA+C,CAAC;KAC1E,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAE9B,OAAO;KACJ,OAAO,CAAC,kBAAkB,CAAC;KAC3B,WAAW,CAAC,8CAA8C,CAAC;KAC3D,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,OAAO;KACJ,OAAO,CAAC,qBAAqB,CAAC;KAC9B,WAAW,CAAC,mDAAmD,CAAC;KAChE,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAE7B,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,qBAAqB,CAAC;KAClC,MAAM,CAAC,WAAW,EAAE,6BAA6B,CAAC;KAClD,MAAM,CAAC,KAAK,EAAE,OAA8B,EAAE,EAAE;IAC/C,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;IACvC,MAAM,UAAU,GAAG,mBAAmB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAEtD,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,MAAM,CAAC,MAAM,mBAAmB,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,YAAY,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;QACjD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACzC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;gBAC3C,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,MAAM,CAAC,MAAM,mBAAmB,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,SAAS,EAAE,+BAA+B,EAAE,IAAI,CAAC;KACxD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;IACpC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
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,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function loadCommands(program: Command): Promise<void>;
3
+ //# sourceMappingURL=loader.d.ts.map
@@ -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