@skills-hub-ai/skill-parser 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +61 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -2
- package/dist/index.js.map +1 -1
- package/package.json +14 -11
package/README.md
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# @skills-hub-ai/skill-parser
|
|
2
|
+
|
|
3
|
+
Parser for SKILL.md files — extracts YAML frontmatter and instructions from the skills-hub skill format.
|
|
4
|
+
|
|
5
|
+
This is an internal library used by `@skills-hub-ai/cli`, `@skills-hub-ai/mcp`, and the skills-hub API.
|
|
6
|
+
|
|
7
|
+
## Usage
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
import { parseSkillMd } from "@skills-hub-ai/skill-parser";
|
|
11
|
+
|
|
12
|
+
const result = parseSkillMd(`---
|
|
13
|
+
name: My Skill
|
|
14
|
+
description: Does something useful
|
|
15
|
+
version: 1.0.0
|
|
16
|
+
category: code-quality
|
|
17
|
+
platforms:
|
|
18
|
+
- claude-code
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
Your skill instructions here.
|
|
22
|
+
`);
|
|
23
|
+
|
|
24
|
+
if (result.success) {
|
|
25
|
+
console.log(result.skill.name); // "My Skill"
|
|
26
|
+
console.log(result.skill.instructions); // "Your skill instructions here."
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Exports
|
|
31
|
+
|
|
32
|
+
### `parseSkillMd(content: string): ParseResult`
|
|
33
|
+
|
|
34
|
+
Parses a SKILL.md file. Returns `{ success, skill?, errors[] }`.
|
|
35
|
+
|
|
36
|
+
**Required fields:** name, description, version
|
|
37
|
+
**Optional fields:** category (validated against known slugs), platforms (normalized to uppercase)
|
|
38
|
+
|
|
39
|
+
### `validateSemver(version: string): boolean`
|
|
40
|
+
|
|
41
|
+
Validates that a string matches `X.Y.Z` semver format.
|
|
42
|
+
|
|
43
|
+
### `compareSemver(a: string, b: string): number`
|
|
44
|
+
|
|
45
|
+
Compares two semver strings. Returns -1, 0, or 1.
|
|
46
|
+
|
|
47
|
+
### OpenFang support
|
|
48
|
+
|
|
49
|
+
```ts
|
|
50
|
+
import { translateToHand, serializeHandToml } from "@skills-hub-ai/skill-parser/openfang";
|
|
51
|
+
|
|
52
|
+
const hand = translateToHand(skill);
|
|
53
|
+
const toml = serializeHandToml(hand);
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Converts SKILL.md format to OpenFang HAND.toml for agent execution.
|
|
57
|
+
|
|
58
|
+
## Links
|
|
59
|
+
|
|
60
|
+
- [GitHub](https://github.com/tinh2/skills-hub)
|
|
61
|
+
- [skills-hub.ai](https://skills-hub.ai)
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAyBA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,UAAU,EAAE,CAAC;CACtB;AAID,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CA0FzD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAS1D"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { parse as parseYaml } from "yaml";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
-
import { CATEGORY_SLUGS, PLATFORMS } from "@skills-hub-ai/shared";
|
|
3
|
+
import { CATEGORY_SLUGS, PLATFORMS, SKILL_PERMISSIONS } from "@skills-hub-ai/shared";
|
|
4
4
|
const frontmatterSchema = z.object({
|
|
5
5
|
name: z.string().min(1),
|
|
6
6
|
description: z.string().min(1),
|
|
@@ -16,6 +16,10 @@ const frontmatterSchema = z.object({
|
|
|
16
16
|
.array(z.string())
|
|
17
17
|
.optional()
|
|
18
18
|
.default([]),
|
|
19
|
+
permissions: z
|
|
20
|
+
.array(z.string())
|
|
21
|
+
.optional()
|
|
22
|
+
.default([]),
|
|
19
23
|
});
|
|
20
24
|
const FRONTMATTER_REGEX = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/;
|
|
21
25
|
export function parseSkillMd(content) {
|
|
@@ -55,7 +59,7 @@ export function parseSkillMd(content) {
|
|
|
55
59
|
}
|
|
56
60
|
return { success: false, errors };
|
|
57
61
|
}
|
|
58
|
-
const { name, description, version, category, platforms } = result.data;
|
|
62
|
+
const { name, description, version, category, platforms, permissions } = result.data;
|
|
59
63
|
const instructions = parsed.instructions || instructionBlock.trim();
|
|
60
64
|
if (!instructions) {
|
|
61
65
|
errors.push({ field: "instructions", message: "No instructions found in frontmatter or body" });
|
|
@@ -73,6 +77,12 @@ export function parseSkillMd(content) {
|
|
|
73
77
|
errors.push({ field: "platforms", message: `Unknown platform "${p}". Valid: ${PLATFORMS.join(", ")}` });
|
|
74
78
|
}
|
|
75
79
|
}
|
|
80
|
+
const normalizedPermissions = permissions.map((p) => p.toLowerCase());
|
|
81
|
+
for (const p of normalizedPermissions) {
|
|
82
|
+
if (!SKILL_PERMISSIONS.includes(p)) {
|
|
83
|
+
errors.push({ field: "permissions", message: `Unknown permission "${p}". Valid: ${SKILL_PERMISSIONS.join(", ")}` });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
76
86
|
if (errors.length > 0) {
|
|
77
87
|
return { success: false, errors };
|
|
78
88
|
}
|
|
@@ -84,6 +94,7 @@ export function parseSkillMd(content) {
|
|
|
84
94
|
version,
|
|
85
95
|
category,
|
|
86
96
|
platforms: normalizedPlatforms,
|
|
97
|
+
permissions: normalizedPermissions,
|
|
87
98
|
instructions,
|
|
88
99
|
raw: content,
|
|
89
100
|
},
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@skills-hub-ai/skill-parser",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"files": [
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"files": [
|
|
5
|
+
"dist",
|
|
6
|
+
"README.md"
|
|
7
|
+
],
|
|
5
8
|
"type": "module",
|
|
6
9
|
"main": "dist/index.js",
|
|
7
10
|
"types": "dist/index.d.ts",
|
|
@@ -15,19 +18,19 @@
|
|
|
15
18
|
"import": "./dist/openfang.js"
|
|
16
19
|
}
|
|
17
20
|
},
|
|
18
|
-
"scripts": {
|
|
19
|
-
"build": "tsc",
|
|
20
|
-
"dev": "tsc --watch",
|
|
21
|
-
"test": "vitest run",
|
|
22
|
-
"lint": "tsc --noEmit"
|
|
23
|
-
},
|
|
24
21
|
"dependencies": {
|
|
25
|
-
"@skills-hub-ai/shared": "workspace:*",
|
|
26
22
|
"yaml": "^2.6.0",
|
|
27
|
-
"zod": "^3.23.0"
|
|
23
|
+
"zod": "^3.23.0",
|
|
24
|
+
"@skills-hub-ai/shared": "0.2.0"
|
|
28
25
|
},
|
|
29
26
|
"devDependencies": {
|
|
30
27
|
"typescript": "^5.7.0",
|
|
31
28
|
"vitest": "^2.0.0"
|
|
29
|
+
},
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "tsc",
|
|
32
|
+
"dev": "tsc --watch",
|
|
33
|
+
"test": "vitest run",
|
|
34
|
+
"lint": "tsc --noEmit"
|
|
32
35
|
}
|
|
33
|
-
}
|
|
36
|
+
}
|