@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
|
@@ -1,16 +1,13 @@
|
|
|
1
1
|
import * as fs from 'node:fs';
|
|
2
2
|
import { parseFrontmatter } from '../parsers/frontmatter-parser.js';
|
|
3
|
-
import {
|
|
4
|
-
// Location constants for validation messages
|
|
5
|
-
const FRONTMATTER_LOC = 'frontmatter';
|
|
6
|
-
const FRONTMATTER_NAME_LOC = 'frontmatter.name';
|
|
7
|
-
const FRONTMATTER_DESC_LOC = 'frontmatter.description';
|
|
3
|
+
import { validateFrontmatterRules, validateFrontmatterSchema } from './frontmatter-validation.js';
|
|
8
4
|
/**
|
|
9
|
-
* Validate
|
|
5
|
+
* Validate an Agent Skill (SKILL.md file)
|
|
10
6
|
*
|
|
11
7
|
* Uses ResourceRegistry for markdown/link validation
|
|
12
8
|
* Adds skill-specific validation (frontmatter schema, skill rules)
|
|
13
9
|
*
|
|
10
|
+
* @see https://code.claude.com/docs/en/skills — Official Claude Code skill spec
|
|
14
11
|
* @param options - Validation options
|
|
15
12
|
* @returns Validation result with all validation issues
|
|
16
13
|
*/
|
|
@@ -22,7 +19,7 @@ export async function validateSkill(options) {
|
|
|
22
19
|
if (!fs.existsSync(skillPath)) {
|
|
23
20
|
return {
|
|
24
21
|
path: skillPath,
|
|
25
|
-
type: isVATGenerated ? 'vat-agent' : '
|
|
22
|
+
type: isVATGenerated ? 'vat-agent' : 'agent-skill',
|
|
26
23
|
status: 'error',
|
|
27
24
|
summary: '1 error',
|
|
28
25
|
issues: [{
|
|
@@ -50,10 +47,8 @@ export async function validateSkill(options) {
|
|
|
50
47
|
return buildResult(skillPath, isVATGenerated, issues, { lineCount });
|
|
51
48
|
}
|
|
52
49
|
const { frontmatter } = parseResult;
|
|
53
|
-
// Validate frontmatter schema (
|
|
54
|
-
validateFrontmatterSchema(frontmatter, isVATGenerated,
|
|
55
|
-
// Validate additional skill rules (skill-specific)
|
|
56
|
-
validateAdditionalRules(frontmatter, issues);
|
|
50
|
+
// Validate frontmatter schema (shared with packaging validator)
|
|
51
|
+
issues.push(...validateFrontmatterSchema(frontmatter, isVATGenerated), ...validateFrontmatterRules(frontmatter));
|
|
57
52
|
// Validate warning-level rules (skill-specific)
|
|
58
53
|
validateWarningRules(content, lineCount, skillPath, issues);
|
|
59
54
|
// NOTE: Link validation is handled by resource validation (vat resources validate)
|
|
@@ -62,102 +57,6 @@ export async function validateSkill(options) {
|
|
|
62
57
|
const metadata = buildMetadata(frontmatter, lineCount);
|
|
63
58
|
return buildResult(skillPath, isVATGenerated, issues, metadata);
|
|
64
59
|
}
|
|
65
|
-
function validateFrontmatterSchema(frontmatter, isVATGenerated, issues) {
|
|
66
|
-
const schema = isVATGenerated ? VATClaudeSkillFrontmatterSchema : ClaudeSkillFrontmatterSchema;
|
|
67
|
-
const schemaResult = schema.safeParse(frontmatter);
|
|
68
|
-
if (schemaResult.success) {
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
// Map Zod errors to our issue codes
|
|
72
|
-
for (const error of schemaResult.error.errors) {
|
|
73
|
-
const field = error.path.join('.');
|
|
74
|
-
if (field === 'name' && !frontmatter['name']) {
|
|
75
|
-
issues.push({
|
|
76
|
-
severity: 'error',
|
|
77
|
-
code: 'SKILL_MISSING_NAME',
|
|
78
|
-
message: 'Required field "name" is missing',
|
|
79
|
-
location: FRONTMATTER_LOC,
|
|
80
|
-
fix: 'Add "name" field to frontmatter',
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
else if (field === 'description' && !frontmatter['description']) {
|
|
84
|
-
issues.push({
|
|
85
|
-
severity: 'error',
|
|
86
|
-
code: 'SKILL_MISSING_DESCRIPTION',
|
|
87
|
-
message: 'Required field "description" is missing',
|
|
88
|
-
location: FRONTMATTER_LOC,
|
|
89
|
-
fix: 'Add "description" field to frontmatter',
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
else if (field === 'name') {
|
|
93
|
-
issues.push({
|
|
94
|
-
severity: 'error',
|
|
95
|
-
code: 'SKILL_NAME_INVALID',
|
|
96
|
-
message: error.message,
|
|
97
|
-
location: FRONTMATTER_NAME_LOC,
|
|
98
|
-
fix: 'Change name to lowercase alphanumeric with hyphens (e.g., "my-skill")',
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
else if (field === 'description' && error.message.includes('1024')) {
|
|
102
|
-
issues.push({
|
|
103
|
-
severity: 'error',
|
|
104
|
-
code: 'SKILL_DESCRIPTION_TOO_LONG',
|
|
105
|
-
message: `Description exceeds 1024 characters (actual: ${frontmatter['description']?.length ?? 0})`,
|
|
106
|
-
location: FRONTMATTER_DESC_LOC,
|
|
107
|
-
fix: 'Reduce description to 1024 characters or less',
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
function validateAdditionalRules(frontmatter, issues) {
|
|
113
|
-
// Validate name field
|
|
114
|
-
if (frontmatter['name'] && typeof frontmatter['name'] === 'string') {
|
|
115
|
-
const name = frontmatter['name'].toLowerCase();
|
|
116
|
-
// Check for reserved words
|
|
117
|
-
if (name.includes('anthropic') || name.includes('claude')) {
|
|
118
|
-
issues.push({
|
|
119
|
-
severity: 'error',
|
|
120
|
-
code: 'SKILL_NAME_RESERVED_WORD',
|
|
121
|
-
message: 'Name contains reserved word "anthropic" or "claude"',
|
|
122
|
-
location: FRONTMATTER_NAME_LOC,
|
|
123
|
-
fix: 'Remove reserved word from name',
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
// Check for XML tags
|
|
127
|
-
if (/[<>]/.test(frontmatter['name'])) {
|
|
128
|
-
issues.push({
|
|
129
|
-
severity: 'error',
|
|
130
|
-
code: 'SKILL_NAME_XML_TAGS',
|
|
131
|
-
message: 'Name contains XML tags',
|
|
132
|
-
location: FRONTMATTER_NAME_LOC,
|
|
133
|
-
fix: 'Remove < and > characters from name',
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
// Validate description field
|
|
138
|
-
if (frontmatter['description'] && typeof frontmatter['description'] === 'string') {
|
|
139
|
-
// Check for XML tags
|
|
140
|
-
if (/[<>]/.test(frontmatter['description'])) {
|
|
141
|
-
issues.push({
|
|
142
|
-
severity: 'error',
|
|
143
|
-
code: 'SKILL_DESCRIPTION_XML_TAGS',
|
|
144
|
-
message: 'Description contains XML tags',
|
|
145
|
-
location: FRONTMATTER_DESC_LOC,
|
|
146
|
-
fix: 'Remove < and > characters from description',
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
// Check for empty description
|
|
150
|
-
if (frontmatter['description'].trim() === '') {
|
|
151
|
-
issues.push({
|
|
152
|
-
severity: 'error',
|
|
153
|
-
code: 'SKILL_DESCRIPTION_EMPTY',
|
|
154
|
-
message: 'Description is empty',
|
|
155
|
-
location: FRONTMATTER_DESC_LOC,
|
|
156
|
-
fix: 'Add description explaining what the skill does and when to use it',
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
60
|
function validateWarningRules(content, lineCount, skillPath, issues) {
|
|
162
61
|
// Check if skill is too long (>5000 lines)
|
|
163
62
|
const MAX_SKILL_LINES = 5000;
|
|
@@ -217,7 +116,7 @@ function buildResult(skillPath, isVATGenerated, issues, metadata) {
|
|
|
217
116
|
const summary = `${errorCount} errors, ${warningCount} warnings, ${infoCount} info`;
|
|
218
117
|
const result = {
|
|
219
118
|
path: skillPath,
|
|
220
|
-
type: isVATGenerated ? 'vat-agent' : '
|
|
119
|
+
type: isVATGenerated ? 'vat-agent' : 'agent-skill',
|
|
221
120
|
status,
|
|
222
121
|
summary,
|
|
223
122
|
issues,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-validator.js","sourceRoot":"","sources":["../../src/validators/skill-validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"skill-validator.js","sourceRoot":"","sources":["../../src/validators/skill-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export type IssueSeverity = 'error' | 'warning' | 'info';
|
|
2
|
-
export type IssueCode = 'SKILL_MISSING_FRONTMATTER' | 'SKILL_MISSING_NAME' | 'SKILL_MISSING_DESCRIPTION' | 'SKILL_NAME_INVALID' | 'SKILL_NAME_RESERVED_WORD' | 'SKILL_NAME_XML_TAGS' | 'SKILL_DESCRIPTION_XML_TAGS' | 'SKILL_DESCRIPTION_TOO_LONG' | 'SKILL_DESCRIPTION_EMPTY' | 'SKILL_MISCONFIGURED_LOCATION' | 'LINK_INTEGRITY_BROKEN' | 'PATH_STYLE_WINDOWS' | 'INVALID_FRONTMATTER' | 'MISSING_NAME' | 'RESERVED_WORD_IN_NAME' | 'BROKEN_INTERNAL_LINK' | 'CIRCULAR_REFERENCE' | '
|
|
2
|
+
export type IssueCode = 'SKILL_MISSING_FRONTMATTER' | 'SKILL_MISSING_NAME' | 'SKILL_MISSING_DESCRIPTION' | 'SKILL_NAME_INVALID' | 'SKILL_NAME_RESERVED_WORD' | 'SKILL_NAME_XML_TAGS' | 'SKILL_DESCRIPTION_XML_TAGS' | 'SKILL_DESCRIPTION_TOO_LONG' | 'SKILL_DESCRIPTION_EMPTY' | 'SKILL_MISCONFIGURED_LOCATION' | 'LINK_INTEGRITY_BROKEN' | 'PATH_STYLE_WINDOWS' | 'INVALID_FRONTMATTER' | 'MISSING_NAME' | 'RESERVED_WORD_IN_NAME' | 'BROKEN_INTERNAL_LINK' | 'CIRCULAR_REFERENCE' | 'OUTSIDE_PROJECT_BOUNDARY' | 'FILENAME_COLLISION' | 'WINDOWS_BACKSLASH_IN_PATH' | 'LINK_TARGETS_DIRECTORY' | 'SKILL_LENGTH_EXCEEDS_RECOMMENDED' | 'SKILL_TOTAL_SIZE_LARGE' | 'SKILL_TOO_MANY_FILES' | 'REFERENCE_TOO_DEEP' | 'LINKS_TO_NAVIGATION_FILES' | 'DESCRIPTION_TOO_VAGUE' | 'NO_PROGRESSIVE_DISCLOSURE' | 'PLUGIN_MISSING_MANIFEST' | 'PLUGIN_INVALID_JSON' | 'PLUGIN_INVALID_SCHEMA' | 'MARKETPLACE_MISSING_MANIFEST' | 'MARKETPLACE_INVALID_JSON' | 'MARKETPLACE_INVALID_SCHEMA' | 'REGISTRY_MISSING_FILE' | 'REGISTRY_INVALID_JSON' | 'REGISTRY_INVALID_SCHEMA' | 'UNKNOWN_FORMAT' | 'SKILL_TOO_LONG' | 'REFERENCE_DEPTH_EXCEEDED' | 'REFERENCE_MISSING_TOC' | 'DESCRIPTION_FIRST_PERSON' | 'RESOURCE_UNREACHABLE' | 'SKILL_CONSOLE_INCOMPATIBLE' | 'FILE_STRUCTURE_REPORT' | 'RESOURCE_INVENTORY' | 'METADATA_SUMMARY' | 'SKILL_UNREFERENCED_FILE';
|
|
3
3
|
export interface ValidationIssue {
|
|
4
4
|
severity: IssueSeverity;
|
|
5
5
|
code: IssueCode;
|
|
@@ -9,7 +9,7 @@ export interface ValidationIssue {
|
|
|
9
9
|
}
|
|
10
10
|
export interface ValidationResult {
|
|
11
11
|
path: string;
|
|
12
|
-
type: '
|
|
12
|
+
type: 'agent-skill' | 'vat-agent' | 'claude-plugin' | 'marketplace' | 'registry' | 'unknown';
|
|
13
13
|
status: 'success' | 'warning' | 'error';
|
|
14
14
|
summary: string;
|
|
15
15
|
issues: ValidationIssue[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/validators/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAEzD,MAAM,MAAM,SAAS,GAEjB,2BAA2B,GAC3B,oBAAoB,GACpB,2BAA2B,GAC3B,oBAAoB,GACpB,0BAA0B,GAC1B,qBAAqB,GACrB,4BAA4B,GAC5B,4BAA4B,GAC5B,yBAAyB,GACzB,8BAA8B,GAC9B,uBAAuB,GACvB,oBAAoB,GAEpB,qBAAqB,GACrB,cAAc,GACd,uBAAuB,GACvB,sBAAsB,GACtB,oBAAoB,GACpB,0BAA0B,GAC1B,oBAAoB,GACpB,2BAA2B,GAC3B,wBAAwB,GAExB,kCAAkC,GAClC,wBAAwB,GACxB,sBAAsB,GACtB,oBAAoB,GACpB,2BAA2B,GAC3B,uBAAuB,GACvB,2BAA2B,GAE3B,yBAAyB,GACzB,qBAAqB,GACrB,uBAAuB,GAEvB,8BAA8B,GAC9B,0BAA0B,GAC1B,4BAA4B,GAE5B,uBAAuB,GACvB,uBAAuB,GACvB,yBAAyB,GAEzB,gBAAgB,GAEhB,gBAAgB,GAChB,0BAA0B,GAC1B,uBAAuB,GACvB,0BAA0B,GAC1B,sBAAsB,GACtB,4BAA4B,GAE5B,uBAAuB,GACvB,oBAAoB,GACpB,kBAAkB,GAClB,yBAAyB,CAAC;AAE9B,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/validators/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,7 +21,7 @@ export type RuleCategory = 'required' | 'best_practice';
|
|
|
21
21
|
/**
|
|
22
22
|
* Validation rule code
|
|
23
23
|
*/
|
|
24
|
-
export type ValidationRuleCode = 'INVALID_FRONTMATTER' | 'MISSING_NAME' | 'RESERVED_WORD_IN_NAME' | 'BROKEN_INTERNAL_LINK' | 'CIRCULAR_REFERENCE' | '
|
|
24
|
+
export type ValidationRuleCode = 'INVALID_FRONTMATTER' | 'MISSING_NAME' | 'RESERVED_WORD_IN_NAME' | 'BROKEN_INTERNAL_LINK' | 'CIRCULAR_REFERENCE' | 'OUTSIDE_PROJECT_BOUNDARY' | 'FILENAME_COLLISION' | 'WINDOWS_BACKSLASH_IN_PATH' | 'LINK_TARGETS_DIRECTORY' | 'SKILL_LENGTH_EXCEEDS_RECOMMENDED' | 'SKILL_TOTAL_SIZE_LARGE' | 'SKILL_TOO_MANY_FILES' | 'REFERENCE_TOO_DEEP' | 'LINKS_TO_NAVIGATION_FILES' | 'DESCRIPTION_TOO_VAGUE' | 'NO_PROGRESSIVE_DISCLOSURE';
|
|
25
25
|
/**
|
|
26
26
|
* Validation rule definition
|
|
27
27
|
*/
|
|
@@ -21,7 +21,7 @@ export const NON_OVERRIDABLE_RULES = [
|
|
|
21
21
|
'RESERVED_WORD_IN_NAME',
|
|
22
22
|
'BROKEN_INTERNAL_LINK',
|
|
23
23
|
'CIRCULAR_REFERENCE',
|
|
24
|
-
'
|
|
24
|
+
'OUTSIDE_PROJECT_BOUNDARY',
|
|
25
25
|
'FILENAME_COLLISION',
|
|
26
26
|
'WINDOWS_BACKSLASH_IN_PATH',
|
|
27
27
|
];
|
|
@@ -60,11 +60,11 @@ export const VALIDATION_RULES = {
|
|
|
60
60
|
message: (ctx) => `Circular reference detected: ${ctx['chain'] ?? 'unknown'}`,
|
|
61
61
|
fix: 'Remove circular link dependency',
|
|
62
62
|
},
|
|
63
|
-
|
|
64
|
-
code: '
|
|
63
|
+
OUTSIDE_PROJECT_BOUNDARY: {
|
|
64
|
+
code: 'OUTSIDE_PROJECT_BOUNDARY',
|
|
65
65
|
category: 'required',
|
|
66
|
-
message: (ctx) => `Link points outside
|
|
67
|
-
fix: 'Keep skills self-contained - move referenced files into
|
|
66
|
+
message: (ctx) => `Link points outside project: ${ctx['href'] ?? 'unknown'}`,
|
|
67
|
+
fix: 'Keep skills self-contained - move referenced files into the project',
|
|
68
68
|
},
|
|
69
69
|
FILENAME_COLLISION: {
|
|
70
70
|
code: 'FILENAME_COLLISION',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation-rules.js","sourceRoot":"","sources":["../../src/validators/validation-rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AA8CH;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAyB;IACzD,qBAAqB;IACrB,cAAc;IACd,uBAAuB;IACvB,sBAAsB;IACtB,oBAAoB;IACpB,0BAA0B;IAC1B,oBAAoB;IACpB,2BAA2B;CAC5B,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAA+C;IAC1E,mCAAmC;IACnC,mBAAmB,EAAE;QACnB,IAAI,EAAE,qBAAqB;QAC3B,QAAQ,EAAE,UAAU;QACpB,OAAO,EAAE,GAAG,EAAE,CAAC,+BAA+B;QAC9C,GAAG,EAAE,gCAAgC;KACtC;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,cAAc;QACpB,QAAQ,EAAE,UAAU;QACpB,OAAO,EAAE,GAAG,EAAE,CAAC,uDAAuD;QACtE,GAAG,EAAE,yCAAyC;KAC/C;IACD,qBAAqB,EAAE;QACrB,IAAI,EAAE,uBAAuB;QAC7B,QAAQ,EAAE,UAAU;QACpB,OAAO,EAAE,GAAG,EAAE,CAAC,sDAAsD;QACrE,GAAG,EAAE,yBAAyB;KAC/B;IACD,oBAAoB,EAAE;QACpB,IAAI,EAAE,sBAAsB;QAC5B,QAAQ,EAAE,UAAU;QACpB,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,0BAA2B,GAAG,CAAC,MAAM,CAAY,IAAI,SAAS,EAAE;QAClF,GAAG,EAAE,uCAAuC;KAC7C;IACD,kBAAkB,EAAE;QAClB,IAAI,EAAE,oBAAoB;QAC1B,QAAQ,EAAE,UAAU;QACpB,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,gCAAiC,GAAG,CAAC,OAAO,CAAY,IAAI,SAAS,EAAE;QACzF,GAAG,EAAE,iCAAiC;KACvC;IACD,wBAAwB,EAAE;QACxB,IAAI,EAAE,0BAA0B;QAChC,QAAQ,EAAE,UAAU;QACpB,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"validation-rules.js","sourceRoot":"","sources":["../../src/validators/validation-rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure link graph walker that operates on ResourceRegistry data.
|
|
3
|
+
*
|
|
4
|
+
* Replaces the I/O-heavy `collectLinks()` with a pure function that walks
|
|
5
|
+
* the link graph using pre-parsed data from a ResourceRegistry. This eliminates
|
|
6
|
+
* per-file `parseMarkdown()` calls and `existsSync()` checks for markdown files.
|
|
7
|
+
*
|
|
8
|
+
* Non-markdown assets (images, JSON, etc.) won't be in the registry and still
|
|
9
|
+
* require `existsSync()` checks — this is acceptable since the goal is eliminating
|
|
10
|
+
* redundant I/O for markdown files that are already parsed.
|
|
11
|
+
*/
|
|
12
|
+
import type { ResourceMetadata } from '@vibe-agent-toolkit/resources';
|
|
13
|
+
/**
|
|
14
|
+
* Resolution result for a single link found in a bundled markdown file.
|
|
15
|
+
*/
|
|
16
|
+
export interface LinkResolution {
|
|
17
|
+
/** Absolute path to the linked file */
|
|
18
|
+
path: string;
|
|
19
|
+
/** Whether the file will be bundled */
|
|
20
|
+
bundled: boolean;
|
|
21
|
+
/** Reason it was excluded (only set when bundled is false) */
|
|
22
|
+
excludeReason?: 'depth-exceeded' | 'pattern-matched' | 'directory-target' | 'outside-project' | 'navigation-file' | undefined;
|
|
23
|
+
/** The rule that matched (only set for pattern-matched exclusions) */
|
|
24
|
+
matchedRule?: ExcludeRule | undefined;
|
|
25
|
+
/** Link text from the source markdown */
|
|
26
|
+
linkText?: string | undefined;
|
|
27
|
+
/** Original href from the markdown */
|
|
28
|
+
linkHref?: string | undefined;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* A rule that excludes files from bundling based on glob patterns.
|
|
32
|
+
* First matching rule wins (ordered evaluation).
|
|
33
|
+
*/
|
|
34
|
+
export interface ExcludeRule {
|
|
35
|
+
patterns: string[];
|
|
36
|
+
template?: string | undefined;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Minimal interface for the registry operations walkLinkGraph needs.
|
|
40
|
+
* Avoids tight coupling to the full ResourceRegistry class.
|
|
41
|
+
*/
|
|
42
|
+
export interface WalkableRegistry {
|
|
43
|
+
getResourceById(id: string): ResourceMetadata | undefined;
|
|
44
|
+
getResource(filePath: string): ResourceMetadata | undefined;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Result of walking the link graph from a skill resource.
|
|
48
|
+
*/
|
|
49
|
+
export interface LinkGraphResult {
|
|
50
|
+
/** Markdown resources within depth and not excluded */
|
|
51
|
+
bundledResources: ResourceMetadata[];
|
|
52
|
+
/** Non-markdown file paths (images, JSON, etc.) — absolute paths */
|
|
53
|
+
bundledAssets: string[];
|
|
54
|
+
/** References detected but NOT bundled (depth, exclude, etc.) */
|
|
55
|
+
excludedReferences: LinkResolution[];
|
|
56
|
+
/** Actual max depth of the bundled portion */
|
|
57
|
+
maxBundledDepth: number;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Options for walking the link graph.
|
|
61
|
+
*/
|
|
62
|
+
export interface WalkLinkGraphOptions {
|
|
63
|
+
/** Max depth for following markdown links (Infinity for 'full') */
|
|
64
|
+
maxDepth: number;
|
|
65
|
+
/** Ordered exclude rules (first match wins) */
|
|
66
|
+
excludeRules: ExcludeRule[];
|
|
67
|
+
/** Project root for boundary enforcement and pattern matching */
|
|
68
|
+
projectRoot: string;
|
|
69
|
+
/** Whether to exclude navigation files (README.md, index.md, etc.) */
|
|
70
|
+
excludeNavigationFiles?: boolean;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Walk the link graph starting from a skill resource, using pre-parsed
|
|
74
|
+
* registry data instead of per-file I/O.
|
|
75
|
+
*
|
|
76
|
+
* Semantics match the original `collectLinks()`:
|
|
77
|
+
* - Non-markdown assets bypass depth limits (always bundled unless pattern-excluded)
|
|
78
|
+
* - Markdown links are subject to depth limits and exclude rules
|
|
79
|
+
* - Circular references are handled via a visited set
|
|
80
|
+
* - Glob matching uses forward-slash paths relative to projectRoot
|
|
81
|
+
*
|
|
82
|
+
* @param skillResourceId - The resource ID of the skill's SKILL.md in the registry
|
|
83
|
+
* @param registry - A walkable registry with pre-parsed resources
|
|
84
|
+
* @param options - Walk options (depth, excludes, etc.)
|
|
85
|
+
* @returns Graph walk result with bundled resources, assets, and exclusions
|
|
86
|
+
*/
|
|
87
|
+
export declare function walkLinkGraph(skillResourceId: string, registry: WalkableRegistry, options: WalkLinkGraphOptions): LinkGraphResult;
|
|
88
|
+
//# sourceMappingURL=walk-link-graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walk-link-graph.d.ts","sourceRoot":"","sources":["../src/walk-link-graph.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAgB,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAMpF;;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,iBAAiB,GAAG,iBAAiB,GAAG,SAAS,CAAC;IAC9H,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;AAMD;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAAC;IAC1D,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAAC;CAC7D;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,uDAAuD;IACvD,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;IACrC,oEAAoE;IACpE,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,iEAAiE;IACjE,kBAAkB,EAAE,cAAc,EAAE,CAAC;IACrC,8CAA8C;IAC9C,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,mEAAmE;IACnE,QAAQ,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,iEAAiE;IACjE,WAAW,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAyLD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAC3B,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,oBAAoB,GAC5B,eAAe,CA0CjB"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure link graph walker that operates on ResourceRegistry data.
|
|
3
|
+
*
|
|
4
|
+
* Replaces the I/O-heavy `collectLinks()` with a pure function that walks
|
|
5
|
+
* the link graph using pre-parsed data from a ResourceRegistry. This eliminates
|
|
6
|
+
* per-file `parseMarkdown()` calls and `existsSync()` checks for markdown files.
|
|
7
|
+
*
|
|
8
|
+
* Non-markdown assets (images, JSON, etc.) won't be in the registry and still
|
|
9
|
+
* require `existsSync()` checks — this is acceptable since the goal is eliminating
|
|
10
|
+
* redundant I/O for markdown files that are already parsed.
|
|
11
|
+
*/
|
|
12
|
+
import { existsSync, statSync } from 'node:fs';
|
|
13
|
+
import { basename, dirname, relative, resolve } from 'node:path';
|
|
14
|
+
import { toForwardSlash } from '@vibe-agent-toolkit/utils';
|
|
15
|
+
import picomatch from 'picomatch';
|
|
16
|
+
import { NAVIGATION_FILE_PATTERNS } from './validators/validation-rules.js';
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// Internal Helpers
|
|
19
|
+
// ============================================================================
|
|
20
|
+
/** Resolve a link's href to an absolute file path, stripping any anchor */
|
|
21
|
+
function resolveHrefToPath(href, sourceFilePath) {
|
|
22
|
+
const anchorIndex = href.indexOf('#');
|
|
23
|
+
const hrefWithoutAnchor = anchorIndex === -1 ? href : href.slice(0, anchorIndex);
|
|
24
|
+
return resolve(dirname(sourceFilePath), hrefWithoutAnchor);
|
|
25
|
+
}
|
|
26
|
+
/** Check if a link targets a file outside the project boundary */
|
|
27
|
+
function isOutsideProject(targetPath, projectRoot) {
|
|
28
|
+
return relative(projectRoot, targetPath).startsWith('..');
|
|
29
|
+
}
|
|
30
|
+
/** Check if a filename is a navigation file */
|
|
31
|
+
function isNavigationFile(filename) {
|
|
32
|
+
return NAVIGATION_FILE_PATTERNS.includes(filename);
|
|
33
|
+
}
|
|
34
|
+
/** Create an exclusion record */
|
|
35
|
+
function makeExclusion(targetPath, reason, link, matchedRule) {
|
|
36
|
+
return {
|
|
37
|
+
path: targetPath,
|
|
38
|
+
bundled: false,
|
|
39
|
+
excludeReason: reason,
|
|
40
|
+
...(matchedRule ? { matchedRule } : {}),
|
|
41
|
+
linkText: link.text,
|
|
42
|
+
linkHref: link.href,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Check if a target path should be excluded for structural reasons
|
|
47
|
+
* (directory, outside project, navigation file, or pattern match).
|
|
48
|
+
*
|
|
49
|
+
* @returns true if the link was excluded (caller should skip to next link)
|
|
50
|
+
*/
|
|
51
|
+
function checkExclusions(targetPath, link, options, excludeMatchers, excludedReferences) {
|
|
52
|
+
// Check if target is a directory
|
|
53
|
+
try {
|
|
54
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- Path from parsed markdown
|
|
55
|
+
if (existsSync(targetPath) && statSync(targetPath).isDirectory()) {
|
|
56
|
+
excludedReferences.push(makeExclusion(targetPath, 'directory-target', link));
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// statSync failure = skip
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
// Check project boundary
|
|
65
|
+
if (isOutsideProject(targetPath, options.projectRoot)) {
|
|
66
|
+
excludedReferences.push(makeExclusion(targetPath, 'outside-project', link));
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
// Check navigation file exclusion
|
|
70
|
+
if (options.excludeNavigationFiles && isNavigationFile(basename(targetPath))) {
|
|
71
|
+
excludedReferences.push(makeExclusion(targetPath, 'navigation-file', link));
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
// Check exclude patterns (relative to projectRoot)
|
|
75
|
+
const relativePath = toForwardSlash(relative(options.projectRoot, targetPath));
|
|
76
|
+
const matchedExclude = excludeMatchers.find((m) => m.isMatch(relativePath));
|
|
77
|
+
if (matchedExclude) {
|
|
78
|
+
excludedReferences.push(makeExclusion(targetPath, 'pattern-matched', link, matchedExclude.rule));
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Process a single local_file link during the graph walk.
|
|
85
|
+
*
|
|
86
|
+
* Checks exclusions, resolves the target in the registry, and either
|
|
87
|
+
* bundles it (if markdown), records it as an asset, or excludes it.
|
|
88
|
+
*/
|
|
89
|
+
function processLink(link, currentResource, currentDepth, registry, options, excludeMatchers, state) {
|
|
90
|
+
// Resolve the target path from the link href
|
|
91
|
+
const targetPath = resolveHrefToPath(link.href, currentResource.filePath);
|
|
92
|
+
const hrefWithoutAnchor = link.href.split('#')[0] ?? link.href;
|
|
93
|
+
// Skip empty hrefs (pure anchor links that slipped through type classification)
|
|
94
|
+
if (hrefWithoutAnchor === '') {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
// Check structural exclusions (directory, boundary, navigation, pattern)
|
|
98
|
+
if (checkExclusions(targetPath, link, options, excludeMatchers, state.excludedReferences)) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
// Try to find the target in the registry (markdown files)
|
|
102
|
+
const targetResource = link.resolvedId
|
|
103
|
+
? registry.getResourceById(link.resolvedId)
|
|
104
|
+
: registry.getResource(targetPath);
|
|
105
|
+
if (targetResource) {
|
|
106
|
+
processRegistryResource(targetResource, targetPath, link, currentDepth, options, state);
|
|
107
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- Path from parsed markdown
|
|
108
|
+
}
|
|
109
|
+
else if (existsSync(targetPath)) {
|
|
110
|
+
// Not in registry — non-markdown asset that exists on disk
|
|
111
|
+
state.bundledAssetSet.add(toForwardSlash(targetPath));
|
|
112
|
+
}
|
|
113
|
+
// If file doesn't exist and not in registry, silently skip (same as old collectLinks)
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Process a registry resource link: check depth, cycle, and either bundle or exclude.
|
|
117
|
+
*/
|
|
118
|
+
function processRegistryResource(targetResource, targetPath, link, currentDepth, options, state) {
|
|
119
|
+
// Check depth limit
|
|
120
|
+
if (currentDepth >= options.maxDepth) {
|
|
121
|
+
state.excludedReferences.push(makeExclusion(targetPath, 'depth-exceeded', link));
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
// Check if already visited (cycle prevention)
|
|
125
|
+
if (state.visitedResourceIds.has(targetResource.id)) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
// Bundle and recurse
|
|
129
|
+
state.visitedResourceIds.add(targetResource.id);
|
|
130
|
+
state.bundledResourceMap.set(targetResource.id, targetResource);
|
|
131
|
+
state.maxBundledDepth = Math.max(state.maxBundledDepth, currentDepth + 1);
|
|
132
|
+
state.queue.push([targetResource, currentDepth + 1]);
|
|
133
|
+
}
|
|
134
|
+
// ============================================================================
|
|
135
|
+
// Public API
|
|
136
|
+
// ============================================================================
|
|
137
|
+
/**
|
|
138
|
+
* Walk the link graph starting from a skill resource, using pre-parsed
|
|
139
|
+
* registry data instead of per-file I/O.
|
|
140
|
+
*
|
|
141
|
+
* Semantics match the original `collectLinks()`:
|
|
142
|
+
* - Non-markdown assets bypass depth limits (always bundled unless pattern-excluded)
|
|
143
|
+
* - Markdown links are subject to depth limits and exclude rules
|
|
144
|
+
* - Circular references are handled via a visited set
|
|
145
|
+
* - Glob matching uses forward-slash paths relative to projectRoot
|
|
146
|
+
*
|
|
147
|
+
* @param skillResourceId - The resource ID of the skill's SKILL.md in the registry
|
|
148
|
+
* @param registry - A walkable registry with pre-parsed resources
|
|
149
|
+
* @param options - Walk options (depth, excludes, etc.)
|
|
150
|
+
* @returns Graph walk result with bundled resources, assets, and exclusions
|
|
151
|
+
*/
|
|
152
|
+
export function walkLinkGraph(skillResourceId, registry, options) {
|
|
153
|
+
const skillResource = registry.getResourceById(skillResourceId);
|
|
154
|
+
if (!skillResource) {
|
|
155
|
+
return { bundledResources: [], bundledAssets: [], excludedReferences: [], maxBundledDepth: 0 };
|
|
156
|
+
}
|
|
157
|
+
// Compile exclude patterns once
|
|
158
|
+
const excludeMatchers = options.excludeRules.map((rule) => ({
|
|
159
|
+
rule,
|
|
160
|
+
isMatch: picomatch(rule.patterns),
|
|
161
|
+
}));
|
|
162
|
+
// Initialize walk state
|
|
163
|
+
const state = {
|
|
164
|
+
visitedResourceIds: new Set([skillResourceId]),
|
|
165
|
+
bundledResourceMap: new Map(),
|
|
166
|
+
bundledAssetSet: new Set(),
|
|
167
|
+
excludedReferences: [],
|
|
168
|
+
maxBundledDepth: 0,
|
|
169
|
+
queue: [[skillResource, 0]],
|
|
170
|
+
};
|
|
171
|
+
while (state.queue.length > 0) {
|
|
172
|
+
const entry = state.queue.shift();
|
|
173
|
+
if (!entry) {
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
const [currentResource, currentDepth] = entry;
|
|
177
|
+
for (const link of currentResource.links) {
|
|
178
|
+
if (link.type === 'local_file') {
|
|
179
|
+
processLink(link, currentResource, currentDepth, registry, options, excludeMatchers, state);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return {
|
|
184
|
+
bundledResources: [...state.bundledResourceMap.values()],
|
|
185
|
+
bundledAssets: [...state.bundledAssetSet],
|
|
186
|
+
excludedReferences: state.excludedReferences,
|
|
187
|
+
maxBundledDepth: state.maxBundledDepth,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=walk-link-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walk-link-graph.js","sourceRoot":"","sources":["../src/walk-link-graph.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibe-agent-toolkit/agent-skills",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.15-rc.1",
|
|
4
4
|
"description": "Build, validate, and package agent skills in the Agent Skills format",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -28,9 +28,10 @@
|
|
|
28
28
|
"typecheck": "tsc --noEmit"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@vibe-agent-toolkit/agent-config": "0.1.
|
|
32
|
-
"@vibe-agent-toolkit/
|
|
33
|
-
"@vibe-agent-toolkit/
|
|
31
|
+
"@vibe-agent-toolkit/agent-config": "0.1.15-rc.1",
|
|
32
|
+
"@vibe-agent-toolkit/agent-schema": "0.1.15-rc.1",
|
|
33
|
+
"@vibe-agent-toolkit/resources": "0.1.15-rc.1",
|
|
34
|
+
"@vibe-agent-toolkit/utils": "0.1.15-rc.1",
|
|
34
35
|
"adm-zip": "^0.5.16",
|
|
35
36
|
"picomatch": "^4.0.3",
|
|
36
37
|
"yaml": "^2.6.1",
|