@nimblebrain/mpak 0.0.1 → 0.0.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/.claude/settings.local.json +3 -1
- package/CLAUDE.md +73 -34
- package/README.md +222 -57
- package/dist/commands/search.d.ts +12 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +144 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/skills/index.d.ts +8 -0
- package/dist/commands/skills/index.d.ts.map +1 -0
- package/dist/commands/skills/index.js +8 -0
- package/dist/commands/skills/index.js.map +1 -0
- package/dist/commands/skills/install.d.ts +9 -0
- package/dist/commands/skills/install.d.ts.map +1 -0
- package/dist/commands/skills/install.js +110 -0
- package/dist/commands/skills/install.js.map +1 -0
- package/dist/commands/skills/list.d.ts +8 -0
- package/dist/commands/skills/list.d.ts.map +1 -0
- package/dist/commands/skills/list.js +89 -0
- package/dist/commands/skills/list.js.map +1 -0
- package/dist/commands/skills/pack.d.ts +22 -0
- package/dist/commands/skills/pack.d.ts.map +1 -0
- package/dist/commands/skills/pack.js +116 -0
- package/dist/commands/skills/pack.js.map +1 -0
- package/dist/commands/skills/pull.d.ts +9 -0
- package/dist/commands/skills/pull.d.ts.map +1 -0
- package/dist/commands/skills/pull.js +68 -0
- package/dist/commands/skills/pull.js.map +1 -0
- package/dist/commands/skills/search.d.ts +14 -0
- package/dist/commands/skills/search.d.ts.map +1 -0
- package/dist/commands/skills/search.js +53 -0
- package/dist/commands/skills/search.js.map +1 -0
- package/dist/commands/skills/show.d.ts +8 -0
- package/dist/commands/skills/show.d.ts.map +1 -0
- package/dist/commands/skills/show.js +64 -0
- package/dist/commands/skills/show.js.map +1 -0
- package/dist/commands/skills/validate.d.ts +25 -0
- package/dist/commands/skills/validate.d.ts.map +1 -0
- package/dist/commands/skills/validate.js +191 -0
- package/dist/commands/skills/validate.js.map +1 -0
- package/dist/lib/api/skills-client.d.ts +30 -0
- package/dist/lib/api/skills-client.d.ts.map +1 -0
- package/dist/lib/api/skills-client.js +110 -0
- package/dist/lib/api/skills-client.js.map +1 -0
- package/dist/program.d.ts +5 -1
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +98 -33
- package/dist/program.js.map +1 -1
- package/dist/schemas/generated/api-responses.d.ts +541 -0
- package/dist/schemas/generated/api-responses.d.ts.map +1 -0
- package/dist/schemas/generated/api-responses.js +313 -0
- package/dist/schemas/generated/api-responses.js.map +1 -0
- package/dist/schemas/generated/auth.d.ts +18 -0
- package/dist/schemas/generated/auth.d.ts.map +1 -0
- package/dist/schemas/generated/auth.js +18 -0
- package/dist/schemas/generated/auth.js.map +1 -0
- package/dist/schemas/generated/index.d.ts +5 -0
- package/dist/schemas/generated/index.d.ts.map +1 -0
- package/dist/schemas/generated/index.js +6 -0
- package/dist/schemas/generated/index.js.map +1 -0
- package/dist/schemas/generated/package.d.ts +43 -0
- package/dist/schemas/generated/package.d.ts.map +1 -0
- package/dist/schemas/generated/package.js +20 -0
- package/dist/schemas/generated/package.js.map +1 -0
- package/dist/schemas/generated/skill.d.ts +381 -0
- package/dist/schemas/generated/skill.d.ts.map +1 -0
- package/dist/schemas/generated/skill.js +216 -0
- package/dist/schemas/generated/skill.js.map +1 -0
- package/dist/utils/config-manager.d.ts +13 -1
- package/dist/utils/config-manager.d.ts.map +1 -1
- package/dist/utils/config-manager.js +76 -11
- package/dist/utils/config-manager.js.map +1 -1
- package/package.json +6 -2
- package/src/commands/search.ts +191 -0
- package/src/commands/skills/index.ts +7 -0
- package/src/commands/skills/install.ts +129 -0
- package/src/commands/skills/list.ts +116 -0
- package/src/commands/skills/pack.test.ts +260 -0
- package/src/commands/skills/pack.ts +145 -0
- package/src/commands/skills/pull.ts +88 -0
- package/src/commands/skills/search.ts +73 -0
- package/src/commands/skills/show.ts +72 -0
- package/src/commands/skills/validate.test.ts +466 -0
- package/src/commands/skills/validate.ts +227 -0
- package/src/lib/api/skills-client.ts +148 -0
- package/src/program.test.ts +1 -3
- package/src/program.ts +125 -35
- package/src/schemas/config.v1.schema.json +37 -0
- package/src/schemas/generated/api-responses.ts +386 -0
- package/src/schemas/generated/auth.ts +21 -0
- package/src/schemas/generated/index.ts +5 -0
- package/src/schemas/generated/package.ts +29 -0
- package/src/schemas/generated/skill.ts +271 -0
- package/src/utils/config-manager.test.ts +182 -2
- package/src/utils/config-manager.ts +126 -12
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { writeFileSync } from 'fs';
|
|
2
|
+
import { basename, join } from 'path';
|
|
3
|
+
import { getSkillDownloadInfo, downloadSkillBundle } from '../../lib/api/skills-client.js';
|
|
4
|
+
/**
|
|
5
|
+
* Parse skill spec into name and version
|
|
6
|
+
* Examples: @scope/name, @scope/name@1.0.0
|
|
7
|
+
*/
|
|
8
|
+
function parseSkillSpec(spec) {
|
|
9
|
+
// Handle @scope/name@version format
|
|
10
|
+
const atIndex = spec.lastIndexOf('@');
|
|
11
|
+
// If @ is at position 0, it's just the scope prefix
|
|
12
|
+
if (atIndex <= 0) {
|
|
13
|
+
return { name: spec };
|
|
14
|
+
}
|
|
15
|
+
// Check if the @ is part of version (after the /)
|
|
16
|
+
const slashIndex = spec.indexOf('/');
|
|
17
|
+
if (atIndex > slashIndex) {
|
|
18
|
+
return {
|
|
19
|
+
name: spec.slice(0, atIndex),
|
|
20
|
+
version: spec.slice(atIndex + 1),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
return { name: spec };
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Handle the skill pull command
|
|
27
|
+
*/
|
|
28
|
+
export async function handleSkillPull(skillSpec, options) {
|
|
29
|
+
try {
|
|
30
|
+
const { name, version } = parseSkillSpec(skillSpec);
|
|
31
|
+
// Get download info
|
|
32
|
+
const downloadInfo = await getSkillDownloadInfo(name, version);
|
|
33
|
+
console.log(`Pulling ${downloadInfo.skill.name}@${downloadInfo.skill.version}...`);
|
|
34
|
+
// Download the bundle
|
|
35
|
+
const buffer = await downloadSkillBundle(downloadInfo.url, downloadInfo.skill.sha256);
|
|
36
|
+
// Determine output path
|
|
37
|
+
const filename = `${basename(downloadInfo.skill.name.replace('@', '').replace('/', '-'))}-${downloadInfo.skill.version}.skill`;
|
|
38
|
+
const outputPath = options.output || join(process.cwd(), filename);
|
|
39
|
+
// Write to disk
|
|
40
|
+
writeFileSync(outputPath, buffer);
|
|
41
|
+
if (options.json) {
|
|
42
|
+
console.log(JSON.stringify({
|
|
43
|
+
path: outputPath,
|
|
44
|
+
name: downloadInfo.skill.name,
|
|
45
|
+
version: downloadInfo.skill.version,
|
|
46
|
+
size: downloadInfo.skill.size,
|
|
47
|
+
sha256: downloadInfo.skill.sha256,
|
|
48
|
+
}, null, 2));
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
console.log(`Downloaded ${filename} (${formatSize(downloadInfo.skill.size)})`);
|
|
52
|
+
console.log(` SHA256: ${downloadInfo.skill.sha256}`);
|
|
53
|
+
console.log(` Path: ${outputPath}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
console.error(`Error: ${err instanceof Error ? err.message : err}`);
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function formatSize(bytes) {
|
|
62
|
+
if (bytes < 1024)
|
|
63
|
+
return `${bytes} B`;
|
|
64
|
+
if (bytes < 1024 * 1024)
|
|
65
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
66
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=pull.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pull.js","sourceRoot":"","sources":["../../../src/commands/skills/pull.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface SearchOptions {
|
|
2
|
+
tags?: string;
|
|
3
|
+
category?: string;
|
|
4
|
+
surface?: string;
|
|
5
|
+
sort?: string;
|
|
6
|
+
limit?: number;
|
|
7
|
+
offset?: number;
|
|
8
|
+
json?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Handle the skill search command
|
|
12
|
+
*/
|
|
13
|
+
export declare function handleSkillSearch(query: string, options: SearchOptions): Promise<void>;
|
|
14
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/commands/skills/search.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAyD5F"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { searchSkills } from '../../lib/api/skills-client.js';
|
|
2
|
+
/**
|
|
3
|
+
* Handle the skill search command
|
|
4
|
+
*/
|
|
5
|
+
export async function handleSkillSearch(query, options) {
|
|
6
|
+
try {
|
|
7
|
+
const result = await searchSkills({
|
|
8
|
+
q: query,
|
|
9
|
+
tags: options.tags,
|
|
10
|
+
category: options.category,
|
|
11
|
+
surface: options.surface,
|
|
12
|
+
sort: options.sort,
|
|
13
|
+
limit: options.limit,
|
|
14
|
+
offset: options.offset,
|
|
15
|
+
});
|
|
16
|
+
if (options.json) {
|
|
17
|
+
console.log(JSON.stringify(result, null, 2));
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (result.skills.length === 0) {
|
|
21
|
+
console.log(`No skills found for "${query}"`);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
// Table header
|
|
25
|
+
const nameWidth = 45;
|
|
26
|
+
const categoryWidth = 12;
|
|
27
|
+
const downloadsWidth = 10;
|
|
28
|
+
console.log('');
|
|
29
|
+
console.log('NAME'.padEnd(nameWidth) +
|
|
30
|
+
'CATEGORY'.padEnd(categoryWidth) +
|
|
31
|
+
'DOWNLOADS'.padStart(downloadsWidth));
|
|
32
|
+
// Table rows
|
|
33
|
+
for (const skill of result.skills) {
|
|
34
|
+
const name = skill.name.length > nameWidth - 2
|
|
35
|
+
? skill.name.slice(0, nameWidth - 5) + '...'
|
|
36
|
+
: skill.name;
|
|
37
|
+
const category = skill.category || '-';
|
|
38
|
+
const downloads = skill.downloads.toLocaleString();
|
|
39
|
+
console.log(name.padEnd(nameWidth) +
|
|
40
|
+
category.padEnd(categoryWidth) +
|
|
41
|
+
downloads.padStart(downloadsWidth));
|
|
42
|
+
}
|
|
43
|
+
if (result.pagination.has_more) {
|
|
44
|
+
console.log('');
|
|
45
|
+
console.log(`Showing ${result.skills.length} of ${result.total} results. Use --offset to see more.`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch (err) {
|
|
49
|
+
console.error(`Error: ${err instanceof Error ? err.message : err}`);
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/commands/skills/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAY9D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAAa,EAAE,OAAsB;IAC3E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;YAChC,CAAC,EAAE,KAAK;YACR,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,QAAQ,EAAE,OAAO,CAAC,QAAe;YACjC,OAAO,EAAE,OAAO,CAAC,OAAc;YAC/B,IAAI,EAAE,OAAO,CAAC,IAAW;YACzB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,GAAG,CAAC,CAAC;YAC9C,OAAO;QACT,CAAC;QAED,eAAe;QACf,MAAM,SAAS,GAAG,EAAE,CAAC;QACrB,MAAM,aAAa,GAAG,EAAE,CAAC;QACzB,MAAM,cAAc,GAAG,EAAE,CAAC;QAE1B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CACT,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;YACtB,UAAU,CAAC,MAAM,CAAC,aAAa,CAAC;YAChC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,CACvC,CAAC;QAEF,aAAa;QACb,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,SAAS,GAAG,CAAC;gBAC5C,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,GAAG,KAAK;gBAC5C,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;YACf,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,GAAG,CAAC;YACvC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC;YAEnD,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;gBACpB,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC;gBAC9B,SAAS,CAAC,QAAQ,CAAC,cAAc,CAAC,CACrC,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,MAAM,CAAC,MAAM,OAAO,MAAM,CAAC,KAAK,qCAAqC,CAAC,CAAC;QACvG,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"show.d.ts","sourceRoot":"","sources":["../../../src/commands/skills/show.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA8DvF"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { getSkillDetails } from '../../lib/api/skills-client.js';
|
|
2
|
+
/**
|
|
3
|
+
* Handle the skill show command
|
|
4
|
+
*/
|
|
5
|
+
export async function handleSkillShow(name, options) {
|
|
6
|
+
try {
|
|
7
|
+
const skill = await getSkillDetails(name);
|
|
8
|
+
if (options.json) {
|
|
9
|
+
console.log(JSON.stringify(skill, null, 2));
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
console.log('');
|
|
13
|
+
console.log(`${skill.name}@${skill.latest_version}`);
|
|
14
|
+
console.log('');
|
|
15
|
+
console.log(skill.description);
|
|
16
|
+
console.log('');
|
|
17
|
+
// Metadata section
|
|
18
|
+
console.log('Metadata:');
|
|
19
|
+
if (skill.license)
|
|
20
|
+
console.log(` License: ${skill.license}`);
|
|
21
|
+
if (skill.category)
|
|
22
|
+
console.log(` Category: ${skill.category}`);
|
|
23
|
+
if (skill.tags && skill.tags.length > 0)
|
|
24
|
+
console.log(` Tags: ${skill.tags.join(', ')}`);
|
|
25
|
+
if (skill.surfaces && skill.surfaces.length > 0)
|
|
26
|
+
console.log(` Surfaces: ${skill.surfaces.join(', ')}`);
|
|
27
|
+
if (skill.author)
|
|
28
|
+
console.log(` Author: ${skill.author.name}${skill.author.url ? ` (${skill.author.url})` : ''}`);
|
|
29
|
+
console.log(` Downloads: ${skill.downloads.toLocaleString()}`);
|
|
30
|
+
console.log(` Published: ${new Date(skill.published_at).toLocaleDateString()}`);
|
|
31
|
+
// Triggers
|
|
32
|
+
if (skill.triggers && skill.triggers.length > 0) {
|
|
33
|
+
console.log('');
|
|
34
|
+
console.log('Triggers:');
|
|
35
|
+
skill.triggers.forEach((t) => console.log(` - ${t}`));
|
|
36
|
+
}
|
|
37
|
+
// Examples
|
|
38
|
+
if (skill.examples && skill.examples.length > 0) {
|
|
39
|
+
console.log('');
|
|
40
|
+
console.log('Examples:');
|
|
41
|
+
skill.examples.forEach((ex) => {
|
|
42
|
+
console.log(` - "${ex.prompt}"${ex.context ? ` (${ex.context})` : ''}`);
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
// Versions
|
|
46
|
+
if (skill.versions && skill.versions.length > 0) {
|
|
47
|
+
console.log('');
|
|
48
|
+
console.log('Versions:');
|
|
49
|
+
skill.versions.slice(0, 5).forEach((v) => {
|
|
50
|
+
console.log(` ${v.version.padEnd(12)} ${new Date(v.published_at).toLocaleDateString().padEnd(12)} ${v.downloads.toLocaleString()} downloads`);
|
|
51
|
+
});
|
|
52
|
+
if (skill.versions.length > 5) {
|
|
53
|
+
console.log(` ... and ${skill.versions.length - 5} more`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
console.log('');
|
|
57
|
+
console.log(`Install: mpak skill install ${skill.name}`);
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
console.error(`Error: ${err instanceof Error ? err.message : err}`);
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=show.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"show.js","sourceRoot":"","sources":["../../../src/commands/skills/show.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { SkillFrontmatter } from '../../schemas/generated/skill.js';
|
|
2
|
+
export interface ValidationResult {
|
|
3
|
+
valid: boolean;
|
|
4
|
+
name: string | null;
|
|
5
|
+
path: string;
|
|
6
|
+
frontmatter: SkillFrontmatter | null;
|
|
7
|
+
errors: string[];
|
|
8
|
+
warnings: string[];
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Validate a skill directory against the Agent Skills spec
|
|
12
|
+
*/
|
|
13
|
+
export declare function validateSkillDirectory(skillPath: string): ValidationResult;
|
|
14
|
+
/**
|
|
15
|
+
* Format validation result for CLI output
|
|
16
|
+
*/
|
|
17
|
+
export declare function formatValidationResult(result: ValidationResult): string;
|
|
18
|
+
export interface ValidateOptions {
|
|
19
|
+
json?: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Handle the validate command
|
|
23
|
+
*/
|
|
24
|
+
export declare function handleSkillValidate(skillPath: string, options: ValidateOptions): Promise<void>;
|
|
25
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/commands/skills/validate.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEzE,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACrC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,CAiH1E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CA+DvE;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,CAef"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { existsSync, readFileSync, readdirSync, statSync } from 'fs';
|
|
2
|
+
import { join, basename } from 'path';
|
|
3
|
+
import matter from 'gray-matter';
|
|
4
|
+
import { SkillFrontmatterSchema } from '../../schemas/generated/skill.js';
|
|
5
|
+
/**
|
|
6
|
+
* Validate a skill directory against the Agent Skills spec
|
|
7
|
+
*/
|
|
8
|
+
export function validateSkillDirectory(skillPath) {
|
|
9
|
+
const result = {
|
|
10
|
+
valid: true,
|
|
11
|
+
name: null,
|
|
12
|
+
path: skillPath,
|
|
13
|
+
frontmatter: null,
|
|
14
|
+
errors: [],
|
|
15
|
+
warnings: [],
|
|
16
|
+
};
|
|
17
|
+
// Check directory exists
|
|
18
|
+
if (!existsSync(skillPath)) {
|
|
19
|
+
result.valid = false;
|
|
20
|
+
result.errors.push(`Directory not found: ${skillPath}`);
|
|
21
|
+
return result;
|
|
22
|
+
}
|
|
23
|
+
const stats = statSync(skillPath);
|
|
24
|
+
if (!stats.isDirectory()) {
|
|
25
|
+
result.valid = false;
|
|
26
|
+
result.errors.push(`Path is not a directory: ${skillPath}`);
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
29
|
+
// Check SKILL.md exists
|
|
30
|
+
const skillMdPath = join(skillPath, 'SKILL.md');
|
|
31
|
+
if (!existsSync(skillMdPath)) {
|
|
32
|
+
result.valid = false;
|
|
33
|
+
result.errors.push('SKILL.md not found');
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
// Read and parse SKILL.md
|
|
37
|
+
let content;
|
|
38
|
+
try {
|
|
39
|
+
content = readFileSync(skillMdPath, 'utf-8');
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
result.valid = false;
|
|
43
|
+
result.errors.push(`Failed to read SKILL.md: ${err}`);
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
// Parse frontmatter
|
|
47
|
+
let parsed;
|
|
48
|
+
try {
|
|
49
|
+
parsed = matter(content);
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
result.valid = false;
|
|
53
|
+
result.errors.push(`Failed to parse frontmatter: ${err}`);
|
|
54
|
+
return result;
|
|
55
|
+
}
|
|
56
|
+
if (!parsed.data || Object.keys(parsed.data).length === 0) {
|
|
57
|
+
result.valid = false;
|
|
58
|
+
result.errors.push('No frontmatter found in SKILL.md');
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
// Validate against schema
|
|
62
|
+
const validation = SkillFrontmatterSchema.safeParse(parsed.data);
|
|
63
|
+
if (!validation.success) {
|
|
64
|
+
result.valid = false;
|
|
65
|
+
for (const issue of validation.error.issues) {
|
|
66
|
+
const path = issue.path.join('.');
|
|
67
|
+
result.errors.push(`${path}: ${issue.message}`);
|
|
68
|
+
}
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
71
|
+
result.frontmatter = validation.data;
|
|
72
|
+
result.name = validation.data.name;
|
|
73
|
+
// Validate name matches directory name
|
|
74
|
+
const dirName = basename(skillPath);
|
|
75
|
+
if (validation.data.name !== dirName) {
|
|
76
|
+
result.valid = false;
|
|
77
|
+
result.errors.push(`Skill name "${validation.data.name}" does not match directory name "${dirName}"`);
|
|
78
|
+
}
|
|
79
|
+
// Check for optional directories and files
|
|
80
|
+
const contents = readdirSync(skillPath);
|
|
81
|
+
// Standard optional directories
|
|
82
|
+
const optionalDirs = ['scripts', 'references', 'assets'];
|
|
83
|
+
for (const dir of optionalDirs) {
|
|
84
|
+
if (contents.includes(dir)) {
|
|
85
|
+
const dirPath = join(skillPath, dir);
|
|
86
|
+
if (!statSync(dirPath).isDirectory()) {
|
|
87
|
+
result.warnings.push(`"${dir}" exists but is not a directory`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Check for discovery metadata (not required, but recommended)
|
|
92
|
+
if (!validation.data.metadata) {
|
|
93
|
+
result.warnings.push('No metadata field - consider adding for better discovery');
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
const meta = validation.data.metadata;
|
|
97
|
+
if (!meta.tags || meta.tags.length === 0) {
|
|
98
|
+
result.warnings.push('No tags in metadata - consider adding for better discovery');
|
|
99
|
+
}
|
|
100
|
+
if (!meta.category) {
|
|
101
|
+
result.warnings.push('No category in metadata - consider adding for better discovery');
|
|
102
|
+
}
|
|
103
|
+
if (!meta.version) {
|
|
104
|
+
result.warnings.push('No version in metadata - required for registry publishing');
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return result;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Format validation result for CLI output
|
|
111
|
+
*/
|
|
112
|
+
export function formatValidationResult(result) {
|
|
113
|
+
const lines = [];
|
|
114
|
+
if (result.valid) {
|
|
115
|
+
lines.push(`\u2713 Valid: ${result.name || result.path}`);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
lines.push(`\u2717 Invalid: ${result.name || result.path}`);
|
|
119
|
+
}
|
|
120
|
+
lines.push('');
|
|
121
|
+
if (result.frontmatter) {
|
|
122
|
+
lines.push('\u2713 SKILL.md found');
|
|
123
|
+
lines.push('\u2713 Required fields');
|
|
124
|
+
lines.push(` \u251c\u2500 name: ${result.frontmatter.name}`);
|
|
125
|
+
lines.push(` \u2514\u2500 description: ${result.frontmatter.description.slice(0, 60)}${result.frontmatter.description.length > 60 ? '...' : ''} (${result.frontmatter.description.length} chars)`);
|
|
126
|
+
// Optional fields
|
|
127
|
+
const optionalFields = [];
|
|
128
|
+
if (result.frontmatter.license)
|
|
129
|
+
optionalFields.push(`license: ${result.frontmatter.license}`);
|
|
130
|
+
if (result.frontmatter.compatibility)
|
|
131
|
+
optionalFields.push(`compatibility: ${result.frontmatter.compatibility}`);
|
|
132
|
+
if (result.frontmatter['allowed-tools'])
|
|
133
|
+
optionalFields.push(`allowed-tools: ${result.frontmatter['allowed-tools']}`);
|
|
134
|
+
if (optionalFields.length > 0) {
|
|
135
|
+
lines.push('');
|
|
136
|
+
lines.push('\u2713 Optional fields');
|
|
137
|
+
optionalFields.forEach((field, i) => {
|
|
138
|
+
const prefix = i === optionalFields.length - 1 ? '\u2514\u2500' : '\u251c\u2500';
|
|
139
|
+
lines.push(` ${prefix} ${field}`);
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
// Discovery metadata
|
|
143
|
+
if (result.frontmatter.metadata) {
|
|
144
|
+
const meta = result.frontmatter.metadata;
|
|
145
|
+
lines.push('');
|
|
146
|
+
lines.push('\u2713 Discovery metadata (metadata:)');
|
|
147
|
+
if (meta.tags)
|
|
148
|
+
lines.push(` \u251c\u2500 tags: [${meta.tags.join(', ')}]`);
|
|
149
|
+
if (meta.category)
|
|
150
|
+
lines.push(` \u251c\u2500 category: ${meta.category}`);
|
|
151
|
+
if (meta.triggers)
|
|
152
|
+
lines.push(` \u251c\u2500 triggers: ${meta.triggers.length} defined`);
|
|
153
|
+
if (meta.version)
|
|
154
|
+
lines.push(` \u251c\u2500 version: ${meta.version}`);
|
|
155
|
+
if (meta.surfaces)
|
|
156
|
+
lines.push(` \u251c\u2500 surfaces: [${meta.surfaces.join(', ')}]`);
|
|
157
|
+
if (meta.author)
|
|
158
|
+
lines.push(` \u2514\u2500 author: ${meta.author.name}`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (result.errors.length > 0) {
|
|
162
|
+
lines.push('');
|
|
163
|
+
lines.push('Errors:');
|
|
164
|
+
result.errors.forEach((err) => lines.push(` \u2717 ${err}`));
|
|
165
|
+
}
|
|
166
|
+
if (result.warnings.length > 0) {
|
|
167
|
+
lines.push('');
|
|
168
|
+
lines.push('Warnings:');
|
|
169
|
+
result.warnings.forEach((warn) => lines.push(` \u26a0 ${warn}`));
|
|
170
|
+
}
|
|
171
|
+
return lines.join('\n');
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Handle the validate command
|
|
175
|
+
*/
|
|
176
|
+
export async function handleSkillValidate(skillPath, options) {
|
|
177
|
+
const result = validateSkillDirectory(skillPath);
|
|
178
|
+
if (options.json) {
|
|
179
|
+
console.log(JSON.stringify(result, null, 2));
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
console.log('');
|
|
183
|
+
console.log(`Validating ${skillPath}...`);
|
|
184
|
+
console.log('');
|
|
185
|
+
console.log(formatValidationResult(result));
|
|
186
|
+
}
|
|
187
|
+
if (!result.valid) {
|
|
188
|
+
process.exit(1);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/commands/skills/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skills API client for mpak registry
|
|
3
|
+
*/
|
|
4
|
+
import type { SkillSearchResponse, SkillDetail, SkillDownloadInfo } from '../../schemas/generated/skill.js';
|
|
5
|
+
export interface SkillSearchOptions {
|
|
6
|
+
q?: string;
|
|
7
|
+
tags?: string;
|
|
8
|
+
category?: string;
|
|
9
|
+
surface?: string;
|
|
10
|
+
sort?: 'downloads' | 'recent' | 'name';
|
|
11
|
+
limit?: number;
|
|
12
|
+
offset?: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Search for skills in the registry
|
|
16
|
+
*/
|
|
17
|
+
export declare function searchSkills(options: SkillSearchOptions): Promise<SkillSearchResponse>;
|
|
18
|
+
/**
|
|
19
|
+
* Get skill details from the registry
|
|
20
|
+
*/
|
|
21
|
+
export declare function getSkillDetails(name: string): Promise<SkillDetail>;
|
|
22
|
+
/**
|
|
23
|
+
* Get download info for a skill
|
|
24
|
+
*/
|
|
25
|
+
export declare function getSkillDownloadInfo(name: string, version?: string): Promise<SkillDownloadInfo>;
|
|
26
|
+
/**
|
|
27
|
+
* Download a skill bundle
|
|
28
|
+
*/
|
|
29
|
+
export declare function downloadSkillBundle(downloadUrl: string, expectedSha256?: string): Promise<Buffer>;
|
|
30
|
+
//# sourceMappingURL=skills-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills-client.d.ts","sourceRoot":"","sources":["../../../src/lib/api/skills-client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,mBAAmB,EACnB,WAAW,EACX,iBAAiB,EAClB,MAAM,kCAAkC,CAAC;AAqB1C,MAAM,WAAW,kBAAkB;IACjC,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAwB5F;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAoBxE;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,iBAAiB,CAAC,CAqB5B;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,MAAM,CAAC,CAmBjB"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skills API client for mpak registry
|
|
3
|
+
*/
|
|
4
|
+
const DEFAULT_REGISTRY_URL = 'https://api.mpak.dev';
|
|
5
|
+
function getRegistryUrl() {
|
|
6
|
+
return process.env.MPAK_REGISTRY_URL || DEFAULT_REGISTRY_URL;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Parse a scoped name into scope and name parts
|
|
10
|
+
* Handles both @scope/name and scope/name formats
|
|
11
|
+
*/
|
|
12
|
+
function parseScopedName(name) {
|
|
13
|
+
const normalizedName = name.startsWith('@') ? name.slice(1) : name;
|
|
14
|
+
const [scope, skillName] = normalizedName.split('/');
|
|
15
|
+
if (!scope || !skillName) {
|
|
16
|
+
throw new Error(`Invalid skill name format: ${name}. Expected @scope/name or scope/name`);
|
|
17
|
+
}
|
|
18
|
+
return { scope, skillName };
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Search for skills in the registry
|
|
22
|
+
*/
|
|
23
|
+
export async function searchSkills(options) {
|
|
24
|
+
const baseUrl = getRegistryUrl();
|
|
25
|
+
const params = new URLSearchParams();
|
|
26
|
+
if (options.q)
|
|
27
|
+
params.set('q', options.q);
|
|
28
|
+
if (options.tags)
|
|
29
|
+
params.set('tags', options.tags);
|
|
30
|
+
if (options.category)
|
|
31
|
+
params.set('category', options.category);
|
|
32
|
+
if (options.surface)
|
|
33
|
+
params.set('surface', options.surface);
|
|
34
|
+
if (options.sort)
|
|
35
|
+
params.set('sort', options.sort);
|
|
36
|
+
if (options.limit)
|
|
37
|
+
params.set('limit', options.limit.toString());
|
|
38
|
+
if (options.offset)
|
|
39
|
+
params.set('offset', options.offset.toString());
|
|
40
|
+
const url = `${baseUrl}/v1/skills/search?${params.toString()}`;
|
|
41
|
+
const response = await fetch(url, {
|
|
42
|
+
headers: { Accept: 'application/json' },
|
|
43
|
+
});
|
|
44
|
+
if (!response.ok) {
|
|
45
|
+
const text = await response.text();
|
|
46
|
+
throw new Error(`Search failed (${response.status}): ${text}`);
|
|
47
|
+
}
|
|
48
|
+
return response.json();
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Get skill details from the registry
|
|
52
|
+
*/
|
|
53
|
+
export async function getSkillDetails(name) {
|
|
54
|
+
const baseUrl = getRegistryUrl();
|
|
55
|
+
const { scope, skillName } = parseScopedName(name);
|
|
56
|
+
// Server expects: /v1/skills/@scope/name
|
|
57
|
+
const url = `${baseUrl}/v1/skills/@${scope}/${skillName}`;
|
|
58
|
+
const response = await fetch(url, {
|
|
59
|
+
headers: { Accept: 'application/json' },
|
|
60
|
+
});
|
|
61
|
+
if (!response.ok) {
|
|
62
|
+
if (response.status === 404) {
|
|
63
|
+
throw new Error(`Skill not found: ${name}`);
|
|
64
|
+
}
|
|
65
|
+
const text = await response.text();
|
|
66
|
+
throw new Error(`Failed to get skill details (${response.status}): ${text}`);
|
|
67
|
+
}
|
|
68
|
+
return response.json();
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get download info for a skill
|
|
72
|
+
*/
|
|
73
|
+
export async function getSkillDownloadInfo(name, version) {
|
|
74
|
+
const baseUrl = getRegistryUrl();
|
|
75
|
+
const { scope, skillName } = parseScopedName(name);
|
|
76
|
+
// Server expects: /v1/skills/@scope/name/download or /v1/skills/@scope/name/versions/x.y.z/download
|
|
77
|
+
const versionPath = version ? `/versions/${version}` : '';
|
|
78
|
+
const url = `${baseUrl}/v1/skills/@${scope}/${skillName}${versionPath}/download`;
|
|
79
|
+
const response = await fetch(url, {
|
|
80
|
+
headers: { Accept: 'application/json' },
|
|
81
|
+
});
|
|
82
|
+
if (!response.ok) {
|
|
83
|
+
if (response.status === 404) {
|
|
84
|
+
throw new Error(`Skill not found: ${name}${version ? `@${version}` : ''}`);
|
|
85
|
+
}
|
|
86
|
+
const text = await response.text();
|
|
87
|
+
throw new Error(`Failed to get download info (${response.status}): ${text}`);
|
|
88
|
+
}
|
|
89
|
+
return response.json();
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Download a skill bundle
|
|
93
|
+
*/
|
|
94
|
+
export async function downloadSkillBundle(downloadUrl, expectedSha256) {
|
|
95
|
+
const response = await fetch(downloadUrl);
|
|
96
|
+
if (!response.ok) {
|
|
97
|
+
throw new Error(`Download failed (${response.status})`);
|
|
98
|
+
}
|
|
99
|
+
const buffer = Buffer.from(await response.arrayBuffer());
|
|
100
|
+
// Verify SHA256 if provided
|
|
101
|
+
if (expectedSha256) {
|
|
102
|
+
const { createHash } = await import('crypto');
|
|
103
|
+
const hash = createHash('sha256').update(buffer).digest('hex');
|
|
104
|
+
if (hash !== expectedSha256) {
|
|
105
|
+
throw new Error(`SHA256 mismatch: expected ${expectedSha256}, got ${hash}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return buffer;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=skills-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills-client.js","sourceRoot":"","sources":["../../../src/lib/api/skills-client.ts"],"names":[],"mappings":"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"}
|
package/dist/program.d.ts
CHANGED
|
@@ -2,7 +2,11 @@ import { Command } from 'commander';
|
|
|
2
2
|
/**
|
|
3
3
|
* Creates and configures the CLI program
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* Command structure:
|
|
6
|
+
* - mpak search <query> - Unified search (bundles + skills)
|
|
7
|
+
* - mpak bundle <command> - MCP bundle commands
|
|
8
|
+
* - mpak skill <command> - Agent skill commands
|
|
9
|
+
* - mpak config <command> - Configuration commands
|
|
6
10
|
*/
|
|
7
11
|
export declare function createProgram(): Command;
|
|
8
12
|
//# sourceMappingURL=program.d.ts.map
|
package/dist/program.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBpC;;;;;;;;GAQG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAmLvC"}
|