@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.
- package/README.md +34 -0
- package/dist/commands/config.d.ts +2 -0
- package/dist/commands/config.js +67 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/index.d.ts +4 -0
- package/dist/commands/index.js +5 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/publish.d.ts +2 -0
- package/dist/commands/publish.js +59 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/skills.d.ts +5 -0
- package/dist/commands/skills.js +127 -0
- package/dist/commands/skills.js.map +1 -0
- package/dist/commands/user.d.ts +2 -0
- package/dist/commands/user.js +15 -0
- package/dist/commands/user.js.map +1 -0
- package/dist/format/output.d.ts +2 -0
- package/dist/format/output.js +28 -0
- package/dist/format/output.js.map +1 -0
- package/dist/format/publish.d.ts +2 -0
- package/dist/format/publish.js +13 -0
- package/dist/format/publish.js.map +1 -0
- package/dist/format/skills.d.ts +21 -0
- package/dist/format/skills.js +114 -0
- package/dist/format/skills.js.map +1 -0
- package/dist/format/user.d.ts +4 -0
- package/dist/format/user.js +23 -0
- package/dist/format/user.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api.d.ts +29 -0
- package/dist/lib/api.js +108 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/archive.d.ts +8 -0
- package/dist/lib/archive.js +85 -0
- package/dist/lib/archive.js.map +1 -0
- package/dist/lib/config.d.ts +32 -0
- package/dist/lib/config.js +78 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/constants.d.ts +4 -0
- package/dist/lib/constants.js +5 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/context.d.ts +15 -0
- package/dist/lib/context.js +15 -0
- package/dist/lib/context.js.map +1 -0
- package/dist/lib/download.d.ts +8 -0
- package/dist/lib/download.js +27 -0
- package/dist/lib/download.js.map +1 -0
- package/dist/lib/errors.d.ts +12 -0
- package/dist/lib/errors.js +12 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/human.d.ts +2 -0
- package/dist/lib/human.js +20 -0
- package/dist/lib/human.js.map +1 -0
- package/dist/lib/page.d.ts +7 -0
- package/dist/lib/page.js +15 -0
- package/dist/lib/page.js.map +1 -0
- package/dist/lib/target.d.ts +8 -0
- package/dist/lib/target.js +30 -0
- package/dist/lib/target.js.map +1 -0
- package/dist/lib/token.d.ts +1 -0
- package/dist/lib/token.js +8 -0
- package/dist/lib/token.js.map +1 -0
- package/dist/lib/types.d.ts +62 -0
- package/dist/lib/types.js +2 -0
- package/dist/lib/types.js.map +1 -0
- 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,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 @@
|
|
|
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,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,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,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,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,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"}
|
package/dist/index.d.ts
ADDED