@micar-tsp/skillhub 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/README.md +34 -0
  2. package/dist/commands/config.d.ts +2 -0
  3. package/dist/commands/config.js +67 -0
  4. package/dist/commands/config.js.map +1 -0
  5. package/dist/commands/index.d.ts +4 -0
  6. package/dist/commands/index.js +5 -0
  7. package/dist/commands/index.js.map +1 -0
  8. package/dist/commands/publish.d.ts +2 -0
  9. package/dist/commands/publish.js +59 -0
  10. package/dist/commands/publish.js.map +1 -0
  11. package/dist/commands/skills.d.ts +5 -0
  12. package/dist/commands/skills.js +127 -0
  13. package/dist/commands/skills.js.map +1 -0
  14. package/dist/commands/user.d.ts +2 -0
  15. package/dist/commands/user.js +15 -0
  16. package/dist/commands/user.js.map +1 -0
  17. package/dist/format/output.d.ts +2 -0
  18. package/dist/format/output.js +28 -0
  19. package/dist/format/output.js.map +1 -0
  20. package/dist/format/publish.d.ts +2 -0
  21. package/dist/format/publish.js +13 -0
  22. package/dist/format/publish.js.map +1 -0
  23. package/dist/format/skills.d.ts +21 -0
  24. package/dist/format/skills.js +114 -0
  25. package/dist/format/skills.js.map +1 -0
  26. package/dist/format/user.d.ts +4 -0
  27. package/dist/format/user.js +23 -0
  28. package/dist/format/user.js.map +1 -0
  29. package/dist/index.d.ts +2 -0
  30. package/dist/index.js +39 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/lib/api.d.ts +29 -0
  33. package/dist/lib/api.js +108 -0
  34. package/dist/lib/api.js.map +1 -0
  35. package/dist/lib/archive.d.ts +8 -0
  36. package/dist/lib/archive.js +85 -0
  37. package/dist/lib/archive.js.map +1 -0
  38. package/dist/lib/config.d.ts +32 -0
  39. package/dist/lib/config.js +78 -0
  40. package/dist/lib/config.js.map +1 -0
  41. package/dist/lib/constants.d.ts +4 -0
  42. package/dist/lib/constants.js +5 -0
  43. package/dist/lib/constants.js.map +1 -0
  44. package/dist/lib/context.d.ts +15 -0
  45. package/dist/lib/context.js +15 -0
  46. package/dist/lib/context.js.map +1 -0
  47. package/dist/lib/download.d.ts +8 -0
  48. package/dist/lib/download.js +27 -0
  49. package/dist/lib/download.js.map +1 -0
  50. package/dist/lib/errors.d.ts +12 -0
  51. package/dist/lib/errors.js +12 -0
  52. package/dist/lib/errors.js.map +1 -0
  53. package/dist/lib/human.d.ts +2 -0
  54. package/dist/lib/human.js +20 -0
  55. package/dist/lib/human.js.map +1 -0
  56. package/dist/lib/page.d.ts +7 -0
  57. package/dist/lib/page.js +15 -0
  58. package/dist/lib/page.js.map +1 -0
  59. package/dist/lib/target.d.ts +8 -0
  60. package/dist/lib/target.js +30 -0
  61. package/dist/lib/target.js.map +1 -0
  62. package/dist/lib/token.d.ts +1 -0
  63. package/dist/lib/token.js +8 -0
  64. package/dist/lib/token.js.map +1 -0
  65. package/dist/lib/types.d.ts +62 -0
  66. package/dist/lib/types.js +2 -0
  67. package/dist/lib/types.js.map +1 -0
  68. package/package.json +48 -0
