@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
@@ -1,6 +1,39 @@
1
1
  import { execFile } from "node:child_process";
2
2
  import { readConfig, writeConfig } from "../../core/config.js";
3
3
  import { RegistryClient } from "../../core/registry-client.js";
4
+ import { log, spinner, note, select, isCancel, cancel, exitError } from "../ui.js";
5
+ export const commands = [
6
+ {
7
+ name: "login",
8
+ description: "Authenticate with a registry server",
9
+ group: "registry",
10
+ args: [{ name: "registry-url", required: false }],
11
+ options: [
12
+ { flags: "--name <name>", description: "Your author name (for direct registration)" },
13
+ { flags: "--github", description: "Authenticate via GitHub OAuth" },
14
+ ],
15
+ handler: loginCommand,
16
+ },
17
+ {
18
+ name: "registry",
19
+ description: "Manage remote registries",
20
+ group: "registry",
21
+ subcommands: [
22
+ {
23
+ name: "add",
24
+ description: "Add a remote registry",
25
+ group: "registry",
26
+ args: [{ name: "url", required: true }],
27
+ options: [
28
+ { flags: "--name <name>", description: "Registry name (auto-generated from URL if omitted)" },
29
+ { flags: "--token <token>", description: "API token" },
30
+ { flags: "--scope <scope>", description: "Bind a scope to this registry (e.g. @company)" },
31
+ ],
32
+ handler: addRegistryCommand,
33
+ },
34
+ ],
35
+ },
36
+ ];
4
37
  function resolveRegistryName(registryUrl) {
5
38
  const urlObj = new URL(registryUrl);
6
39
  return urlObj.hostname.replace(/\./g, "-");
@@ -26,18 +59,24 @@ async function resolveRegistryUrl(registryUrl) {
26
59
  return registryUrl;
27
60
  const config = await readConfig();
28
61
  if (config.registries.length === 0) {
29
- console.error("Error: no registries configured. Specify a registry URL or run: skills registry add <url>");
30
- process.exit(1);
62
+ exitError("No registries configured. Specify a registry URL or run: skills registry add <url>");
31
63
  }
32
64
  if (config.registries.length === 1) {
33
65
  return config.registries[0].url;
34
66
  }
35
- console.log("Available registries:");
36
- for (let i = 0; i < config.registries.length; i++) {
37
- console.log(` [${i + 1}] ${config.registries[i].name} (${config.registries[i].url})`);
38
- }
39
- console.error("Error: multiple registries configured. Specify the URL: skills login <registry-url>");
40
- process.exit(1);
67
+ // Multiple registries — let user pick
68
+ const choice = await select({
69
+ message: "Select a registry:",
70
+ options: config.registries.map((r) => ({
71
+ value: r.url,
72
+ label: `${r.name} (${r.url})`,
73
+ })),
74
+ });
75
+ if (isCancel(choice)) {
76
+ cancel("Cancelled.");
77
+ process.exit(0);
78
+ }
79
+ return choice;
41
80
  }
42
81
  export async function loginCommand(registryUrl, options) {
43
82
  const url = await resolveRegistryUrl(registryUrl);
@@ -50,22 +89,19 @@ export async function loginCommand(registryUrl, options) {
50
89
  }
51
90
  async function loginWithName(registryUrl, name) {
52
91
  if (!name) {
53
- console.error("Error: --name is required for direct registration.");
54
- console.error("Or use --github to authenticate via GitHub.");
55
- process.exit(1);
92
+ exitError("--name is required for direct registration.\nOr use --github to authenticate via GitHub.");
56
93
  }
57
94
  const client = new RegistryClient(registryUrl);
58
95
  try {
59
96
  const result = await client.register(name);
60
- console.log(`Registered as "${result.author.name}" (id: ${result.author.id})`);
97
+ log.success(`Registered as "${result.author.name}" (id: ${result.author.id})`);
61
98
  const registryName = await saveTokenToConfig(registryUrl, result.token);
62
- console.log(`Token saved to config (registry: ${registryName})`);
63
- console.log(`\nYou can now publish skills with: skills publish <path>`);
99
+ log.info(`Token saved to config (registry: ${registryName})`);
100
+ log.message("You can now publish skills with: skills publish <path>");
64
101
  }
65
102
  catch (err) {
66
103
  const message = err instanceof Error ? err.message : String(err);
67
- console.error(`Login failed: ${message}`);
68
- process.exit(1);
104
+ exitError(`Login failed: ${message}`);
69
105
  }
70
106
  }
71
107
  function openBrowser(url) {
@@ -86,20 +122,19 @@ async function loginWithGithub(registryUrl) {
86
122
  const client = new RegistryClient(registryUrl);
87
123
  try {
88
124
  const device = await client.startDeviceAuth();
89
- console.log(`\nOpen this URL in your browser:\n`);
90
- console.log(` ${device.verification_uri}\n`);
91
- console.log(`And enter the code: ${device.user_code}\n`);
125
+ note(`URL: ${device.verification_uri}\nCode: ${device.user_code}`, "Open in browser and enter the code");
92
126
  openBrowser(device.verification_uri);
93
- console.log("Waiting for authorization...");
127
+ const s = spinner();
128
+ s.start("Waiting for authorization...");
94
129
  let interval = device.interval * 1000;
95
130
  while (true) {
96
131
  await new Promise((resolve) => setTimeout(resolve, interval));
97
132
  const poll = await client.pollDeviceAuth(device.session_id);
98
133
  if (poll.status === "complete" && poll.author && poll.token) {
99
- console.log(`\nAuthenticated as "${poll.author.name}" (id: ${poll.author.id})`);
134
+ s.stop(`Authenticated as "${poll.author.name}" (id: ${poll.author.id})`);
100
135
  const registryName = await saveTokenToConfig(registryUrl, poll.token);
101
- console.log(`Token saved to config (registry: ${registryName})`);
102
- console.log(`\nYou can now publish skills with: skills publish <path>`);
136
+ log.info(`Token saved to config (registry: ${registryName})`);
137
+ log.message("You can now publish skills with: skills publish <path>");
103
138
  return;
104
139
  }
105
140
  if (poll.interval) {
@@ -109,8 +144,7 @@ async function loginWithGithub(registryUrl) {
109
144
  }
110
145
  catch (err) {
111
146
  const message = err instanceof Error ? err.message : String(err);
112
- console.error(`GitHub login failed: ${message}`);
113
- process.exit(1);
147
+ exitError(`GitHub login failed: ${message}`);
114
148
  }
115
149
  }
116
150
  export async function addRegistryCommand(registryUrl, options) {
@@ -122,7 +156,7 @@ export async function addRegistryCommand(registryUrl, options) {
122
156
  config.registries[existingIdx].url = registryUrl;
123
157
  if (options.token)
124
158
  config.registries[existingIdx].token = options.token;
125
- console.log(`Updated registry "${registryName}"`);
159
+ log.success(`Updated registry "${registryName}"`);
126
160
  }
127
161
  else {
128
162
  config.registries.push({
@@ -130,11 +164,11 @@ export async function addRegistryCommand(registryUrl, options) {
130
164
  url: registryUrl,
131
165
  token: options.token,
132
166
  });
133
- console.log(`Added registry "${registryName}" (${registryUrl})`);
167
+ log.success(`Added registry "${registryName}" (${registryUrl})`);
134
168
  }
135
169
  if (options.scope) {
136
170
  config.scopes[options.scope] = registryName;
137
- console.log(`Scope "${options.scope}" → "${registryName}"`);
171
+ log.info(`Scope "${options.scope}" → "${registryName}"`);
138
172
  }
139
173
  await writeConfig(config);
140
174
  }
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CommandDef } from "../command.js";
2
+ export declare const command: CommandDef;
3
+ //# sourceMappingURL=persona.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persona.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/persona.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AA6NhD,eAAO,MAAM,OAAO,EAAE,UAqDrB,CAAC"}
@@ -0,0 +1,253 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { listPersonas, readPersona, installPersona, setActivePersona, } from "../../core/persona.js";
4
+ import { readConfig } from "../../core/config.js";
5
+ import { getClientForSkill } from "../../core/registry-client.js";
6
+ import { getSkillIndex, findSkill } from "../../core/registry.js";
7
+ import { validatePersonaManifest } from "../../schema/persona-schema.js";
8
+ import { installSingleFromRegistry, resolveSkillsDir } from "./add.js";
9
+ import { log, note, exitError } from "../ui.js";
10
+ function parseSkillRef(ref) {
11
+ const match = ref.match(/^([a-z0-9-]+)\/([a-z0-9-]+)$/);
12
+ if (!match)
13
+ return null;
14
+ return { author: match[1], name: match[2] };
15
+ }
16
+ function buildPersonaTemplate(name) {
17
+ return {
18
+ schema_version: 1,
19
+ name,
20
+ version: "1.0.0",
21
+ description: `TODO: describe ${name} persona`,
22
+ author: "TODO",
23
+ license: "MIT",
24
+ skills: {},
25
+ character: {
26
+ role: "TODO: describe the persona's role and expertise.",
27
+ tone: "TODO: e.g. professional, friendly, concise",
28
+ guidelines: [
29
+ "TODO: add behavioral guidelines",
30
+ ],
31
+ },
32
+ };
33
+ }
34
+ // --- Handlers ---
35
+ async function personaCreateCommand(name) {
36
+ const fileName = `${name}.person.json`;
37
+ const filePath = path.resolve(fileName);
38
+ try {
39
+ await fs.access(filePath);
40
+ exitError(`File "${fileName}" already exists.`);
41
+ }
42
+ catch {
43
+ // File doesn't exist — good
44
+ }
45
+ const template = buildPersonaTemplate(name);
46
+ await fs.writeFile(filePath, JSON.stringify(template, null, 2) + "\n", "utf-8");
47
+ log.success(`Created persona scaffold: ${fileName}`);
48
+ note(`1. Edit ${fileName} — set character and settings\n2. spm add <author/skill> --for ${name}\n3. spm persona activate ${name}`, "Next steps");
49
+ }
50
+ async function personaListCommand() {
51
+ const config = await readConfig();
52
+ const personas = await listPersonas();
53
+ if (personas.length === 0) {
54
+ log.info("No personas installed.");
55
+ log.message('Use `spm persona create <name>` to create one.');
56
+ return;
57
+ }
58
+ for (const p of personas) {
59
+ const active = config.active_persona === p.name ? " (active)" : "";
60
+ log.message(`${p.name}@${p.version}${active} — ${p.description} [${p.dependencies_count} skills]`);
61
+ }
62
+ }
63
+ async function personaActivateCommand(name) {
64
+ // First try to find installed persona
65
+ let persona = await readPersona(name);
66
+ // If not installed, try to install from .person.json in cwd
67
+ if (!persona) {
68
+ const fileName = `${name}.person.json`;
69
+ const filePath = path.resolve(fileName);
70
+ try {
71
+ await fs.access(filePath);
72
+ const installed = await installPersona(filePath, { global: true });
73
+ persona = installed;
74
+ log.success(`Installed persona from ${fileName}`);
75
+ }
76
+ catch {
77
+ exitError(`Persona "${name}" not found. Use \`spm persona list\` or create one with \`spm persona create ${name}\`.`);
78
+ }
79
+ }
80
+ // Auto-install missing skills
81
+ if (persona.skills) {
82
+ const skillRefs = Object.keys(persona.skills);
83
+ if (skillRefs.length > 0) {
84
+ const index = await getSkillIndex();
85
+ const missing = [];
86
+ for (const ref of skillRefs) {
87
+ if (!findSkill(index, ref)) {
88
+ missing.push(ref);
89
+ }
90
+ }
91
+ if (missing.length > 0) {
92
+ log.step(`Installing ${missing.length} missing skill(s)...`);
93
+ const config = await readConfig();
94
+ const { skillsDir } = await resolveSkillsDir();
95
+ for (const ref of missing) {
96
+ const parsed = parseSkillRef(ref);
97
+ if (!parsed) {
98
+ log.warning(`Skipping invalid ref: ${ref}`);
99
+ continue;
100
+ }
101
+ const client = getClientForSkill(config, ref);
102
+ if (!client) {
103
+ log.warning(`No registry for ${ref}, skipping.`);
104
+ continue;
105
+ }
106
+ try {
107
+ await installSingleFromRegistry(parsed.author, parsed.name, skillsDir, client);
108
+ }
109
+ catch {
110
+ log.warning(`Failed to install skill "${ref}", skipping.`);
111
+ }
112
+ }
113
+ }
114
+ }
115
+ }
116
+ await setActivePersona(name);
117
+ log.success(`Active persona set to: ${name}`);
118
+ log.info("Restart your MCP client to apply.");
119
+ }
120
+ async function personaDeactivateCommand() {
121
+ const config = await readConfig();
122
+ if (!config.active_persona) {
123
+ log.info("No active persona.");
124
+ return;
125
+ }
126
+ const name = config.active_persona;
127
+ await setActivePersona(null);
128
+ log.success(`Deactivated persona "${name}".`);
129
+ log.info("Restart your MCP client to apply.");
130
+ }
131
+ async function personaRemoveCommand(name) {
132
+ const { removePersona } = await import("./remove.js");
133
+ await removePersona(name);
134
+ }
135
+ async function personaInfoCommand(name) {
136
+ const persona = await readPersona(name);
137
+ if (!persona) {
138
+ exitError(`Persona "${name}" not found. Use \`spm persona list\` to see available personas.`);
139
+ }
140
+ const lines = [];
141
+ lines.push(`description: ${persona.description}`);
142
+ lines.push(`author: ${persona.author}`);
143
+ lines.push(`license: ${persona.license}`);
144
+ lines.push("");
145
+ lines.push("character:");
146
+ lines.push(` role: ${persona.character.role}`);
147
+ if (persona.character.tone) {
148
+ lines.push(` tone: ${persona.character.tone}`);
149
+ }
150
+ if (persona.character.guidelines && persona.character.guidelines.length > 0) {
151
+ lines.push(" guidelines:");
152
+ for (const g of persona.character.guidelines) {
153
+ lines.push(` - ${g}`);
154
+ }
155
+ }
156
+ if (persona.character.instructions) {
157
+ lines.push(` instructions: ${persona.character.instructions}`);
158
+ }
159
+ if (persona.settings) {
160
+ lines.push("");
161
+ lines.push("settings:");
162
+ for (const [key, value] of Object.entries(persona.settings)) {
163
+ if (value !== undefined) {
164
+ lines.push(` ${key}: ${value}`);
165
+ }
166
+ }
167
+ }
168
+ if (persona.skills) {
169
+ const deps = Object.entries(persona.skills);
170
+ if (deps.length > 0) {
171
+ lines.push("");
172
+ lines.push("dependencies:");
173
+ for (const [dep, range] of deps) {
174
+ lines.push(` - ${dep}: ${range}`);
175
+ }
176
+ }
177
+ }
178
+ note(lines.join("\n"), `${persona.name}@${persona.version}`);
179
+ }
180
+ async function personaValidateCommand(filePath) {
181
+ const resolved = path.resolve(filePath);
182
+ try {
183
+ const raw = await fs.readFile(resolved, "utf-8");
184
+ const data = JSON.parse(raw);
185
+ const result = validatePersonaManifest(data);
186
+ if (result.valid) {
187
+ log.success(`Valid persona manifest: ${resolved}`);
188
+ }
189
+ else {
190
+ exitError(`Invalid persona manifest: ${resolved}\n${result.errors.map((e) => ` ${e}`).join("\n")}`);
191
+ }
192
+ }
193
+ catch (err) {
194
+ const message = err instanceof Error ? err.message : String(err);
195
+ exitError(`Failed to read/parse ${resolved}: ${message}`);
196
+ }
197
+ }
198
+ // --- Command definition ---
199
+ export const command = {
200
+ name: "persona",
201
+ description: "Manage AI personas",
202
+ group: "personas",
203
+ subcommands: [
204
+ {
205
+ name: "create",
206
+ description: "Create a new persona scaffold (.person.json)",
207
+ group: "personas",
208
+ args: [{ name: "name", required: true }],
209
+ handler: personaCreateCommand,
210
+ },
211
+ {
212
+ name: "list",
213
+ description: "List installed personas",
214
+ group: "personas",
215
+ handler: personaListCommand,
216
+ },
217
+ {
218
+ name: "activate",
219
+ description: "Activate persona (auto-installs missing skills)",
220
+ group: "personas",
221
+ args: [{ name: "name", required: true }],
222
+ handler: personaActivateCommand,
223
+ },
224
+ {
225
+ name: "deactivate",
226
+ description: "Deactivate current persona",
227
+ group: "personas",
228
+ handler: personaDeactivateCommand,
229
+ },
230
+ {
231
+ name: "info",
232
+ description: "Show detailed information about a persona",
233
+ group: "personas",
234
+ args: [{ name: "name", required: true }],
235
+ handler: personaInfoCommand,
236
+ },
237
+ {
238
+ name: "remove",
239
+ description: "Remove a persona from global installation",
240
+ group: "personas",
241
+ args: [{ name: "name", required: true }],
242
+ handler: personaRemoveCommand,
243
+ },
244
+ {
245
+ name: "validate",
246
+ description: "Validate a .person.json file",
247
+ group: "personas",
248
+ args: [{ name: "path", required: true }],
249
+ handler: personaValidateCommand,
250
+ },
251
+ ],
252
+ };
253
+ //# sourceMappingURL=persona.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persona.js","sourceRoot":"","sources":["../../../src/cli/commands/persona.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,YAAY,EACZ,WAAW,EACX,cAAc,EACd,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEvE,OAAO,EAAE,GAAG,EAAW,IAAI,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGzD,SAAS,aAAa,CAAC,GAAW;IAChC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACxD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY;IACxC,OAAO;QACL,cAAc,EAAE,CAAC;QACjB,IAAI;QACJ,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,kBAAkB,IAAI,UAAU;QAC7C,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,KAAK;QACd,MAAM,EAAE,EAAE;QACV,SAAS,EAAE;YACT,IAAI,EAAE,kDAAkD;YACxD,IAAI,EAAE,4CAA4C;YAClD,UAAU,EAAE;gBACV,iCAAiC;aAClC;SACF;KACF,CAAC;AACJ,CAAC;AAED,mBAAmB;AAEnB,KAAK,UAAU,oBAAoB,CAAC,IAAY;IAC9C,MAAM,QAAQ,GAAG,GAAG,IAAI,cAAc,CAAC;IACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAExC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1B,SAAS,CAAC,SAAS,QAAQ,mBAAmB,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,4BAA4B;IAC9B,CAAC;IAED,MAAM,QAAQ,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IAEhF,GAAG,CAAC,OAAO,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAC;IACrD,IAAI,CACF,WAAW,QAAQ,kEAAkE,IAAI,6BAA6B,IAAI,EAAE,EAC5H,YAAY,CACb,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,kBAAkB;IAC/B,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;IAEtC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,GAAG,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACnC,GAAG,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAC;QAC9D,OAAO;IACT,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,GAAG,CAAC,OAAO,CACT,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,GAAG,MAAM,MAAM,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,kBAAkB,UAAU,CACtF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,IAAY;IAChD,sCAAsC;IACtC,IAAI,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IAEtC,4DAA4D;IAC5D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,QAAQ,GAAG,GAAG,IAAI,cAAc,CAAC;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1B,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YACnE,OAAO,GAAG,SAAS,CAAC;YACpB,GAAG,CAAC,OAAO,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,CAAC,YAAY,IAAI,iFAAiF,IAAI,KAAK,CAAC,CAAC;QACxH,CAAC;IACH,CAAC;IAED,8BAA8B;IAC9B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC;YACpC,MAAM,OAAO,GAAa,EAAE,CAAC;YAE7B,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;gBAC5B,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;oBAC3B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACpB,CAAC;YACH,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,GAAG,CAAC,IAAI,CAAC,cAAc,OAAO,CAAC,MAAM,sBAAsB,CAAC,CAAC;gBAC7D,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;gBAClC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,gBAAgB,EAAE,CAAC;gBAE/C,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;oBAC1B,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;oBAClC,IAAI,CAAC,MAAM,EAAE,CAAC;wBACZ,GAAG,CAAC,OAAO,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC;wBAC5C,SAAS;oBACX,CAAC;oBAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;oBAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;wBACZ,GAAG,CAAC,OAAO,CAAC,mBAAmB,GAAG,aAAa,CAAC,CAAC;wBACjD,SAAS;oBACX,CAAC;oBAED,IAAI,CAAC;wBACH,MAAM,yBAAyB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;oBACjF,CAAC;oBAAC,MAAM,CAAC;wBACP,GAAG,CAAC,OAAO,CAAC,4BAA4B,GAAG,cAAc,CAAC,CAAC;oBAC7D,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC7B,GAAG,CAAC,OAAO,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;IAC9C,GAAG,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;AAChD,CAAC;AAED,KAAK,UAAU,wBAAwB;IACrC,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QAC3B,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,cAAc,CAAC;IACnC,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC7B,GAAG,CAAC,OAAO,CAAC,wBAAwB,IAAI,IAAI,CAAC,CAAC;IAC9C,GAAG,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;AAChD,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,IAAY;IAC9C,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IACtD,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,IAAY;IAC5C,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,SAAS,CAAC,YAAY,IAAI,kEAAkE,CAAC,CAAC;IAChG,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,gBAAgB,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAClD,KAAK,CAAC,IAAI,CAAC,gBAAgB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7C,KAAK,CAAC,IAAI,CAAC,gBAAgB,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACzB,KAAK,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IAChD,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,WAAW,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,IAAI,OAAO,CAAC,SAAS,CAAC,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5E,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC5B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;YAC7C,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,mBAAmB,OAAO,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC5B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;gBAChC,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,QAAgB;IACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAExC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,MAAM,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;QAE7C,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,GAAG,CAAC,OAAO,CAAC,2BAA2B,QAAQ,EAAE,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,6BAA6B,QAAQ,KAAK,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvG,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,SAAS,CAAC,wBAAwB,QAAQ,KAAK,OAAO,EAAE,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAED,6BAA6B;AAE7B,MAAM,CAAC,MAAM,OAAO,GAAe;IACjC,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,oBAAoB;IACjC,KAAK,EAAE,UAAU;IACjB,WAAW,EAAE;QACX;YACE,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,8CAA8C;YAC3D,KAAK,EAAE,UAAU;YACjB,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YACxC,OAAO,EAAE,oBAAoB;SAC9B;QACD;YACE,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,yBAAyB;YACtC,KAAK,EAAE,UAAU;YACjB,OAAO,EAAE,kBAAkB;SAC5B;QACD;YACE,IAAI,EAAE,UAAU;YAChB,WAAW,EAAE,iDAAiD;YAC9D,KAAK,EAAE,UAAU;YACjB,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YACxC,OAAO,EAAE,sBAAsB;SAChC;QACD;YACE,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,4BAA4B;YACzC,KAAK,EAAE,UAAU;YACjB,OAAO,EAAE,wBAAwB;SAClC;QACD;YACE,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,2CAA2C;YACxD,KAAK,EAAE,UAAU;YACjB,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YACxC,OAAO,EAAE,kBAAkB;SAC5B;QACD;YACE,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,2CAA2C;YACxD,KAAK,EAAE,UAAU;YACjB,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YACxC,OAAO,EAAE,oBAAoB;SAC9B;QACD;YACE,IAAI,EAAE,UAAU;YAChB,WAAW,EAAE,8BAA8B;YAC3C,KAAK,EAAE,UAAU;YACjB,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YACxC,OAAO,EAAE,sBAAsB;SAChC;KACF;CACF,CAAC"}
@@ -1,3 +1,5 @@
1
+ import type { CommandDef } from "../command.js";
2
+ export declare const command: CommandDef;
1
3
  export declare function publishCommand(source: string, options: {
2
4
  registry?: string;
3
5
  github?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/publish.ts"],"names":[],"mappings":"AAeA,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GACjE,OAAO,CAAC,IAAI,CAAC,CAmHf"}
1
+ {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/publish.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,eAAO,MAAM,OAAO,EAAE,UAWrB,CAAC;AAEF,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GACjE,OAAO,CAAC,IAAI,CAAC,CA8Gf"}
@@ -5,13 +5,19 @@ 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
7
  import { parseGitHubUrl } from "../../core/github/client.js";
8
- function formatSize(bytes) {
9
- if (bytes < 1024)
10
- return `${bytes} B`;
11
- if (bytes < 1024 * 1024)
12
- return `${(bytes / 1024).toFixed(1)} KB`;
13
- return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
14
- }
8
+ import { log, spinner, note, exitError, formatSize } from "../ui.js";
9
+ export const command = {
10
+ name: "publish",
11
+ description: "Publish a skill to registry",
12
+ group: "registry",
13
+ args: [{ name: "source", required: true }],
14
+ options: [
15
+ { flags: "--registry <name>", description: "Publish to a specific registry" },
16
+ { flags: "--github", description: "Source is a GitHub URL" },
17
+ { flags: "--dry-run", description: "Show what would happen without executing" },
18
+ ],
19
+ handler: publishCommand,
20
+ };
15
21
  export async function publishCommand(source, options) {
16
22
  const config = await readConfig();
17
23
  let registryName = options.registry;
@@ -19,22 +25,20 @@ export async function publishCommand(source, options) {
19
25
  registryName = config.scopes["*"];
20
26
  }
21
27
  if (!registryName) {
22
- console.error("Error: no default registry configured. Use 'skills login <url>' first.");
23
- process.exit(1);
28
+ exitError("No default registry configured. Use 'skills login <url>' first.");
24
29
  }
25
30
  const reg = config.registries.find((r) => r.name === registryName);
26
31
  if (!reg) {
27
- console.error(`Error: registry "${registryName}" not found in config.`);
28
- process.exit(1);
32
+ exitError(`Registry "${registryName}" not found in config.`);
29
33
  }
30
34
  if (!reg.token) {
31
- console.error(`Error: no token for registry "${registryName}". Use 'skills login' first.`);
32
- process.exit(1);
35
+ exitError(`No token for registry "${registryName}". Use 'skills login' first.`);
33
36
  }
34
37
  const client = new RegistryClient(reg.url, reg.token);
35
38
  const isGitHub = options.github || source.includes("github.com") || source.startsWith("github:");
36
39
  if (isGitHub) {
37
- console.log(`Publishing from GitHub: ${source}`);
40
+ const s = spinner();
41
+ s.start(`Publishing from GitHub: ${source}`);
38
42
  const ghSource = parseGitHubUrl(source);
39
43
  const result = await client.publish({
40
44
  manifest: {},
@@ -46,7 +50,7 @@ export async function publishCommand(source, options) {
46
50
  path: ghSource.path,
47
51
  },
48
52
  });
49
- console.log(result.updated
53
+ s.stop(result.updated
50
54
  ? `Updated ${result.name}@${result.version}`
51
55
  : `Published ${result.name}@${result.version}`);
52
56
  return;
@@ -59,24 +63,18 @@ export async function publishCommand(source, options) {
59
63
  const data = JSON.parse(raw);
60
64
  const validation = validateSkillManifest(data);
61
65
  if (!validation.valid) {
62
- console.error("Invalid skill.json:");
63
- for (const error of validation.errors) {
64
- console.error(` - ${error}`);
65
- }
66
- process.exit(1);
66
+ exitError(`Invalid skill.json:\n${validation.errors.map((e) => ` - ${e}`).join("\n")}`);
67
67
  }
68
68
  manifest = data;
69
69
  }
70
70
  catch (err) {
71
71
  if (err.code === "ENOENT") {
72
- console.error(`Error: cannot read skill.json in "${source}".`);
73
- process.exit(1);
72
+ exitError(`Cannot read skill.json in "${source}".`);
74
73
  }
75
74
  throw err;
76
75
  }
77
76
  if (!manifest.entry) {
78
- console.error("Error: skill.json has no 'entry' field. Bundles cannot be published — only skills with an entry point.");
79
- process.exit(1);
77
+ exitError("skill.json has no 'entry' field. Bundles cannot be published — only skills with an entry point.");
80
78
  }
81
79
  const entryPath = path.join(skillDir, manifest.entry);
82
80
  const content = await fs.readFile(entryPath, "utf-8");
@@ -90,20 +88,20 @@ export async function publishCommand(source, options) {
90
88
  }
91
89
  }
92
90
  // Package skill directory into .tar.gz
93
- console.log(`Packaging ${manifest.name}@${manifest.version}...`);
91
+ const s = spinner();
92
+ s.start(`Packaging ${manifest.name}@${manifest.version}...`);
94
93
  const pkg = await packSkill(skillDir);
95
94
  if (options.dryRun) {
96
- console.log(`[dry-run] Would publish ${manifest.name}@${manifest.version} to ${reg.name}`);
97
- console.log(` Package size: ${formatSize(pkg.size)} (${pkg.filesCount} files)`);
98
- console.log(` Integrity: ${pkg.integrity}`);
95
+ s.stop("Done (dry-run)");
96
+ note(`Would publish ${manifest.name}@${manifest.version} to ${reg.name}\nPackage size: ${formatSize(pkg.size)} (${pkg.filesCount} files)\nIntegrity: ${pkg.integrity}`, "Dry run");
99
97
  return;
100
98
  }
101
- console.log(`Publishing ${manifest.name}@${manifest.version} to ${reg.name}...`);
99
+ s.message(`Publishing ${manifest.name}@${manifest.version} to ${reg.name}...`);
102
100
  const result = await client.publishWithArchive({ manifest, content, compact_content: compactContent }, pkg.data);
103
- console.log(result.updated
101
+ s.stop(result.updated
104
102
  ? `Updated ${result.name}@${result.version}`
105
103
  : `Published ${result.name}@${result.version}`);
106
- console.log(` Size: ${formatSize(result.size ?? pkg.size)}`);
107
- console.log(` Tokens: ~${Math.ceil(content.length / 4).toLocaleString()}`);
104
+ log.info(`Size: ${formatSize(result.size ?? pkg.size)}`);
105
+ log.info(`Tokens: ~${Math.ceil(content.length / 4).toLocaleString()}`);
108
106
  }
109
107
  //# sourceMappingURL=publish.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../../src/cli/commands/publish.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../../src/cli/commands/publish.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,5 @@
1
+ import type { CommandDef } from "../command.js";
2
+ export declare const command: CommandDef;
1
3
  export declare function rateCommand(name: string, options: {
2
4
  score: string;
3
5
  comment?: string;