@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.
- package/README.md +28 -28
- package/dist/builder.d.ts +3 -3
- package/dist/builder.d.ts.map +1 -1
- package/dist/builder.js +3 -3
- package/dist/builder.js.map +1 -1
- package/dist/import.d.ts +1 -1
- package/dist/import.js +7 -7
- package/dist/import.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/schemas/agent-skill-frontmatter.d.ts +140 -0
- package/dist/schemas/agent-skill-frontmatter.d.ts.map +1 -0
- package/dist/schemas/agent-skill-frontmatter.js +95 -0
- package/dist/schemas/agent-skill-frontmatter.js.map +1 -0
- package/dist/schemas/claude-plugin.d.ts +60 -109
- package/dist/schemas/claude-plugin.d.ts.map +1 -1
- package/dist/schemas/claude-plugin.js +26 -34
- package/dist/schemas/claude-plugin.js.map +1 -1
- package/dist/schemas/index.d.ts +1 -1
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +1 -1
- package/dist/schemas/index.js.map +1 -1
- package/dist/schemas/marketplace.d.ts +1224 -202
- package/dist/schemas/marketplace.d.ts.map +1 -1
- package/dist/schemas/marketplace.js +51 -13
- package/dist/schemas/marketplace.js.map +1 -1
- package/dist/skill-packager.d.ts +42 -0
- package/dist/skill-packager.d.ts.map +1 -1
- package/dist/skill-packager.js +269 -238
- package/dist/skill-packager.js.map +1 -1
- package/dist/validators/format-detection.js +7 -7
- package/dist/validators/format-detection.js.map +1 -1
- package/dist/validators/frontmatter-validation.d.ts +30 -0
- package/dist/validators/frontmatter-validation.d.ts.map +1 -0
- package/dist/validators/frontmatter-validation.js +132 -0
- package/dist/validators/frontmatter-validation.js.map +1 -0
- package/dist/validators/marketplace-validator.d.ts +1 -0
- package/dist/validators/marketplace-validator.d.ts.map +1 -1
- package/dist/validators/marketplace-validator.js +1 -0
- package/dist/validators/marketplace-validator.js.map +1 -1
- package/dist/validators/packaging-validator.d.ts +1 -1
- package/dist/validators/packaging-validator.d.ts.map +1 -1
- package/dist/validators/packaging-validator.js +53 -11
- package/dist/validators/packaging-validator.js.map +1 -1
- package/dist/validators/plugin-validator.d.ts +2 -1
- package/dist/validators/plugin-validator.d.ts.map +1 -1
- package/dist/validators/plugin-validator.js +2 -1
- package/dist/validators/plugin-validator.js.map +1 -1
- package/dist/validators/skill-validator.d.ts +2 -1
- package/dist/validators/skill-validator.d.ts.map +1 -1
- package/dist/validators/skill-validator.js +7 -108
- package/dist/validators/skill-validator.js.map +1 -1
- package/dist/validators/types.d.ts +2 -2
- package/dist/validators/types.d.ts.map +1 -1
- package/dist/validators/validation-rules.d.ts +1 -1
- package/dist/validators/validation-rules.js +5 -5
- package/dist/validators/validation-rules.js.map +1 -1
- package/dist/walk-link-graph.d.ts +88 -0
- package/dist/walk-link-graph.d.ts.map +1 -0
- package/dist/walk-link-graph.js +190 -0
- package/dist/walk-link-graph.js.map +1 -0
- package/package.json +5 -4
- package/schemas/skill-frontmatter.json +32 -7
- package/schemas/vat-skill-frontmatter.json +32 -3
- package/dist/link-collector.d.ts +0 -86
- package/dist/link-collector.d.ts.map +0 -1
- package/dist/link-collector.js +0 -206
- package/dist/link-collector.js.map +0 -1
- package/dist/schemas/claude-skill-frontmatter.d.ts +0 -75
- package/dist/schemas/claude-skill-frontmatter.d.ts.map +0 -1
- package/dist/schemas/claude-skill-frontmatter.js +0 -48
- 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
|
|
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": "
|
|
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
|
-
"
|
|
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
|
|
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": "
|
|
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":
|
|
81
|
+
"additionalProperties": true
|
|
53
82
|
}
|
|
54
83
|
},
|
|
55
84
|
"$schema": "http://json-schema.org/draft-07/schema#"
|
package/dist/link-collector.d.ts
DELETED
|
@@ -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"}
|
package/dist/link-collector.js
DELETED
|
@@ -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"}
|