@vibe-agent-toolkit/agent-skills 0.1.13 → 0.1.15-rc.1

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 (74) hide show
  1. package/README.md +28 -28
  2. package/dist/builder.d.ts +3 -3
  3. package/dist/builder.d.ts.map +1 -1
  4. package/dist/builder.js +3 -3
  5. package/dist/builder.js.map +1 -1
  6. package/dist/import.d.ts +1 -1
  7. package/dist/import.js +7 -7
  8. package/dist/import.js.map +1 -1
  9. package/dist/index.d.ts +4 -4
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +4 -4
  12. package/dist/index.js.map +1 -1
  13. package/dist/schemas/agent-skill-frontmatter.d.ts +140 -0
  14. package/dist/schemas/agent-skill-frontmatter.d.ts.map +1 -0
  15. package/dist/schemas/agent-skill-frontmatter.js +95 -0
  16. package/dist/schemas/agent-skill-frontmatter.js.map +1 -0
  17. package/dist/schemas/claude-plugin.d.ts +60 -109
  18. package/dist/schemas/claude-plugin.d.ts.map +1 -1
  19. package/dist/schemas/claude-plugin.js +26 -34
  20. package/dist/schemas/claude-plugin.js.map +1 -1
  21. package/dist/schemas/index.d.ts +1 -1
  22. package/dist/schemas/index.d.ts.map +1 -1
  23. package/dist/schemas/index.js +1 -1
  24. package/dist/schemas/index.js.map +1 -1
  25. package/dist/schemas/marketplace.d.ts +1224 -202
  26. package/dist/schemas/marketplace.d.ts.map +1 -1
  27. package/dist/schemas/marketplace.js +51 -13
  28. package/dist/schemas/marketplace.js.map +1 -1
  29. package/dist/skill-packager.d.ts +42 -0
  30. package/dist/skill-packager.d.ts.map +1 -1
  31. package/dist/skill-packager.js +269 -238
  32. package/dist/skill-packager.js.map +1 -1
  33. package/dist/validators/format-detection.js +7 -7
  34. package/dist/validators/format-detection.js.map +1 -1
  35. package/dist/validators/frontmatter-validation.d.ts +30 -0
  36. package/dist/validators/frontmatter-validation.d.ts.map +1 -0
  37. package/dist/validators/frontmatter-validation.js +132 -0
  38. package/dist/validators/frontmatter-validation.js.map +1 -0
  39. package/dist/validators/marketplace-validator.d.ts +1 -0
  40. package/dist/validators/marketplace-validator.d.ts.map +1 -1
  41. package/dist/validators/marketplace-validator.js +1 -0
  42. package/dist/validators/marketplace-validator.js.map +1 -1
  43. package/dist/validators/packaging-validator.d.ts +1 -1
  44. package/dist/validators/packaging-validator.d.ts.map +1 -1
  45. package/dist/validators/packaging-validator.js +53 -11
  46. package/dist/validators/packaging-validator.js.map +1 -1
  47. package/dist/validators/plugin-validator.d.ts +2 -1
  48. package/dist/validators/plugin-validator.d.ts.map +1 -1
  49. package/dist/validators/plugin-validator.js +2 -1
  50. package/dist/validators/plugin-validator.js.map +1 -1
  51. package/dist/validators/skill-validator.d.ts +2 -1
  52. package/dist/validators/skill-validator.d.ts.map +1 -1
  53. package/dist/validators/skill-validator.js +7 -108
  54. package/dist/validators/skill-validator.js.map +1 -1
  55. package/dist/validators/types.d.ts +2 -2
  56. package/dist/validators/types.d.ts.map +1 -1
  57. package/dist/validators/validation-rules.d.ts +1 -1
  58. package/dist/validators/validation-rules.js +5 -5
  59. package/dist/validators/validation-rules.js.map +1 -1
  60. package/dist/walk-link-graph.d.ts +88 -0
  61. package/dist/walk-link-graph.d.ts.map +1 -0
  62. package/dist/walk-link-graph.js +190 -0
  63. package/dist/walk-link-graph.js.map +1 -0
  64. package/package.json +5 -4
  65. package/schemas/skill-frontmatter.json +32 -7
  66. package/schemas/vat-skill-frontmatter.json +32 -3
  67. package/dist/link-collector.d.ts +0 -86
  68. package/dist/link-collector.d.ts.map +0 -1
  69. package/dist/link-collector.js +0 -206
  70. package/dist/link-collector.js.map +0 -1
  71. package/dist/schemas/claude-skill-frontmatter.d.ts +0 -75
  72. package/dist/schemas/claude-skill-frontmatter.d.ts.map +0 -1
  73. package/dist/schemas/claude-skill-frontmatter.js +0 -48
  74. package/dist/schemas/claude-skill-frontmatter.js.map +0 -1