package/README.md ADDED
@@ -0,0 +1,34 @@
1
+ # SkillHub CLI
2
+
3
+ Local SkillHub CLI for token-authenticated skill management.
4
+
5
+ Default API base URL: `https://pre-ai-mcp.tsp.xiaomi.net/skillhub`
6
+
7
+ Frontend page: `https://pre-skillhub.tsp.mioffice.cn`
8
+
9
+ Contact: `luozhilin@xiaomi.com`
10
+
11
+ ## Development
12
+
13
+ ```bash
14
+ pnpm install
15
+ pnpm build
16
+ pnpm test
17
+ pnpm dev -- --help
18
+ ```
19
+
20
+ ## Examples
21
+
22
+ ```bash
23
+ skillhub login --token sk_xxx
24
+ skillhub login --token sk_xxx --base-url http://localhost:8080
25
+ skillhub whoami
26
+ skillhub search calendar
27
+ skillhub detail team/calendar
28
+ skillhub labels
29
+ skillhub my skills
30
+ skillhub my namespaces
31
+ skillhub download team/calendar -o ./downloads
32
+ skillhub install team/calendar --dir ~/.claude/skills
33
+ skillhub publish team ./calendar.zip --visibility NAMESPACE_ONLY --display-name "Calendar Assistant" --label recommended
34
+ ```
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerConfigCommands(program: Command): void;
@@ -0,0 +1,67 @@
1
+ import { getConfigPath, readConfig, updateConfig, validateConfigKey, normalizeBaseUrl } from '../lib/config.js';
2
+ import { maskToken } from '../lib/token.js';
3
+ import { printResult } from '../format/output.js';
4
+ import { CliError } from '../lib/errors.js';
5
+ export function registerConfigCommands(program) {
6
+ program
7
+ .command('login')
8
+ .description('Save SkillHub token and optional base URL')
9
+ .option('--token <token>', '(required) API token; may also be provided as global --token')
10
+ .option('--base-url <url>', '(optional) SkillHub backend URL')
11
+ .action(async (options) => {
12
+ const parentOptions = program.opts();
13
+ const token = options.token ?? parentOptions.token;
14
+ if (!token)
15
+ throw new CliError('Missing required option --token.');
16
+ const baseUrl = options.baseUrl ? normalizeBaseUrl(options.baseUrl) : undefined;
17
+ const config = await updateConfig({ token, ...(baseUrl ? { baseUrl } : {}) });
18
+ const resolvedBaseUrl = config.baseUrl ?? 'https://pre-ai-mcp.tsp.xiaomi.net/skillhub';
19
+ printResult([
20
+ 'Logged in to SkillHub.',
21
+ `Base URL: ${resolvedBaseUrl}`,
22
+ `Token: ${maskToken(token)}`
23
+ ].join('\n'), false);
24
+ });
25
+ program
26
+ .command('logout')
27
+ .description('Remove saved token')
28
+ .action(async () => {
29
+ await updateConfig({ token: undefined });
30
+ printResult('Logged out from SkillHub.\nToken removed from local config.', false);
31
+ });
32
+ const config = program.command('config').description('View or update local config');
33
+ config
34
+ .command('get [key]')
35
+ .description('Show config values')
36
+ .action(async (key) => {
37
+ const current = await readConfig();
38
+ if (key) {
39
+ const configKey = validateConfigKey(key);
40
+ const value = configKey === 'token' ? maskToken(current.token) : current[configKey];
41
+ printResult(`${configKey}: ${value ?? ''}`, false);
42
+ return;
43
+ }
44
+ printResult([
45
+ `baseUrl: ${current.baseUrl ?? 'https://pre-ai-mcp.tsp.xiaomi.net/skillhub'}`,
46
+ `token: ${maskToken(current.token)}`,
47
+ `defaultDownloadDir: ${current.defaultDownloadDir ?? './downloads'}`
48
+ ].join('\n'), false);
49
+ });
50
+ config
51
+ .command('set <key> <value>')
52
+ .description('Set a config value')
53
+ .action(async (key, value) => {
54
+ const configKey = validateConfigKey(key);
55
+ const normalizedValue = configKey === 'baseUrl' ? normalizeBaseUrl(value) : value;
56
+ await updateConfig({ [configKey]: normalizedValue });
57
+ const suffix = configKey === 'token' ? `\nToken: ${maskToken(value)}` : '';
58
+ printResult(`Updated config: ${configKey}${suffix}`, false);
59
+ });
60
+ config
61
+ .command('path')
62
+ .description('Show config file path')
63
+ .action(() => {
64
+ printResult(getConfigPath(), false);
65
+ });
66
+ }
67
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { registerConfigCommands } from './config.js';
2
+ export { registerUserCommands } from './user.js';
3
+ export { registerSkillCommands } from './skills.js';
4
+ export { registerPublishCommand } from './publish.js';
@@ -0,0 +1,5 @@
1
+ export { registerConfigCommands } from './config.js';
2
+ export { registerUserCommands } from './user.js';
3
+ export { registerSkillCommands } from './skills.js';
4
+ export { registerPublishCommand } from './publish.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAChD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerPublishCommand(program: Command): void;
@@ -0,0 +1,59 @@
1
+ import { createReadStream, existsSync } from 'node:fs';
2
+ import { basename } from 'node:path';
3
+ import { createContext } from '../lib/context.js';
4
+ import { CliError } from '../lib/errors.js';
5
+ import { printResult } from '../format/output.js';
6
+ import { formatPublish } from '../format/publish.js';
7
+ import { assertRecommendedLabel } from './skills.js';
8
+ const VISIBILITIES = new Set(['PUBLIC', 'PRIVATE', 'NAMESPACE_ONLY']);
9
+ export function registerPublishCommand(program) {
10
+ program
11
+ .command('publish <namespace> <packageFile>')
12
+ .description('Publish a skill package')
13
+ .requiredOption('--visibility <visibility>', '(required) PUBLIC, PRIVATE, or NAMESPACE_ONLY')
14
+ .requiredOption('--display-name <name>', '(required) Skill display name')
15
+ .option('--summary <summary>', '(optional) Skill summary')
16
+ .option('--label <slug>', '(required, repeatable) Recommended label slug. At least one recommended label is required.', collect, [])
17
+ .action(async (namespace, packageFile, options) => {
18
+ const visibility = options.visibility.toUpperCase();
19
+ if (!VISIBILITIES.has(visibility))
20
+ throw new CliError('Invalid visibility. Expected PUBLIC, PRIVATE, or NAMESPACE_ONLY.');
21
+ if (!existsSync(packageFile))
22
+ throw new CliError(`Package file not found: ${packageFile}`);
23
+ if (options.label.length === 0)
24
+ throw new CliError('At least one recommended --label is required.\nUse "skillhub labels" to view available recommended labels.', { code: 'PUBLISH_RECOMMENDED_LABEL_REQUIRED' });
25
+ const context = await createContext(program.opts());
26
+ await assertRecommendedLabel(context.client, options.label);
27
+ const form = new FormData();
28
+ const file = new Blob([await streamToArrayBuffer(createReadStream(packageFile))]);
29
+ form.set('file', file, basename(packageFile));
30
+ form.set('visibility', visibility);
31
+ if (options.summary)
32
+ form.set('summary', options.summary);
33
+ form.set('displayName', options.displayName);
34
+ for (const label of options.label)
35
+ form.append('labelSlugs', label);
36
+ const result = await context.client.uploadMultipart(`/skills/${encodeURIComponent(namespace)}/publish`, form);
37
+ printResult(context.json ? result : formatPublish(result), context.json);
38
+ });
39
+ }
40
+ function collect(value, previous) {
41
+ return [...previous, value];
42
+ }
43
+ async function streamToArrayBuffer(stream) {
44
+ const chunks = [];
45
+ for await (const chunk of stream) {
46
+ if (Buffer.isBuffer(chunk)) {
47
+ chunks.push(chunk);
48
+ }
49
+ else if (typeof chunk === 'string') {
50
+ chunks.push(Buffer.from(chunk));
51
+ }
52
+ else {
53
+ chunks.push(Buffer.from(chunk));
54
+ }
55
+ }
56
+ const buffer = Buffer.concat(chunks);
57
+ return buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength);
58
+ }
59
+ //# sourceMappingURL=publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerSkillCommands(program: Command): void;
3
+ export declare function assertRecommendedLabel(client: {
4
+ getJson<T>(path: string): Promise<T>;
5
+ }, labels: string[]): Promise<void>;
@@ -0,0 +1,127 @@
1
+ import path from 'node:path';
2
+ import { promises as fs } from 'node:fs';
3
+ import { createContext } from '../lib/context.js';
4
+ import { encodeTargetPath, formatSkillTarget, parseSkillTarget } from '../lib/target.js';
5
+ import { fallbackArchiveName, writeDownload } from '../lib/download.js';
6
+ import { installArchive } from '../lib/archive.js';
7
+ import { getPageItems, getPageMeta } from '../lib/page.js';
8
+ import { CliError } from '../lib/errors.js';
9
+ import { formatDetail, formatDownload, formatInstall, formatLabels, formatMySkills, formatNamespaces, formatSearch, normalizeDetail, normalizeSkillSummary } from '../format/skills.js';
10
+ import { printResult } from '../format/output.js';
11
+ export function registerSkillCommands(program) {
12
+ program
13
+ .command('search [query]')
14
+ .description('Search skills')
15
+ .option('--namespace <namespace>', '(optional) Filter by namespace')
16
+ .option('--label <label>', '(optional) Filter by label', collect, [])
17
+ .option('--sort <sort>', '(optional) Sort mode', 'newest')
18
+ .option('--page <page>', '(optional) Page number', '0')
19
+ .option('--size <size>', '(optional) Page size', '20')
20
+ .action(async (query, options) => {
21
+ const context = await createContext(program.opts());
22
+ const page = await context.client.getJson('/skills', {
23
+ q: query,
24
+ namespace: options.namespace,
25
+ label: options.label,
26
+ sort: options.sort,
27
+ page: Number(options.page),
28
+ size: Number(options.size)
29
+ });
30
+ if (context.json) {
31
+ printResult({ items: getPageItems(page).map(normalizeSkillSummary), ...getPageMeta(page) }, true);
32
+ return;
33
+ }
34
+ printResult(formatSearch(page), false);
35
+ });
36
+ program
37
+ .command('detail <skill>')
38
+ .description('Show published skill details')
39
+ .action(async (skill) => {
40
+ const context = await createContext(program.opts());
41
+ const target = parseSkillTarget(skill);
42
+ const detail = await context.client.getJson(encodeTargetPath(target));
43
+ printResult(context.json ? normalizeDetail(detail) : formatDetail(detail), context.json);
44
+ });
45
+ program
46
+ .command('labels')
47
+ .description('List visible labels')
48
+ .action(async () => {
49
+ const context = await createContext(program.opts());
50
+ const labels = await context.client.getJson('/labels');
51
+ printResult(context.json ? { items: labels } : formatLabels(labels), context.json);
52
+ });
53
+ const my = program.command('my').description('Current user resources');
54
+ my.command('skills')
55
+ .description('List skills owned by current user')
56
+ .option('--page <page>', '(optional) Page number', '0')
57
+ .option('--size <size>', '(optional) Page size', '20')
58
+ .action(async (options) => {
59
+ const context = await createContext(program.opts());
60
+ const page = await context.client.getJson('/me/skills', { page: Number(options.page), size: Number(options.size) });
61
+ if (context.json)
62
+ printResult({ items: getPageItems(page).map((skill) => ({ namespace: skill.namespace, slug: skill.slug, displayName: skill.displayName, visibility: skill.visibility })), ...getPageMeta(page) }, true);
63
+ else
64
+ printResult(formatMySkills(page), false);
65
+ });
66
+ my.command('namespaces')
67
+ .description('List namespaces joined by current user')
68
+ .action(async () => {
69
+ const context = await createContext(program.opts());
70
+ const namespaces = await context.client.getJson('/me/namespaces');
71
+ printResult(context.json ? { items: namespaces } : formatNamespaces(namespaces), context.json);
72
+ });
73
+ program
74
+ .command('download <skill>')
75
+ .description('Download a skill package')
76
+ .option('-o, --output <path>', '(optional) Output file or directory')
77
+ .option('--version <version>', '(optional) Skill version')
78
+ .option('--force', '(optional) Overwrite output file if it exists')
79
+ .action(async (skill, options) => {
80
+ const context = await createContext(program.opts());
81
+ const target = parseSkillTarget(skill);
82
+ const response = await context.client.download(`${encodeTargetPath(target)}/download`, { version: options.version });
83
+ const fileName = response.fileName ?? fallbackArchiveName(formatSkillTarget(target));
84
+ const output = options.output ?? context.defaultDownloadDir ?? process.cwd();
85
+ const file = await writeDownload({ bytes: response.bytes, output, fileName, force: Boolean(options.force) });
86
+ const result = { skill: formatSkillTarget(target), file, sizeBytes: response.bytes.byteLength };
87
+ printResult(context.json ? result : formatDownload(result), context.json);
88
+ });
89
+ program
90
+ .command('install <skill>')
91
+ .description('Download and install a skill')
92
+ .requiredOption('--dir <skillsDir>', '(required) Target skills directory')
93
+ .option('--version <version>', '(optional) Skill version')
94
+ .option('--force', '(optional) Overwrite existing skill directory')
95
+ .option('--keep-archive', '(optional) Keep downloaded archive')
96
+ .action(async (skill, options) => {
97
+ const context = await createContext(program.opts());
98
+ const target = parseSkillTarget(skill);
99
+ const response = await context.client.download(`${encodeTargetPath(target)}/download`, { version: options.version });
100
+ const fileName = response.fileName ?? fallbackArchiveName(formatSkillTarget(target));
101
+ const tempDir = await fs.mkdtemp(path.join(process.cwd(), '.skillhub-download-'));
102
+ const archivePath = await writeDownload({ bytes: response.bytes, output: path.join(tempDir, fileName), fileName, force: true });
103
+ try {
104
+ const directory = await installArchive({ archivePath, targetDir: options.dir, slug: target.slug, force: Boolean(options.force) });
105
+ const result = { skill: formatSkillTarget(target), directory, version: options.version, overwritten: Boolean(options.force) };
106
+ printResult(context.json ? result : formatInstall(result), context.json);
107
+ }
108
+ finally {
109
+ if (options.keepArchive) {
110
+ const keepPath = path.resolve(fileName);
111
+ await fs.copyFile(archivePath, keepPath);
112
+ }
113
+ await fs.rm(tempDir, { recursive: true, force: true });
114
+ }
115
+ });
116
+ }
117
+ function collect(value, previous) {
118
+ return [...previous, value];
119
+ }
120
+ export async function assertRecommendedLabel(client, labels) {
121
+ const available = await client.getJson('/labels');
122
+ const recommended = new Set(available.filter((label) => label.type === 'RECOMMENDED').map((label) => label.slug));
123
+ if (!labels.some((label) => recommended.has(label))) {
124
+ throw new CliError('At least one recommended --label is required.\nUse "skillhub labels" to view available recommended labels.', { code: 'PUBLISH_RECOMMENDED_LABEL_REQUIRED' });
125
+ }
126
+ }
127
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerUserCommands(program: Command): void;
@@ -0,0 +1,15 @@
1
+ import { createContext } from '../lib/context.js';
2
+ import { formatWhoami, normalizeWhoami } from '../format/user.js';
3
+ import { printResult } from '../format/output.js';
4
+ export function registerUserCommands(program) {
5
+ program
6
+ .command('whoami')
7
+ .description('Show current authenticated user')
8
+ .action(async () => {
9
+ const opts = program.opts();
10
+ const context = await createContext(opts);
11
+ const user = await context.client.getJson('/auth/me');
12
+ printResult(context.json ? normalizeWhoami(user, context.baseUrl) : formatWhoami(user, context.baseUrl), context.json);
13
+ });
14
+ }
15
+ //# sourceMappingURL=user.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.js","sourceRoot":"","sources":["../../src/commands/user.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEjD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEjD,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,iCAAiC,CAAC;SAC9C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAA2E,CAAA;QACpG,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,CAAA;QACzC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,CAAS,UAAU,CAAC,CAAA;QAC7D,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;IACxH,CAAC,CAAC,CAAA;AACN,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function printResult(value: unknown, json: boolean): void;
2
+ export declare function printError(error: unknown, verbose: boolean): void;
@@ -0,0 +1,28 @@
1
+ import { isCliError } from '../lib/errors.js';
2
+ export function printResult(value, json) {
3
+ if (json) {
4
+ console.log(JSON.stringify(value, null, 2));
5
+ return;
6
+ }
7
+ if (typeof value === 'string')
8
+ console.log(value);
9
+ }
10
+ export function printError(error, verbose) {
11
+ if (isCliError(error)) {
12
+ console.error(`Error: ${error.message}`);
13
+ if (verbose && error.details) {
14
+ if (error.details.request)
15
+ console.error(`Request: ${error.details.request}`);
16
+ if (error.details.status)
17
+ console.error(`Status: ${error.details.status}`);
18
+ if (error.details.requestId)
19
+ console.error(`Request ID: ${error.details.requestId}`);
20
+ if (error.details.backendMessage)
21
+ console.error(`Backend message: ${error.details.backendMessage}`);
22
+ }
23
+ return;
24
+ }
25
+ const message = error instanceof Error ? error.message : String(error);
26
+ console.error(`Error: ${message}`);
27
+ }
28
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/format/output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,MAAM,UAAU,WAAW,CAAC,KAAc,EAAE,IAAa;IACvD,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QAC3C,OAAM;IACR,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;AACnD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAc,EAAE,OAAgB;IACzD,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;QACxC,IAAI,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAC7B,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO;gBAAE,OAAO,CAAC,KAAK,CAAC,YAAY,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;YAC7E,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM;gBAAE,OAAO,CAAC,KAAK,CAAC,WAAW,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;YAC1E,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS;gBAAE,OAAO,CAAC,KAAK,CAAC,eAAe,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAA;YACpF,IAAI,KAAK,CAAC,OAAO,CAAC,cAAc;gBAAE,OAAO,CAAC,KAAK,CAAC,oBAAoB,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAA;QACrG,CAAC;QACD,OAAM;IACR,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACtE,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,CAAC,CAAA;AACpC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { PublishResponse } from '../lib/types.js';
2
+ export declare function formatPublish(result: PublishResponse): string;
@@ -0,0 +1,13 @@
1
+ import { formatBytes } from '../lib/human.js';
2
+ export function formatPublish(result) {
3
+ return [
4
+ 'Published skill.',
5
+ `Namespace: ${result.namespace}`,
6
+ `Slug: ${result.slug}`,
7
+ `Version: ${result.version}`,
8
+ `Status: ${result.status}`,
9
+ `Files: ${result.fileCount}`,
10
+ `Size: ${formatBytes(result.totalSize)}`
11
+ ].join('\n');
12
+ }
13
+ //# sourceMappingURL=publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/format/publish.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAG7C,MAAM,UAAU,aAAa,CAAC,MAAuB;IACnD,OAAO;QACL,kBAAkB;QAClB,cAAc,MAAM,CAAC,SAAS,EAAE;QAChC,SAAS,MAAM,CAAC,IAAI,EAAE;QACtB,YAAY,MAAM,CAAC,OAAO,EAAE;QAC5B,WAAW,MAAM,CAAC,MAAM,EAAE;QAC1B,UAAU,MAAM,CAAC,SAAS,EAAE;QAC5B,SAAS,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE;KACzC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { LabelItem, NamespaceItem, PageResponse, SkillDetail, SkillSummary } from '../lib/types.js';
2
+ export declare function normalizeSkillSummary(skill: SkillSummary): Record<string, unknown>;
3
+ export declare function formatSearch(page: PageResponse<SkillSummary> | SkillSummary[]): string;
4
+ export declare function formatDetail(skill: SkillDetail): string;
5
+ export declare function normalizeDetail(skill: SkillDetail): Record<string, unknown>;
6
+ export declare function formatLabels(labels: LabelItem[]): string;
7
+ export declare function formatMySkills(page: PageResponse<SkillSummary> | SkillSummary[]): string;
8
+ export declare function formatNamespaces(items: NamespaceItem[]): string;
9
+ export declare function formatDownload(result: {
10
+ skill: string;
11
+ file: string;
12
+ sizeBytes: number;
13
+ }): string;
14
+ export declare function formatInstall(result: {
15
+ skill: string;
16
+ directory: string;
17
+ version?: string;
18
+ overwritten: boolean;
19
+ }): string;
20
+ export declare function nameOf(skill: Pick<SkillSummary, 'namespace' | 'slug'>): string;
21
+ export declare function versionOf(skill: SkillSummary): string | undefined;
@@ -0,0 +1,114 @@
1
+ import { formatBytes, valueOrDash } from '../lib/human.js';
2
+ import { getPageItems, getPageMeta } from '../lib/page.js';
3
+ export function normalizeSkillSummary(skill) {
4
+ return {
5
+ namespace: skill.namespace,
6
+ slug: skill.slug,
7
+ displayName: skill.displayName,
8
+ summary: skill.summary,
9
+ version: versionOf(skill)
10
+ };
11
+ }
12
+ export function formatSearch(page) {
13
+ const items = getPageItems(page);
14
+ if (items.length === 0)
15
+ return 'No skills found.';
16
+ const lines = [`Found ${getPageMeta(page).total} skills`, ''];
17
+ items.forEach((skill, index) => {
18
+ lines.push(`${index + 1}. ${nameOf(skill)}`);
19
+ lines.push(` Display name: ${valueOrDash(skill.displayName)}`);
20
+ lines.push(` Summary: ${valueOrDash(skill.summary)}`);
21
+ lines.push(` Version: ${valueOrDash(versionOf(skill))}`);
22
+ if (index < items.length - 1)
23
+ lines.push('');
24
+ });
25
+ return lines.join('\n');
26
+ }
27
+ export function formatDetail(skill) {
28
+ const labels = (skill.labels ?? []).map((label) => typeof label === 'string' ? label : label.slug).join(', ');
29
+ return [
30
+ nameOf(skill),
31
+ '',
32
+ `Display name: ${valueOrDash(skill.displayName)}`,
33
+ `Summary: ${valueOrDash(skill.summary)}`,
34
+ `Downloads: ${skill.downloadCount ?? 0}`,
35
+ `Calls: ${skill.callCount ?? 0}`,
36
+ `Stars: ${skill.starCount ?? 0}`,
37
+ `Rating: ${skill.ratingAvg ?? 0} (${skill.ratingCount ?? 0} ratings)`,
38
+ '',
39
+ `Published version: ${valueOrDash(versionOf(skill))}`,
40
+ `Labels: ${labels || '-'}`
41
+ ].join('\n');
42
+ }
43
+ export function normalizeDetail(skill) {
44
+ return {
45
+ namespace: skill.namespace,
46
+ slug: skill.slug,
47
+ displayName: skill.displayName,
48
+ summary: skill.summary,
49
+ downloadCount: skill.downloadCount ?? 0,
50
+ callCount: skill.callCount ?? 0,
51
+ starCount: skill.starCount ?? 0,
52
+ ratingAvg: skill.ratingAvg ?? 0,
53
+ ratingCount: skill.ratingCount ?? 0,
54
+ labels: (skill.labels ?? []).map((label) => typeof label === 'string' ? label : label.slug),
55
+ publishedVersion: versionOf(skill)
56
+ };
57
+ }
58
+ export function formatLabels(labels) {
59
+ if (labels.length === 0)
60
+ return 'No labels found.';
61
+ return ['Labels', '', ...labels.map((label) => `${label.slug.padEnd(12)} ${valueOrDash(label.displayName)}`)].join('\n');
62
+ }
63
+ export function formatMySkills(page) {
64
+ const items = getPageItems(page);
65
+ if (items.length === 0)
66
+ return 'No skills found.';
67
+ const lines = ['My skills', ''];
68
+ items.forEach((skill, index) => {
69
+ lines.push(`${index + 1}. ${nameOf(skill)}`);
70
+ lines.push(` Display name: ${valueOrDash(skill.displayName)}`);
71
+ lines.push(` Visibility: ${valueOrDash(skill.visibility)}`);
72
+ if (index < items.length - 1)
73
+ lines.push('');
74
+ });
75
+ return lines.join('\n');
76
+ }
77
+ export function formatNamespaces(items) {
78
+ if (items.length === 0)
79
+ return 'No namespaces found.';
80
+ const rows = items.map((item) => [item.slug, valueOrDash(item.displayName), valueOrDash(item.role), valueOrDash(item.description)]);
81
+ const widths = [10, 18, 8];
82
+ return [
83
+ 'My namespaces',
84
+ '',
85
+ `${'Slug'.padEnd(widths[0])} ${'Display name'.padEnd(widths[1])} ${'Role'.padEnd(widths[2])} Description`,
86
+ ...rows.map(([slug, displayName, role, description]) => `${slug.padEnd(widths[0])} ${displayName.padEnd(widths[1])} ${role.padEnd(widths[2])} ${description}`)
87
+ ].join('\n');
88
+ }
89
+ export function formatDownload(result) {
90
+ return [`Downloaded skill package.`, `Skill: ${result.skill}`, `File: ${result.file}`, `Size: ${formatBytes(result.sizeBytes)}`].join('\n');
91
+ }
92
+ export function formatInstall(result) {
93
+ const lines = ['Installed skill.', `Skill: ${result.skill}`, `Directory: ${result.directory}`];
94
+ if (result.version)
95
+ lines.push(`Version: ${result.version}`);
96
+ if (result.overwritten)
97
+ lines.push('Overwritten: yes');
98
+ return lines.join('\n');
99
+ }
100
+ export function nameOf(skill) {
101
+ return skill.namespace ? `${skill.namespace}/${skill.slug}` : skill.slug;
102
+ }
103
+ export function versionOf(skill) {
104
+ if (typeof skill.publishedVersion === 'string')
105
+ return skill.publishedVersion;
106
+ if (skill.publishedVersion?.version)
107
+ return skill.publishedVersion.version;
108
+ if (typeof skill.headlineVersion === 'string')
109
+ return skill.headlineVersion;
110
+ if (skill.headlineVersion?.version)
111
+ return skill.headlineVersion.version;
112
+ return skill.version;
113
+ }
114
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/format/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { AuthMe } from '../lib/types.js';
2
+ export declare function rolesOf(user: AuthMe): string[];
3
+ export declare function formatWhoami(user: AuthMe, baseUrl: string): string;
4
+ export declare function normalizeWhoami(user: AuthMe, baseUrl: string): Record<string, unknown>;
@@ -0,0 +1,23 @@
1
+ import { valueOrDash } from '../lib/human.js';
2
+ export function rolesOf(user) {
3
+ return user.platformRoles ?? user.roles ?? [];
4
+ }
5
+ export function formatWhoami(user, baseUrl) {
6
+ return [
7
+ `User: ${user.userId}`,
8
+ `Display name: ${valueOrDash(user.displayName)}`,
9
+ `Email: ${valueOrDash(user.email)}`,
10
+ `Roles: ${rolesOf(user).join(', ') || '-'}`,
11
+ `Base URL: ${baseUrl}`
12
+ ].join('\n');
13
+ }
14
+ export function normalizeWhoami(user, baseUrl) {
15
+ return {
16
+ userId: user.userId,
17
+ displayName: user.displayName,
18
+ ...(user.email ? { email: user.email } : {}),
19
+ roles: rolesOf(user),
20
+ baseUrl
21
+ };
22
+ }
23
+ //# sourceMappingURL=user.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.js","sourceRoot":"","sources":["../../src/format/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAG7C,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAA;AAC/C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,OAAe;IACxD,OAAO;QACL,SAAS,IAAI,CAAC,MAAM,EAAE;QACtB,iBAAiB,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;QAChD,UAAU,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;QACnC,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE;QAC3C,aAAa,OAAO,EAAE;KACvB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,OAAe;IAC3D,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC;QACpB,OAAO;KACR,CAAA;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};