@micar-tsp/skillhub 0.2.0 → 0.2.2
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 +11 -5
- package/dist/commands/publish.js +25 -19
- package/dist/commands/publish.js.map +1 -1
- package/dist/lib/api.d.ts +2 -1
- package/dist/lib/api.js +11 -4
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/publish-package.d.ts +8 -0
- package/dist/lib/publish-package.js +144 -0
- package/dist/lib/publish-package.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -8,16 +8,22 @@ Frontend page: `https://pre-skillhub.tsp.mioffice.cn`
|
|
|
8
8
|
|
|
9
9
|
Contact: `luozhilin@xiaomi.com`
|
|
10
10
|
|
|
11
|
-
##
|
|
11
|
+
## Release
|
|
12
|
+
|
|
13
|
+
Use these commands from the repository root unless noted otherwise:
|
|
12
14
|
|
|
13
15
|
```bash
|
|
14
|
-
pnpm install
|
|
15
|
-
pnpm build
|
|
16
16
|
pnpm test
|
|
17
|
-
pnpm
|
|
17
|
+
pnpm typecheck
|
|
18
|
+
pnpm build
|
|
19
|
+
npm publish --access public
|
|
18
20
|
```
|
|
19
21
|
|
|
20
|
-
|
|
22
|
+
Release notes:
|
|
23
|
+
|
|
24
|
+
- Update `skillhub-cli/package.json` version before publishing.
|
|
25
|
+
- Publish from the `skillhub-cli` package directory, not the repo root.
|
|
26
|
+
- The package must pass tests and typecheck before `npm publish`.
|
|
21
27
|
|
|
22
28
|
```bash
|
|
23
29
|
skillhub login --token sk_xxx
|
package/dist/commands/publish.js
CHANGED
|
@@ -1,40 +1,46 @@
|
|
|
1
1
|
import { createReadStream, existsSync } from 'node:fs';
|
|
2
|
-
import { basename } from 'node:path';
|
|
3
2
|
import { createContext } from '../lib/context.js';
|
|
4
3
|
import { CliError } from '../lib/errors.js';
|
|
4
|
+
import { preparePublishPackage } from '../lib/publish-package.js';
|
|
5
5
|
import { printResult } from '../format/output.js';
|
|
6
6
|
import { formatPublish } from '../format/publish.js';
|
|
7
7
|
import { assertRecommendedLabel } from './skills.js';
|
|
8
8
|
const VISIBILITIES = new Set(['PUBLIC', 'PRIVATE', 'NAMESPACE_ONLY']);
|
|
9
9
|
export function registerPublishCommand(program) {
|
|
10
10
|
program
|
|
11
|
-
.command('publish <namespace> <
|
|
12
|
-
.description('Publish a skill package')
|
|
11
|
+
.command('publish <namespace> <skillPath>')
|
|
12
|
+
.description('Publish a skill folder or .zip package')
|
|
13
13
|
.requiredOption('--visibility <visibility>', '(required) PUBLIC, PRIVATE, or NAMESPACE_ONLY')
|
|
14
14
|
.requiredOption('--display-name <name>', '(required) Skill display name')
|
|
15
15
|
.option('--summary <summary>', '(optional) Skill summary')
|
|
16
16
|
.option('--label <slug>', '(required, repeatable) Recommended label slug. At least one recommended label is required.', collect, [])
|
|
17
|
-
.action(async (namespace,
|
|
17
|
+
.action(async (namespace, skillPath, options) => {
|
|
18
18
|
const visibility = options.visibility.toUpperCase();
|
|
19
19
|
if (!VISIBILITIES.has(visibility))
|
|
20
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
21
|
if (options.label.length === 0)
|
|
24
22
|
throw new CliError('At least one recommended --label is required.\nUse "skillhub labels" to view available recommended labels.', { code: 'PUBLISH_RECOMMENDED_LABEL_REQUIRED' });
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
23
|
+
if (!existsSync(skillPath))
|
|
24
|
+
throw new CliError(`Skill path not found: ${skillPath}`);
|
|
25
|
+
const prepared = await preparePublishPackage(skillPath);
|
|
26
|
+
try {
|
|
27
|
+
const context = await createContext(program.opts());
|
|
28
|
+
await assertRecommendedLabel(context.client, options.label);
|
|
29
|
+
const form = new FormData();
|
|
30
|
+
const file = new Blob([await streamToArrayBuffer(createReadStream(prepared.archivePath))]);
|
|
31
|
+
form.set('file', file, prepared.fileName);
|
|
32
|
+
form.set('visibility', visibility);
|
|
33
|
+
if (options.summary)
|
|
34
|
+
form.set('summary', options.summary);
|
|
35
|
+
form.set('displayName', options.displayName);
|
|
36
|
+
for (const label of options.label)
|
|
37
|
+
form.append('labelSlugs', label);
|
|
38
|
+
const result = await context.client.uploadMultipart(`/skills/${encodeURIComponent(namespace)}/publish`, form);
|
|
39
|
+
printResult(context.json ? result : formatPublish(result), context.json);
|
|
40
|
+
}
|
|
41
|
+
finally {
|
|
42
|
+
await prepared.cleanup();
|
|
43
|
+
}
|
|
38
44
|
});
|
|
39
45
|
}
|
|
40
46
|
function collect(value, previous) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACtD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/api.d.ts
CHANGED
package/dist/lib/api.js
CHANGED
|
@@ -38,17 +38,21 @@ export class SkillHubApiClient {
|
|
|
38
38
|
await this.throwHttpError(response, method, request);
|
|
39
39
|
const envelope = (await response.json());
|
|
40
40
|
if (envelope.code !== 0) {
|
|
41
|
-
|
|
41
|
+
const backendMessage = extractBackendMessage(envelope);
|
|
42
|
+
throw new CliError(backendMessage || 'SkillHub request failed.', {
|
|
42
43
|
request: `${method} ${request}`,
|
|
43
44
|
status: response.status,
|
|
44
45
|
requestId: envelope.requestId,
|
|
45
|
-
backendMessage
|
|
46
|
+
backendMessage
|
|
46
47
|
});
|
|
47
48
|
}
|
|
48
49
|
return envelope.data;
|
|
49
50
|
}
|
|
50
51
|
headers(contentType) {
|
|
51
|
-
const headers = {
|
|
52
|
+
const headers = {
|
|
53
|
+
Accept: 'application/json',
|
|
54
|
+
'Accept-Language': 'zh'
|
|
55
|
+
};
|
|
52
56
|
if (contentType)
|
|
53
57
|
headers['Content-Type'] = contentType;
|
|
54
58
|
if (this.options.token)
|
|
@@ -76,7 +80,7 @@ export class SkillHubApiClient {
|
|
|
76
80
|
let requestId;
|
|
77
81
|
try {
|
|
78
82
|
const body = (await response.json());
|
|
79
|
-
backendMessage = body
|
|
83
|
+
backendMessage = extractBackendMessage(body);
|
|
80
84
|
requestId = body.requestId;
|
|
81
85
|
}
|
|
82
86
|
catch {
|
|
@@ -105,4 +109,7 @@ function parseContentDispositionFileName(value) {
|
|
|
105
109
|
const match = /filename="?([^";]+)"?/i.exec(value);
|
|
106
110
|
return match?.[1];
|
|
107
111
|
}
|
|
112
|
+
function extractBackendMessage(body) {
|
|
113
|
+
return body.msg ?? body.message;
|
|
114
|
+
}
|
|
108
115
|
//# sourceMappingURL=api.js.map
|
package/dist/lib/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface PreparedPublishPackage {
|
|
2
|
+
archivePath: string;
|
|
3
|
+
fileName: string;
|
|
4
|
+
cleanup: () => Promise<void>;
|
|
5
|
+
}
|
|
6
|
+
export declare function preparePublishPackage(packagePath: string): Promise<PreparedPublishPackage>;
|
|
7
|
+
export declare function parseSkillFrontmatter(content: string): Record<string, string> | null;
|
|
8
|
+
export declare function validateSkillFrontmatter(frontmatter: Record<string, string> | null): void;
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import AdmZip from 'adm-zip';
|
|
2
|
+
import { promises as fs } from 'node:fs';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { assertSafeEntries, listArchiveEntries } from './archive.js';
|
|
6
|
+
import { CliError } from './errors.js';
|
|
7
|
+
const REQUIRED_FRONTMATTER_FIELDS = ['name', 'description', 'version'];
|
|
8
|
+
export async function preparePublishPackage(packagePath) {
|
|
9
|
+
const resolvedPath = path.resolve(packagePath);
|
|
10
|
+
const stats = await stat(resolvedPath);
|
|
11
|
+
if (!stats)
|
|
12
|
+
throw new CliError(`Package file not found: ${packagePath}`);
|
|
13
|
+
const workspace = await fs.mkdtemp(path.join(os.tmpdir(), 'skillhub-publish-'));
|
|
14
|
+
let cleaned = false;
|
|
15
|
+
const cleanup = async () => {
|
|
16
|
+
if (cleaned)
|
|
17
|
+
return;
|
|
18
|
+
cleaned = true;
|
|
19
|
+
await fs.rm(workspace, { recursive: true, force: true });
|
|
20
|
+
};
|
|
21
|
+
try {
|
|
22
|
+
if (stats.isDirectory()) {
|
|
23
|
+
await validateDirectoryPackage(resolvedPath);
|
|
24
|
+
const archivePath = path.join(workspace, `${path.basename(resolvedPath)}.zip`);
|
|
25
|
+
await createZipFromDirectory(resolvedPath, archivePath);
|
|
26
|
+
return { archivePath, fileName: path.basename(archivePath), cleanup };
|
|
27
|
+
}
|
|
28
|
+
if (stats.isFile() && resolvedPath.toLowerCase().endsWith('.zip')) {
|
|
29
|
+
await validateZipPackage(resolvedPath, workspace);
|
|
30
|
+
return { archivePath: resolvedPath, fileName: path.basename(resolvedPath), cleanup };
|
|
31
|
+
}
|
|
32
|
+
throw new CliError(`Unsupported package input: ${packagePath}. Expected a directory or .zip file.`);
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
await cleanup();
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export function parseSkillFrontmatter(content) {
|
|
40
|
+
const normalized = content.replace(/^/, '');
|
|
41
|
+
const lines = normalized.split(/\r?\n/);
|
|
42
|
+
if (lines[0] !== '---')
|
|
43
|
+
return null;
|
|
44
|
+
const frontmatterLines = [];
|
|
45
|
+
let index = 1;
|
|
46
|
+
while (index < lines.length) {
|
|
47
|
+
const line = lines[index];
|
|
48
|
+
if (line === '---')
|
|
49
|
+
break;
|
|
50
|
+
frontmatterLines.push(line);
|
|
51
|
+
index += 1;
|
|
52
|
+
}
|
|
53
|
+
if (index >= lines.length)
|
|
54
|
+
return null;
|
|
55
|
+
const frontmatter = {};
|
|
56
|
+
for (const line of frontmatterLines) {
|
|
57
|
+
const separator = line.indexOf(':');
|
|
58
|
+
if (separator <= 0)
|
|
59
|
+
continue;
|
|
60
|
+
const key = line.slice(0, separator).trim();
|
|
61
|
+
const value = line.slice(separator + 1).trim().replace(/^['\"]|['\"]$/g, '');
|
|
62
|
+
if (key)
|
|
63
|
+
frontmatter[key] = value;
|
|
64
|
+
}
|
|
65
|
+
return frontmatter;
|
|
66
|
+
}
|
|
67
|
+
export function validateSkillFrontmatter(frontmatter) {
|
|
68
|
+
if (!frontmatter)
|
|
69
|
+
throw new CliError('SKILL.md must include frontmatter.');
|
|
70
|
+
for (const field of REQUIRED_FRONTMATTER_FIELDS) {
|
|
71
|
+
if (!frontmatter[field]?.trim()) {
|
|
72
|
+
throw new CliError(`SKILL.md frontmatter is missing required field: ${field}.`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async function validateDirectoryPackage(directoryPath) {
|
|
77
|
+
await validateSkillMarkdown(path.join(directoryPath, 'SKILL.md'));
|
|
78
|
+
}
|
|
79
|
+
async function validateZipPackage(archivePath, workspace) {
|
|
80
|
+
const entries = await listArchiveEntries(archivePath);
|
|
81
|
+
assertSafeEntries(entries);
|
|
82
|
+
const extractedDir = path.join(workspace, 'extracted');
|
|
83
|
+
await fs.mkdir(extractedDir, { recursive: true });
|
|
84
|
+
const zip = new AdmZip(archivePath);
|
|
85
|
+
zip.extractAllTo(extractedDir, true);
|
|
86
|
+
const packageRoot = await resolvePackageRoot(extractedDir);
|
|
87
|
+
await validateSkillMarkdown(path.join(packageRoot, 'SKILL.md'));
|
|
88
|
+
}
|
|
89
|
+
async function validateSkillMarkdown(skillMdPath) {
|
|
90
|
+
if (!(await exists(skillMdPath))) {
|
|
91
|
+
throw new CliError('Skill package must contain SKILL.md.');
|
|
92
|
+
}
|
|
93
|
+
const content = await fs.readFile(skillMdPath, 'utf8');
|
|
94
|
+
validateSkillFrontmatter(parseSkillFrontmatter(content));
|
|
95
|
+
}
|
|
96
|
+
async function resolvePackageRoot(extractedDir) {
|
|
97
|
+
const rootSkillPath = path.join(extractedDir, 'SKILL.md');
|
|
98
|
+
if (await exists(rootSkillPath))
|
|
99
|
+
return extractedDir;
|
|
100
|
+
const entries = await fs.readdir(extractedDir, { withFileTypes: true });
|
|
101
|
+
const visibleEntries = entries.filter((entry) => entry.name !== '__MACOSX');
|
|
102
|
+
if (visibleEntries.length === 1 && visibleEntries[0].isDirectory()) {
|
|
103
|
+
const nestedRoot = path.join(extractedDir, visibleEntries[0].name);
|
|
104
|
+
if (await exists(path.join(nestedRoot, 'SKILL.md')))
|
|
105
|
+
return nestedRoot;
|
|
106
|
+
}
|
|
107
|
+
throw new CliError('Invalid zip package structure. Expected SKILL.md at the package root.');
|
|
108
|
+
}
|
|
109
|
+
async function createZipFromDirectory(directoryPath, archivePath) {
|
|
110
|
+
const zip = new AdmZip();
|
|
111
|
+
await addDirectoryContents(zip, directoryPath, directoryPath);
|
|
112
|
+
zip.writeZip(archivePath);
|
|
113
|
+
}
|
|
114
|
+
async function addDirectoryContents(zip, baseDir, currentDir) {
|
|
115
|
+
const entries = await fs.readdir(currentDir, { withFileTypes: true });
|
|
116
|
+
for (const entry of entries) {
|
|
117
|
+
const fullPath = path.join(currentDir, entry.name);
|
|
118
|
+
const relativePath = path.relative(baseDir, fullPath).split(path.sep).join('/');
|
|
119
|
+
if (entry.isDirectory()) {
|
|
120
|
+
await addDirectoryContents(zip, baseDir, fullPath);
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
const content = await fs.readFile(fullPath);
|
|
124
|
+
zip.addFile(relativePath, content);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
async function exists(filePath) {
|
|
128
|
+
try {
|
|
129
|
+
await fs.access(filePath);
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
async function stat(filePath) {
|
|
137
|
+
try {
|
|
138
|
+
return await fs.stat(filePath);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=publish-package.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish-package.js","sourceRoot":"","sources":["../../src/lib/publish-package.ts"],"names":[],"mappings":"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"}
|