@@ -9,7 +9,7 @@
9
9
  "minLength": 1,
10
10
  "maxLength": 64,
11
11
  "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$",
12
- "description": "Skill identifier, must match parent directory name"
12
+ "description": "Skill identifier defaults to parent directory name if omitted"
13
13
  },
14
14
  "description": {
15
15
  "type": "string",
@@ -35,14 +35,39 @@
35
35
  },
36
36
  "allowed-tools": {
37
37
  "type": "string",
38
- "description": "Pre-approved tools (experimental)"
38
+ "description": "Space-separated list of pre-approved tools"
39
+ },
40
+ "argument-hint": {
41
+ "type": "string",
42
+ "description": "Hint text shown to the user when invoking the skill"
43
+ },
44
+ "disable-model-invocation": {
45
+ "type": "boolean",
46
+ "description": "Whether the model can invoke this skill automatically (default: false)"
47
+ },
48
+ "user-invocable": {
49
+ "type": "boolean",
50
+ "description": "Whether the user can invoke this skill via slash command (default: true)"
51
+ },
52
+ "model": {
53
+ "type": "string",
54
+ "description": "Model to use when running this skill (e.g., \"sonnet\", \"opus\")"
55
+ },
56
+ "context": {
57
+ "type": "string",
58
+ "description": "Execution context (e.g., \"fork\" for isolated context)"
59
+ },
60
+ "agent": {
61
+ "type": "string",
62
+ "description": "Agent identity for multi-agent workflows"
63
+ },
64
+ "hooks": {
65
+ "type": "object",
66
+ "additionalProperties": {},
67
+ "description": "Lifecycle hooks (e.g., PostToolUse)"
39
68
  }
40
69
  },
41
- "required": [
42
- "name",
43
- "description"
44
- ],
45
- "additionalProperties": false
70
+ "additionalProperties": true
46
71
  }
47
72
  },
48
73
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -9,7 +9,7 @@
9
9
  "minLength": 1,
10
10
  "maxLength": 64,
11
11
  "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$",
12
- "description": "Skill identifier, must match parent directory name"
12
+ "description": "Skill identifier (required for VAT skills)"
13
13
  },
14
14
  "description": {
15
15
  "type": "string",
@@ -41,7 +41,36 @@
41
41
  },
42
42
  "allowed-tools": {
43
43
  "type": "string",
44
- "description": "Pre-approved tools (experimental)"
44
+ "description": "Space-separated list of pre-approved tools"
45
+ },
46
+ "argument-hint": {
47
+ "type": "string",
48
+ "description": "Hint text shown to the user when invoking the skill"
49
+ },
50
+ "disable-model-invocation": {
51
+ "type": "boolean",
52
+ "description": "Whether the model can invoke this skill automatically (default: false)"
53
+ },
54
+ "user-invocable": {
55
+ "type": "boolean",
56
+ "description": "Whether the user can invoke this skill via slash command (default: true)"
57
+ },
58
+ "model": {
59
+ "type": "string",
60
+ "description": "Model to use when running this skill (e.g., \"sonnet\", \"opus\")"
61
+ },
62
+ "context": {
63
+ "type": "string",
64
+ "description": "Execution context (e.g., \"fork\" for isolated context)"
65
+ },
66
+ "agent": {
67
+ "type": "string",
68
+ "description": "Agent identity for multi-agent workflows"
69
+ },
70
+ "hooks": {
71
+ "type": "object",
72
+ "additionalProperties": {},
73
+ "description": "Lifecycle hooks (e.g., PostToolUse)"
45
74
  }
46
75
  },
47
76
  "required": [
@@ -49,7 +78,7 @@
49
78
  "description",
50
79
  "metadata"
51
80
  ],
52
- "additionalProperties": false
81
+ "additionalProperties": true
53
82
  }
54
83
  },
55
84
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -1,86 +0,0 @@
1
- /**
2
- * Unified link collection module
3
- *
4
- * Provides a single algorithm for collecting and classifying links from a
5
- * skill's markdown file tree. Used by both the packaging validator (to report
6
- * excluded references) and the skill packager (to rewrite dead links).
7
- *
8
- * Key design decisions:
9
- * - Non-markdown assets (images, JSON, etc.) are always bundled (no recursion, no depth contribution)
10
- * unless they match an exclude pattern
11
- * - Markdown links are subject to depth limits and exclude rules
12
- * - excludedReferences is NOT deduped: each occurrence preserves per-link context
13
- * - bundledFiles IS deduped: same file from multiple paths = one bundle entry
14
- * - Glob matching uses forward-slash paths relative to skillRoot
15
- */
16
- /**
17
- * Resolution result for a single link found in a bundled markdown file.
18
- */
19
- export interface LinkResolution {
20
- /** Absolute path to the linked file */
21
- path: string;
22
- /** Whether the file will be bundled */
23
- bundled: boolean;
24
- /** Reason it was excluded (only set when bundled is false) */
25
- excludeReason?: 'depth-exceeded' | 'pattern-matched' | 'directory-target' | undefined;
26
- /** The rule that matched (only set for pattern-matched exclusions) */
27
- matchedRule?: ExcludeRule | undefined;
28
- /** Link text from the source markdown */
29
- linkText?: string | undefined;
30
- /** Original href from the markdown */
31
- linkHref?: string | undefined;
32
- }
33
- /**
34
- * A rule that excludes files from bundling based on glob patterns.
35
- * First matching rule wins (ordered evaluation).
36
- */
37
- export interface ExcludeRule {
38
- patterns: string[];
39
- template?: string | undefined;
40
- }
41
- /**
42
- * Default template for depth-exceeded and unmatched excluded links.
43
- */
44
- export interface DefaultRule {
45
- template?: string | undefined;
46
- }
47
- /**
48
- * Options for link collection.
49
- */
50
- export interface LinkCollectionOptions {
51
- /** Max depth (Infinity for 'full') */
52
- maxDepth: number;
53
- /** Ordered exclude rules (first match wins) */
54
- excludeRules: ExcludeRule[];
55
- /** Default handling for depth-exceeded and unmatched excluded links */
56
- defaultRule: DefaultRule;
57
- /** Skill root directory for resolving relative paths in glob matching */
58
- skillRoot: string;
59
- /** Package root for boundary enforcement (packager only) */
60
- packageRoot?: string | undefined;
61
- }
62
- /**
63
- * Result of collecting links from a skill's markdown file tree.
64
- */
65
- export interface LinkCollectionResult {
66
- /** Files within depth AND not excluded -- will be bundled */
67
- bundledFiles: string[];
68
- /** Files detected but NOT bundled (depth or exclude) */
69
- excludedReferences: LinkResolution[];
70
- /** Actual max depth of the bundled portion */
71
- maxBundledDepth: number;
72
- }
73
- /**
74
- * Collect all links from a skill's markdown file tree, classifying each as
75
- * bundled or excluded.
76
- *
77
- * This is the core algorithm used by both the packaging validator and the
78
- * skill packager. It walks the markdown link tree starting from the given
79
- * skill file, respecting depth limits and exclude rules.
80
- *
81
- * @param markdownPath - Absolute path to the root SKILL.md file
82
- * @param options - Collection options (depth, excludes, etc.)
83
- * @returns Collection result with bundled files and excluded references
84
- */
85
- export declare function collectLinks(markdownPath: string, options: LinkCollectionOptions): Promise<LinkCollectionResult>;
86
- //# sourceMappingURL=link-collector.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"link-collector.d.ts","sourceRoot":"","sources":["../src/link-collector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAaH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,8DAA8D;IAC9D,aAAa,CAAC,EAAE,gBAAgB,GAAG,iBAAiB,GAAG,kBAAkB,GAAG,SAAS,CAAC;IACtF,sEAAsE;IACtE,WAAW,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IACtC,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,uEAAuE;IACvE,WAAW,EAAE,WAAW,CAAC;IACzB,yEAAyE;IACzE,SAAS,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,6DAA6D;IAC7D,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,wDAAwD;IACxD,kBAAkB,EAAE,cAAc,EAAE,CAAC;IACrC,8CAA8C;IAC9C,eAAe,EAAE,MAAM,CAAC;CACzB;AA0BD;;;;;;;;;;;GAWG;AACH,wBAAsB,YAAY,CAChC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CAI/B"}
@@ -1,206 +0,0 @@
1
- /**
2
- * Unified link collection module
3
- *
4
- * Provides a single algorithm for collecting and classifying links from a
5
- * skill's markdown file tree. Used by both the packaging validator (to report
6
- * excluded references) and the skill packager (to rewrite dead links).
7
- *
8
- * Key design decisions:
9
- * - Non-markdown assets (images, JSON, etc.) are always bundled (no recursion, no depth contribution)
10
- * unless they match an exclude pattern
11
- * - Markdown links are subject to depth limits and exclude rules
12
- * - excludedReferences is NOT deduped: each occurrence preserves per-link context
13
- * - bundledFiles IS deduped: same file from multiple paths = one bundle entry
14
- * - Glob matching uses forward-slash paths relative to skillRoot
15
- */
16
- import { existsSync, statSync } from 'node:fs';
17
- import { dirname, relative, resolve } from 'node:path';
18
- import { parseMarkdown } from '@vibe-agent-toolkit/resources';
19
- import { toForwardSlash } from '@vibe-agent-toolkit/utils';
20
- import picomatch from 'picomatch';
21
- // ============================================================================
22
- // Public API
23
- // ============================================================================
24
- /**
25
- * Collect all links from a skill's markdown file tree, classifying each as
26
- * bundled or excluded.
27
- *
28
- * This is the core algorithm used by both the packaging validator and the
29
- * skill packager. It walks the markdown link tree starting from the given
30
- * skill file, respecting depth limits and exclude rules.
31
- *
32
- * @param markdownPath - Absolute path to the root SKILL.md file
33
- * @param options - Collection options (depth, excludes, etc.)
34
- * @returns Collection result with bundled files and excluded references
35
- */
36
- export async function collectLinks(markdownPath, options) {
37
- const visited = new Set();
38
- return collectLinksRecursive(markdownPath, visited, options, 0);
39
- }
40
- // ============================================================================
41
- // Internal Implementation
42
- // ============================================================================
43
- /**
44
- * Recursive link collection with depth tracking and cycle prevention.
45
- *
46
- * Depth semantics:
47
- * - currentDepth starts at 0 for links found in the root SKILL.md
48
- * - The depth check `currentDepth >= maxDepth` is applied to markdown links
49
- * BEFORE recursing into them
50
- * - Non-markdown assets bypass the depth check entirely
51
- *
52
- * @param markdownPath - Current markdown file being processed
53
- * @param visited - Set of already-visited normalized paths (cycle prevention)
54
- * @param options - Collection options
55
- * @param currentDepth - Current depth in the link tree (0 = root's direct links)
56
- * @returns Accumulated collection result
57
- */
58
- async function collectLinksRecursive(markdownPath, visited, options, currentDepth) {
59
- const normalizedPath = resolve(markdownPath);
60
- // Prevent infinite loops from circular references
61
- if (visited.has(normalizedPath)) {
62
- return { bundledFiles: [], excludedReferences: [], maxBundledDepth: 0 };
63
- }
64
- visited.add(normalizedPath);
65
- // Parse the markdown file to extract links
66
- const parseResult = await parseMarkdown(markdownPath);
67
- // Resolve all local file links (both markdown and non-markdown)
68
- const resolvedLinks = resolveLocalLinks(parseResult.links, markdownPath, options.packageRoot);
69
- const bundledFilesSet = new Set();
70
- const excludedReferences = [];
71
- let maxBundledDepth = 0;
72
- // Compile exclude patterns once for this invocation
73
- const excludeMatchers = options.excludeRules.map((rule) => ({
74
- rule,
75
- isMatch: picomatch(rule.patterns),
76
- }));
77
- for (const link of resolvedLinks) {
78
- // Step 0: Directory links are always excluded (directories are not valid bundle targets)
79
- if (link.isDirectory) {
80
- excludedReferences.push({
81
- path: link.path,
82
- bundled: false,
83
- excludeReason: 'directory-target',
84
- linkText: link.linkText,
85
- linkHref: link.linkHref,
86
- });
87
- continue;
88
- }
89
- // Step 1: Check exclude rules (applies to ALL file types)
90
- // Use packageRoot (when available) as the base for glob matching.
91
- // skillRoot is dirname(SKILL.md) which may be deep inside the package;
92
- // files outside it produce ../ prefixes that picomatch ** cannot match.
93
- const matchBase = options.packageRoot ?? options.skillRoot;
94
- const relativePath = toForwardSlash(relative(matchBase, link.path));
95
- const matchedExclude = excludeMatchers.find((m) => m.isMatch(relativePath));
96
- if (matchedExclude) {
97
- // Excluded by pattern -- record as excluded reference
98
- excludedReferences.push({
99
- path: link.path,
100
- bundled: false,
101
- excludeReason: 'pattern-matched',
102
- matchedRule: matchedExclude.rule,
103
- linkText: link.linkText,
104
- linkHref: link.linkHref,
105
- });
106
- continue;
107
- }
108
- // Step 2: Non-markdown assets are always bundled (no recursion, no depth contribution)
109
- if (!link.isMarkdown) {
110
- bundledFilesSet.add(link.path);
111
- continue;
112
- }
113
- // Step 3: Markdown link -- check depth limit
114
- if (currentDepth >= options.maxDepth) {
115
- // Beyond depth limit -- record as excluded
116
- excludedReferences.push({
117
- path: link.path,
118
- bundled: false,
119
- excludeReason: 'depth-exceeded',
120
- linkText: link.linkText,
121
- linkHref: link.linkHref,
122
- });
123
- continue;
124
- }
125
- // Within depth -- bundle and recurse
126
- bundledFilesSet.add(link.path);
127
- const childResult = await collectLinksRecursive(link.path, visited, options, currentDepth + 1);
128
- // Merge child results
129
- for (const childFile of childResult.bundledFiles) {
130
- bundledFilesSet.add(childFile);
131
- }
132
- excludedReferences.push(...childResult.excludedReferences);
133
- // Track the deepest bundled depth
134
- // The child was at currentDepth+1, so its maxBundledDepth is relative to the root
135
- const childDepth = childResult.maxBundledDepth > 0
136
- ? childResult.maxBundledDepth
137
- : currentDepth + 1;
138
- maxBundledDepth = Math.max(maxBundledDepth, childDepth);
139
- }
140
- return {
141
- bundledFiles: [...bundledFilesSet],
142
- excludedReferences,
143
- maxBundledDepth,
144
- };
145
- }
146
- /**
147
- * Resolve all local file links from parsed markdown, returning both markdown
148
- * and non-markdown targets.
149
- *
150
- * Filters to `local_file` type links, strips anchors, resolves relative paths,
151
- * and checks file existence. Optionally enforces package boundary.
152
- *
153
- * @param links - Raw links from parseMarkdown result
154
- * @param markdownPath - Path of the source markdown file (for relative resolution)
155
- * @param packageRoot - Optional boundary for path enforcement
156
- * @returns Array of resolved links with metadata
157
- */
158
- function resolveLocalLinks(links, markdownPath, packageRoot) {
159
- const resolved = [];
160
- for (const link of links) {
161
- if (link.type !== 'local_file') {
162
- continue;
163
- }
164
- // Strip anchor from href
165
- const hrefWithoutAnchor = link.href.split('#')[0] ?? link.href;
166
- if (hrefWithoutAnchor === '') {
167
- continue;
168
- }
169
- // Resolve to absolute path
170
- const resolvedPath = resolve(dirname(markdownPath), hrefWithoutAnchor);
171
- // Check file existence
172
- // eslint-disable-next-line security/detect-non-literal-fs-filename -- Path constructed from parsed markdown links
173
- if (!existsSync(resolvedPath)) {
174
- continue;
175
- }
176
- // Enforce package boundary if set
177
- if (packageRoot) {
178
- const rel = relative(packageRoot, resolvedPath);
179
- if (rel.startsWith('..')) {
180
- continue;
181
- }
182
- }
183
- // Check if target is a directory (not a file)
184
- // eslint-disable-next-line security/detect-non-literal-fs-filename -- Path constructed from parsed markdown links
185
- const stats = statSync(resolvedPath);
186
- if (stats.isDirectory()) {
187
- resolved.push({
188
- path: resolvedPath,
189
- isMarkdown: false,
190
- isDirectory: true,
191
- linkText: link.text ?? '',
192
- linkHref: link.href,
193
- });
194
- continue;
195
- }
196
- const isMarkdown = resolvedPath.endsWith('.md');
197
- resolved.push({
198
- path: resolvedPath,
199
- isMarkdown,
200
- linkText: link.text ?? '',
201
- linkHref: link.href,
202
- });
203
- }
204
- return resolved;
205
- }
206
- //# sourceMappingURL=link-collector.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"link-collector.js","sourceRoot":"","sources":["../src/link-collector.ts"],"names":[],"mappings":"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"}
@@ -1,75 +0,0 @@
1
- import { z } from 'zod';
2
- /**
3
- * Claude Skill Frontmatter Schema (Strict)
4
- *
5
- * Based on official Agent Skills specification at agentskills.io/specification
6
- * Console-compatible: Only allows fields defined in the spec
7
- */
8
- export declare const ClaudeSkillFrontmatterSchema: z.ZodObject<{
9
- name: z.ZodString;
10
- description: z.ZodString;
11
- license: z.ZodOptional<z.ZodString>;
12
- compatibility: z.ZodOptional<z.ZodString>;
13
- metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
14
- 'allowed-tools': z.ZodOptional<z.ZodString>;
15
- }, "strict", z.ZodTypeAny, {
16
- name: string;
17
- description: string;
18
- license?: string | undefined;
19
- compatibility?: string | undefined;
20
- metadata?: Record<string, string> | undefined;
21
- 'allowed-tools'?: string | undefined;
22
- }, {
23
- name: string;
24
- description: string;
25
- license?: string | undefined;
26
- compatibility?: string | undefined;
27
- metadata?: Record<string, string> | undefined;
28
- 'allowed-tools'?: string | undefined;
29
- }>;
30
- export type ClaudeSkillFrontmatter = z.infer<typeof ClaudeSkillFrontmatterSchema>;
31
- /**
32
- * VAT Claude Skill Frontmatter Schema
33
- *
34
- * Extends strict schema with VAT-specific metadata requirements
35
- * Used when building/validating VAT-generated skills
36
- */
37
- export declare const VATClaudeSkillFrontmatterSchema: z.ZodObject<{
38
- name: z.ZodString;
39
- description: z.ZodString;
40
- license: z.ZodOptional<z.ZodString>;
41
- compatibility: z.ZodOptional<z.ZodString>;
42
- 'allowed-tools': z.ZodOptional<z.ZodString>;
43
- } & {
44
- metadata: z.ZodObject<{
45
- version: z.ZodString;
46
- }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
47
- version: z.ZodString;
48
- }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
49
- version: z.ZodString;
50
- }, z.ZodTypeAny, "passthrough">>;
51
- }, "strict", z.ZodTypeAny, {
52
- name: string;
53
- description: string;
54
- metadata: {
55
- version: string;
56
- } & {
57
- [k: string]: unknown;
58
- };
59
- license?: string | undefined;
60
- compatibility?: string | undefined;
61
- 'allowed-tools'?: string | undefined;
62
- }, {
63
- name: string;
64
- description: string;
65
- metadata: {
66
- version: string;
67
- } & {
68
- [k: string]: unknown;
69
- };
70
- license?: string | undefined;
71
- compatibility?: string | undefined;
72
- 'allowed-tools'?: string | undefined;
73
- }>;
74
- export type VATClaudeSkillFrontmatter = z.infer<typeof VATClaudeSkillFrontmatterSchema>;
75
- //# sourceMappingURL=claude-skill-frontmatter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"claude-skill-frontmatter.d.ts","sourceRoot":"","sources":["../../src/schemas/claude-skill-frontmatter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;EAkC9B,CAAC;AAEZ,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAElF;;;;;GAKG;AACH,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAK1C,CAAC;AAEH,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,+BAA+B,CAAC,CAAC"}
@@ -1,48 +0,0 @@
1
- import { z } from 'zod';
2
- /**
3
- * Claude Skill Frontmatter Schema (Strict)
4
- *
5
- * Based on official Agent Skills specification at agentskills.io/specification
6
- * Console-compatible: Only allows fields defined in the spec
7
- */
8
- export const ClaudeSkillFrontmatterSchema = z.object({
9
- // Required fields
10
- name: z.string()
11
- .min(1, 'Name is required')
12
- .max(64, 'Name must be 64 characters or less')
13
- .regex(
14
- // eslint-disable-next-line security/detect-unsafe-regex -- simple pattern for skill names, max length enforced
15
- /^[a-z0-9]+(-[a-z0-9]+)*$/, 'Name must be lowercase alphanumeric with hyphens, no consecutive hyphens, cannot start/end with hyphen')
16
- .describe('Skill identifier, must match parent directory name'),
17
- description: z.string()
18
- .min(1, 'Description is required')
19
- .max(1024, 'Description must be 1024 characters or less')
20
- .describe('What the skill does and when to use it'),
21
- // Optional fields (from spec)
22
- license: z.string()
23
- .optional()
24
- .describe('License applied to this skill'),
25
- compatibility: z.string()
26
- .max(500, 'Compatibility must be 500 characters or less')
27
- .optional()
28
- .describe('Environment requirements (e.g., "Requires git, docker, jq")'),
29
- metadata: z.record(z.string())
30
- .optional()
31
- .describe('Additional properties not defined by the spec'),
32
- 'allowed-tools': z.string()
33
- .optional()
34
- .describe('Pre-approved tools (experimental)'),
35
- }).strict(); // Reject unknown fields for console compatibility
36
- /**
37
- * VAT Claude Skill Frontmatter Schema
38
- *
39
- * Extends strict schema with VAT-specific metadata requirements
40
- * Used when building/validating VAT-generated skills
41
- */
42
- export const VATClaudeSkillFrontmatterSchema = ClaudeSkillFrontmatterSchema.extend({
43
- metadata: z.object({
44
- version: z.string()
45
- .describe('Semantic version of this skill'),
46
- }).passthrough(), // Allow additional metadata fields
47
- });
48
- //# sourceMappingURL=claude-skill-frontmatter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"claude-skill-frontmatter.js","sourceRoot":"","sources":["../../src/schemas/claude-skill-frontmatter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;GAKG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC,MAAM,CAAC;IACnD,kBAAkB;IAClB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;SACb,GAAG,CAAC,CAAC,EAAE,kBAAkB,CAAC;SAC1B,GAAG,CAAC,EAAE,EAAE,oCAAoC,CAAC;SAC7C,KAAK;IACJ,+GAA+G;IAC/G,0BAA0B,EAC1B,wGAAwG,CACzG;SACA,QAAQ,CAAC,oDAAoD,CAAC;IAEjE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;SACpB,GAAG,CAAC,CAAC,EAAE,yBAAyB,CAAC;SACjC,GAAG,CAAC,IAAI,EAAE,6CAA6C,CAAC;SACxD,QAAQ,CAAC,wCAAwC,CAAC;IAErD,8BAA8B;IAC9B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;SAChB,QAAQ,EAAE;SACV,QAAQ,CAAC,+BAA+B,CAAC;IAE5C,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;SACtB,GAAG,CAAC,GAAG,EAAE,8CAA8C,CAAC;SACxD,QAAQ,EAAE;SACV,QAAQ,CAAC,6DAA6D,CAAC;IAE1E,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SAC3B,QAAQ,EAAE;SACV,QAAQ,CAAC,+CAA+C,CAAC;IAE5D,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE;SACxB,QAAQ,EAAE;SACV,QAAQ,CAAC,mCAAmC,CAAC;CACjD,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,kDAAkD;AAI/D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,4BAA4B,CAAC,MAAM,CAAC;IACjF,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;QACjB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;aAChB,QAAQ,CAAC,gCAAgC,CAAC;KAC9C,CAAC,CAAC,WAAW,EAAE,EAAE,mCAAmC;CACtD,CAAC,CAAC"}