@vibe-agent-toolkit/resources 0.1.34 → 0.1.36
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/dist/frontmatter-link-validator.d.ts +42 -0
- package/dist/frontmatter-link-validator.d.ts.map +1 -0
- package/dist/frontmatter-link-validator.js +86 -0
- package/dist/frontmatter-link-validator.js.map +1 -0
- package/dist/link-parser.d.ts +21 -1
- package/dist/link-parser.d.ts.map +1 -1
- package/dist/link-parser.js +6 -2
- package/dist/link-parser.js.map +1 -1
- package/dist/resource-registry.d.ts +6 -0
- package/dist/resource-registry.d.ts.map +1 -1
- package/dist/resource-registry.js +44 -10
- package/dist/resource-registry.js.map +1 -1
- package/dist/schema-uri-walker.d.ts +39 -0
- package/dist/schema-uri-walker.d.ts.map +1 -0
- package/dist/schema-uri-walker.js +154 -0
- package/dist/schema-uri-walker.js.map +1 -0
- package/dist/schemas/project-config.d.ts +157 -25
- package/dist/schemas/project-config.d.ts.map +1 -1
- package/dist/schemas/project-config.js +19 -0
- package/dist/schemas/project-config.js.map +1 -1
- package/dist/types.d.ts +3 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -1
- package/dist/utils.d.ts +21 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +55 -0
- package/dist/utils.js.map +1 -1
- package/package.json +5 -3
- package/src/frontmatter-link-validator.ts +112 -0
- package/src/link-parser.ts +6 -2
- package/src/resource-registry.ts +77 -13
- package/src/schema-uri-walker.ts +222 -0
- package/src/schemas/project-config.ts +20 -0
- package/src/types.ts +8 -0
- package/src/utils.ts +54 -0
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
import { ValidationConfigSchema } from '@vibe-agent-toolkit/agent-schema';
|
|
2
2
|
import { z } from 'zod';
|
|
3
|
+
/**
|
|
4
|
+
* Official semver regex from https://semver.org/ (anchored).
|
|
5
|
+
*
|
|
6
|
+
* Used as the JSON-Schema-friendly source of truth for plugin version
|
|
7
|
+
* validation. A `.refine()` over `semver.valid()` would not survive
|
|
8
|
+
* `zod-to-json-schema` export — external consumers validating against the
|
|
9
|
+
* exported JSON Schema would silently accept invalid versions. A `.regex()`
|
|
10
|
+
* round-trips into JSON Schema as `pattern`, preserving the constraint.
|
|
11
|
+
*/
|
|
12
|
+
// eslint-disable-next-line security/detect-unsafe-regex, sonarjs/regex-complexity -- Official semver regex from https://semver.org/; not user-controlled input.
|
|
13
|
+
const SEMVER_REGEX = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/;
|
|
3
14
|
// Re-export for downstream consumers (unicorn/prefer-export-from satisfied by the import above)
|
|
4
15
|
export { ValidationConfigSchema } from '@vibe-agent-toolkit/agent-schema';
|
|
5
16
|
/**
|
|
@@ -41,6 +52,8 @@ export const CollectionValidationSchema = z.object({
|
|
|
41
52
|
.describe('Whether to validate external URL links (default: false)'),
|
|
42
53
|
checkGitIgnored: z.boolean().optional()
|
|
43
54
|
.describe('Whether to check if non-ignored files link to git-ignored files (default: true)'),
|
|
55
|
+
checkFrontmatterLinks: z.boolean().optional()
|
|
56
|
+
.describe('Whether to validate frontmatter values at JSON Schema positions with a URI-family format (default: true). Set to false to disable for this collection.'),
|
|
44
57
|
externalUrls: ExternalUrlValidationSchema.optional()
|
|
45
58
|
.describe('External URL validation configuration'),
|
|
46
59
|
}).describe('Validation configuration for a collection');
|
|
@@ -152,6 +165,12 @@ export const ClaudeMarketplacePluginEntrySchema = z.object({
|
|
|
152
165
|
.describe('Path to plugin directory (default: plugins/<name>)'),
|
|
153
166
|
files: z.array(SkillFileEntrySchema).optional()
|
|
154
167
|
.describe('Explicit source→dest file mappings for compiled artifacts outside the plugin directory'),
|
|
168
|
+
version: z.string().regex(SEMVER_REGEX, {
|
|
169
|
+
message: 'version must be a valid semver string (e.g., "1.2.3" or "1.0.0-rc.1")',
|
|
170
|
+
}).optional()
|
|
171
|
+
.describe('Per-plugin semver version (overrides root package.json:version for this plugin)'),
|
|
172
|
+
changelog: z.string().optional()
|
|
173
|
+
.describe('Path to per-plugin CHANGELOG (relative to plugin source dir; default: <source>/CHANGELOG.md if it exists)'),
|
|
155
174
|
}).strict().describe('Plugin entry within a marketplace configuration');
|
|
156
175
|
/**
|
|
157
176
|
* Publish configuration for a Claude marketplace.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-config.js","sourceRoot":"","sources":["../../src/schemas/project-config.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"project-config.js","sourceRoot":"","sources":["../../src/schemas/project-config.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -25,6 +25,9 @@ export { isGlobPattern, expandPattern, expandPatterns, } from './pattern-expande
|
|
|
25
25
|
export { matchesCollection, getCollectionsForFile, } from './collection-matcher.js';
|
|
26
26
|
export type { ValidateLinkOptions } from './link-validator.js';
|
|
27
27
|
export { validateLink } from './link-validator.js';
|
|
28
|
+
export { classifyLink } from './link-parser.js';
|
|
28
29
|
export { addCLISchema, addCollectionSchema, assignSchemas, } from './schema-assignment.js';
|
|
29
30
|
export { getAllSchemaErrors, hasSchemaErrors, validateFrontmatterMultiSchema, } from './multi-schema-validator.js';
|
|
31
|
+
export type { FrontmatterExternalUrl, FrontmatterLinkValidationResult, } from './frontmatter-link-validator.js';
|
|
32
|
+
export { validateFrontmatterLinks } from './frontmatter-link-validator.js';
|
|
30
33
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,YAAY,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGrD,YAAY,EACV,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,gBAAgB,GACjB,MAAM,gCAAgC,CAAC;AAGxC,YAAY,EACV,eAAe,EACf,gBAAgB,GACjB,MAAM,gCAAgC,CAAC;AAGxC,YAAY,EACV,YAAY,EACZ,uBAAuB,EACvB,eAAe,EACf,aAAa,EACb,cAAc,EACd,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,YAAY,EACZ,YAAY,GACb,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,YAAY,EACZ,OAAO,EACP,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,QAAQ,EACR,eAAe,EACf,YAAY,GACb,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AAGpC,YAAY,EACV,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,YAAY,EACZ,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EACL,cAAc,EACd,eAAe,EACf,UAAU,GACX,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,aAAa,EACb,aAAa,EACb,cAAc,GACf,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AAGjC,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,YAAY,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGrD,YAAY,EACV,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,gBAAgB,GACjB,MAAM,gCAAgC,CAAC;AAGxC,YAAY,EACV,eAAe,EACf,gBAAgB,GACjB,MAAM,gCAAgC,CAAC;AAGxC,YAAY,EACV,YAAY,EACZ,uBAAuB,EACvB,eAAe,EACf,aAAa,EACb,cAAc,EACd,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,YAAY,EACZ,YAAY,GACb,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,YAAY,EACZ,OAAO,EACP,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EAChB,QAAQ,EACR,eAAe,EACf,YAAY,GACb,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AAGpC,YAAY,EACV,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,YAAY,EACZ,YAAY,EACZ,uBAAuB,EACvB,4BAA4B,GAC7B,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EACL,cAAc,EACd,eAAe,EACf,UAAU,GACX,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EACL,aAAa,EACb,aAAa,EACb,cAAc,GACf,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AAGjC,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGhD,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,aAAa,GACd,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,8BAA8B,GAC/B,MAAM,6BAA6B,CAAC;AAGrC,YAAY,EACV,sBAAsB,EACtB,+BAA+B,GAChC,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC"}
|
package/dist/types.js
CHANGED
|
@@ -24,8 +24,10 @@ export { isGlobPattern, expandPattern, expandPatterns, } from './pattern-expande
|
|
|
24
24
|
// Collection matching
|
|
25
25
|
export { matchesCollection, getCollectionsForFile, } from './collection-matcher.js';
|
|
26
26
|
export { validateLink } from './link-validator.js';
|
|
27
|
+
export { classifyLink } from './link-parser.js';
|
|
27
28
|
// Schema assignment
|
|
28
29
|
export { addCLISchema, addCollectionSchema, assignSchemas, } from './schema-assignment.js';
|
|
29
30
|
// Multi-schema validation
|
|
30
31
|
export { getAllSchemaErrors, hasSchemaErrors, validateFrontmatterMultiSchema, } from './multi-schema-validator.js';
|
|
32
|
+
export { validateFrontmatterLinks } from './frontmatter-link-validator.js';
|
|
31
33
|
//# sourceMappingURL=types.js.map
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AA2BrD,uBAAuB;AACvB,OAAO,EACL,YAAY,EACZ,YAAY,GACb,MAAM,sBAAsB,CAAC;AAY9B,0BAA0B;AAC1B,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,gCAAgC,CAAC;AAExC,mBAAmB;AACnB,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AAiBpC,iBAAiB;AACjB,OAAO,EACL,cAAc,EACd,eAAe,EACf,UAAU,GACX,MAAM,oBAAoB,CAAC;AAE5B,oBAAoB;AACpB,OAAO,EACL,aAAa,EACb,aAAa,EACb,cAAc,GACf,MAAM,uBAAuB,CAAC;AAE/B,sBAAsB;AACtB,OAAO,EACL,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AAIjC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AA2BrD,uBAAuB;AACvB,OAAO,EACL,YAAY,EACZ,YAAY,GACb,MAAM,sBAAsB,CAAC;AAY9B,0BAA0B;AAC1B,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,gCAAgC,CAAC;AAExC,mBAAmB;AACnB,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AAiBpC,iBAAiB;AACjB,OAAO,EACL,cAAc,EACd,eAAe,EACf,UAAU,GACX,MAAM,oBAAoB,CAAC;AAE5B,oBAAoB;AACpB,OAAO,EACL,aAAa,EACb,aAAa,EACb,cAAc,GACf,MAAM,uBAAuB,CAAC;AAE/B,sBAAsB;AACtB,OAAO,EACL,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,yBAAyB,CAAC;AAIjC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,oBAAoB;AACpB,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,aAAa,GACd,MAAM,wBAAwB,CAAC;AAEhC,0BAA0B;AAC1B,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,8BAA8B,GAC/B,MAAM,6BAA6B,CAAC;AAOrC,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC"}
|
package/dist/utils.d.ts
CHANGED
|
@@ -79,4 +79,25 @@ export declare function resolveLocalHref(href: string, sourceFilePath: string):
|
|
|
79
79
|
* ```
|
|
80
80
|
*/
|
|
81
81
|
export declare function isWithinProject(filePath: string, projectRoot: string): boolean;
|
|
82
|
+
/**
|
|
83
|
+
* Escape a property name as a JSON Pointer segment per RFC 6901:
|
|
84
|
+
* `~` -> `~0`, `/` -> `~1`. Order matters (escape `~` first).
|
|
85
|
+
*/
|
|
86
|
+
export declare function encodeJsonPointerSegment(name: string): string;
|
|
87
|
+
/**
|
|
88
|
+
* Reverse RFC 6901 escapes: `~1` -> `/`, `~0` -> `~`. Order matters
|
|
89
|
+
* (unescape `~1` first).
|
|
90
|
+
*/
|
|
91
|
+
export declare function decodeJsonPointerSegment(segment: string): string;
|
|
92
|
+
/**
|
|
93
|
+
* Format a JSON Pointer (RFC 6901) as developer-friendly dotted notation.
|
|
94
|
+
*
|
|
95
|
+
* Numeric segments become bracketed array indices (`0` → `[0]`); non-numeric
|
|
96
|
+
* segments are dot-joined. Reverses RFC 6901 escapes inside segments.
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* formatJsonPointerAsDotted('/adr-citations/0/adr') // 'adr-citations[0].adr'
|
|
100
|
+
* formatJsonPointerAsDotted('') // ''
|
|
101
|
+
*/
|
|
102
|
+
export declare function formatJsonPointerAsDotted(pointer: string): string;
|
|
82
103
|
//# sourceMappingURL=utils.d.ts.map
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAoB7E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAS1E;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,GACrB;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG,IAAI,CAiB7D;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAqB9E"}
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAoB7E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAS1E;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,GACrB;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG,IAAI,CAiB7D;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAqB9E;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAcjE"}
|
package/dist/utils.js
CHANGED
|
@@ -139,4 +139,59 @@ export function isWithinProject(filePath, projectRoot) {
|
|
|
139
139
|
// /project-other starting with /project
|
|
140
140
|
return normalizedFile.startsWith(normalizedRoot + '/') || normalizedFile === normalizedRoot;
|
|
141
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* Escape a property name as a JSON Pointer segment per RFC 6901:
|
|
144
|
+
* `~` -> `~0`, `/` -> `~1`. Order matters (escape `~` first).
|
|
145
|
+
*/
|
|
146
|
+
export function encodeJsonPointerSegment(name) {
|
|
147
|
+
return name.replaceAll('~', '~0').replaceAll('/', '~1');
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Reverse RFC 6901 escapes: `~1` -> `/`, `~0` -> `~`. Order matters
|
|
151
|
+
* (unescape `~1` first).
|
|
152
|
+
*/
|
|
153
|
+
export function decodeJsonPointerSegment(segment) {
|
|
154
|
+
return segment.replaceAll('~1', '/').replaceAll('~0', '~');
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Format a JSON Pointer (RFC 6901) as developer-friendly dotted notation.
|
|
158
|
+
*
|
|
159
|
+
* Numeric segments become bracketed array indices (`0` → `[0]`); non-numeric
|
|
160
|
+
* segments are dot-joined. Reverses RFC 6901 escapes inside segments.
|
|
161
|
+
*
|
|
162
|
+
* @example
|
|
163
|
+
* formatJsonPointerAsDotted('/adr-citations/0/adr') // 'adr-citations[0].adr'
|
|
164
|
+
* formatJsonPointerAsDotted('') // ''
|
|
165
|
+
*/
|
|
166
|
+
export function formatJsonPointerAsDotted(pointer) {
|
|
167
|
+
if (pointer === '')
|
|
168
|
+
return '';
|
|
169
|
+
// eslint-disable-next-line local/no-hardcoded-path-split -- JSON Pointer RFC 6901 delimiter, not a file path
|
|
170
|
+
const segments = pointer.slice(1).split('/').map(decodeJsonPointerSegment);
|
|
171
|
+
let out = '';
|
|
172
|
+
for (const seg of segments) {
|
|
173
|
+
if (isCanonicalArrayIndex(seg)) {
|
|
174
|
+
out += `[${seg}]`;
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
out += out === '' ? seg : `.${seg}`;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return out;
|
|
181
|
+
}
|
|
182
|
+
function isCanonicalArrayIndex(s) {
|
|
183
|
+
// Canonical integer per RFC 6901 §4 + JSON canonical form: no leading zeros
|
|
184
|
+
// except for "0" itself.
|
|
185
|
+
if (s === '')
|
|
186
|
+
return false;
|
|
187
|
+
if (s === '0')
|
|
188
|
+
return true;
|
|
189
|
+
if (s.startsWith('0'))
|
|
190
|
+
return false;
|
|
191
|
+
for (const ch of s) {
|
|
192
|
+
if (ch < '0' || ch > '9')
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
return true;
|
|
196
|
+
}
|
|
142
197
|
//# sourceMappingURL=utils.js.map
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibe-agent-toolkit/resources",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.36",
|
|
4
4
|
"description": "Markdown resource parsing, validation, and link integrity checking",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -33,8 +33,8 @@
|
|
|
33
33
|
"author": "Jeff Dutton",
|
|
34
34
|
"license": "MIT",
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@vibe-agent-toolkit/agent-schema": "0.1.
|
|
37
|
-
"@vibe-agent-toolkit/utils": "0.1.
|
|
36
|
+
"@vibe-agent-toolkit/agent-schema": "0.1.36",
|
|
37
|
+
"@vibe-agent-toolkit/utils": "0.1.36",
|
|
38
38
|
"ajv": "^8.17.1",
|
|
39
39
|
"github-slugger": "^2.0.0",
|
|
40
40
|
"js-yaml": "^4.1.1",
|
|
@@ -43,6 +43,7 @@
|
|
|
43
43
|
"remark-frontmatter": "^5.0.0",
|
|
44
44
|
"remark-gfm": "^4.0.0",
|
|
45
45
|
"remark-parse": "^11.0.0",
|
|
46
|
+
"semver": "^7.7.3",
|
|
46
47
|
"unified": "^11.0.5",
|
|
47
48
|
"unist-util-visit": "^5.0.0",
|
|
48
49
|
"zod": "^3.24.1"
|
|
@@ -52,6 +53,7 @@
|
|
|
52
53
|
"@types/mdast": "^4.0.4",
|
|
53
54
|
"@types/node": "^22.10.5",
|
|
54
55
|
"@types/picomatch": "^4.0.2",
|
|
56
|
+
"@types/semver": "^7.7.1",
|
|
55
57
|
"rimraf": "^6.0.1",
|
|
56
58
|
"typescript": "^5.7.3",
|
|
57
59
|
"vitest": "^2.1.8"
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Frontmatter URI-reference link validation.
|
|
3
|
+
*
|
|
4
|
+
* For every value in `frontmatter` sitting at a JSON Schema position with a
|
|
5
|
+
* URI-family `format`, classify the value and run local-file references
|
|
6
|
+
* through the existing `validateLink` engine. Returns issues with
|
|
7
|
+
* frontmatter-specific type codes plus a list of external URLs the registry
|
|
8
|
+
* can fold into its existing external URL collection.
|
|
9
|
+
*
|
|
10
|
+
* Type mapping:
|
|
11
|
+
* broken_file -> frontmatter_link_broken
|
|
12
|
+
* broken_anchor -> frontmatter_anchor_missing
|
|
13
|
+
* link_to_gitignored -> frontmatter_link_to_gitignored
|
|
14
|
+
* unknown_link -> frontmatter_unknown_link
|
|
15
|
+
*
|
|
16
|
+
* Skipped (no issue, no external):
|
|
17
|
+
* email (mailto:)
|
|
18
|
+
* anchor-only (validated as anchor in current file via validateLink)
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { classifyLink } from './link-parser.js';
|
|
22
|
+
import { validateLink, type ValidateLinkOptions } from './link-validator.js';
|
|
23
|
+
import { walkFrontmatterUriReferences } from './schema-uri-walker.js';
|
|
24
|
+
import type { HeadingNode, ResourceLink, ValidationIssue } from './types.js';
|
|
25
|
+
|
|
26
|
+
/** A frontmatter-sourced external URL captured for downstream health checking. */
|
|
27
|
+
export interface FrontmatterExternalUrl {
|
|
28
|
+
url: string;
|
|
29
|
+
sourcePath: string;
|
|
30
|
+
dottedPath: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface FrontmatterLinkValidationResult {
|
|
34
|
+
issues: ValidationIssue[];
|
|
35
|
+
externalUrls: FrontmatterExternalUrl[];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Validate every URI-family frontmatter value against the file system.
|
|
40
|
+
*
|
|
41
|
+
* @param frontmatter - Parsed frontmatter (or undefined)
|
|
42
|
+
* @param schema - JSON Schema for the collection
|
|
43
|
+
* @param sourceFilePath - Absolute path to the source file
|
|
44
|
+
* @param headingsByFile - Heading trees (for anchor validation)
|
|
45
|
+
* @param options - Same shape as validateLink (projectRoot, gitTracker, ...)
|
|
46
|
+
*/
|
|
47
|
+
export async function validateFrontmatterLinks(
|
|
48
|
+
frontmatter: Record<string, unknown> | undefined,
|
|
49
|
+
schema: object,
|
|
50
|
+
sourceFilePath: string,
|
|
51
|
+
headingsByFile: Map<string, HeadingNode[]>,
|
|
52
|
+
options?: ValidateLinkOptions,
|
|
53
|
+
): Promise<FrontmatterLinkValidationResult> {
|
|
54
|
+
if (!frontmatter) return { issues: [], externalUrls: [] };
|
|
55
|
+
|
|
56
|
+
const captures = walkFrontmatterUriReferences(frontmatter, schema);
|
|
57
|
+
if (captures.length === 0) return { issues: [], externalUrls: [] };
|
|
58
|
+
|
|
59
|
+
const issues: ValidationIssue[] = [];
|
|
60
|
+
const externalUrls: FrontmatterExternalUrl[] = [];
|
|
61
|
+
|
|
62
|
+
for (const capture of captures) {
|
|
63
|
+
const linkType = classifyLink(capture.value);
|
|
64
|
+
|
|
65
|
+
if (linkType === 'external') {
|
|
66
|
+
externalUrls.push({
|
|
67
|
+
url: capture.value,
|
|
68
|
+
sourcePath: sourceFilePath,
|
|
69
|
+
dottedPath: capture.dottedPath,
|
|
70
|
+
});
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (linkType === 'email') continue;
|
|
74
|
+
|
|
75
|
+
const syntheticLink: ResourceLink = {
|
|
76
|
+
text: capture.dottedPath,
|
|
77
|
+
href: capture.value,
|
|
78
|
+
type: linkType,
|
|
79
|
+
line: 1, // Frontmatter per-field line numbers are post-v1.
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const issue = await validateLink(syntheticLink, sourceFilePath, headingsByFile, options);
|
|
83
|
+
if (!issue) continue;
|
|
84
|
+
|
|
85
|
+
issues.push(rewriteIssue(issue, capture.dottedPath));
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return { issues, externalUrls };
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function rewriteIssue(issue: ValidationIssue, dottedPath: string): ValidationIssue {
|
|
92
|
+
return {
|
|
93
|
+
...issue,
|
|
94
|
+
type: mapType(issue.type),
|
|
95
|
+
message: `field \`${dottedPath}\`: ${issue.message}`,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function mapType(originalType: string): string {
|
|
100
|
+
switch (originalType) {
|
|
101
|
+
case 'broken_file':
|
|
102
|
+
return 'frontmatter_link_broken';
|
|
103
|
+
case 'broken_anchor':
|
|
104
|
+
return 'frontmatter_anchor_missing';
|
|
105
|
+
case 'link_to_gitignored':
|
|
106
|
+
return 'frontmatter_link_to_gitignored';
|
|
107
|
+
case 'unknown_link':
|
|
108
|
+
return 'frontmatter_unknown_link';
|
|
109
|
+
default:
|
|
110
|
+
return originalType;
|
|
111
|
+
}
|
|
112
|
+
}
|
package/src/link-parser.ts
CHANGED
|
@@ -169,7 +169,11 @@ function extractLinkText(node: Link | LinkReference): string {
|
|
|
169
169
|
}
|
|
170
170
|
|
|
171
171
|
/**
|
|
172
|
-
* Classify a link based on its href.
|
|
172
|
+
* Classify a link based on its href shape.
|
|
173
|
+
*
|
|
174
|
+
* Public so frontmatter-link validation can reuse identical URI classification
|
|
175
|
+
* logic (markdown links and frontmatter URI-reference values share one
|
|
176
|
+
* classifier).
|
|
173
177
|
*
|
|
174
178
|
* @param href - The href attribute from the link
|
|
175
179
|
* @returns Classified link type
|
|
@@ -183,7 +187,7 @@ function extractLinkText(node: Link | LinkReference): string {
|
|
|
183
187
|
* classifyLink('./file.md#anchor') // 'local_file'
|
|
184
188
|
* ```
|
|
185
189
|
*/
|
|
186
|
-
function classifyLink(href: string): LinkType {
|
|
190
|
+
export function classifyLink(href: string): LinkType {
|
|
187
191
|
if (href.startsWith('http://') || href.startsWith('https://')) {
|
|
188
192
|
return 'external';
|
|
189
193
|
}
|
package/src/resource-registry.ts
CHANGED
|
@@ -11,14 +11,18 @@
|
|
|
11
11
|
import type fs from 'node:fs/promises';
|
|
12
12
|
import path from 'node:path';
|
|
13
13
|
|
|
14
|
-
import { crawlDirectory, type CrawlOptions as UtilsCrawlOptions, type GitTracker, normalizedTmpdir,
|
|
14
|
+
import { crawlDirectory, type CrawlOptions as UtilsCrawlOptions, type GitTracker, normalizedTmpdir, resolveAssetReference, safePath, toForwardSlash } from '@vibe-agent-toolkit/utils';
|
|
15
15
|
|
|
16
16
|
import { calculateChecksum } from './checksum.js';
|
|
17
17
|
import { getCollectionsForFile } from './collection-matcher.js';
|
|
18
18
|
import { ExternalLinkValidator } from './external-link-validator.js';
|
|
19
|
+
import {
|
|
20
|
+
validateFrontmatterLinks,
|
|
21
|
+
type FrontmatterExternalUrl,
|
|
22
|
+
} from './frontmatter-link-validator.js';
|
|
19
23
|
import { validateFrontmatter } from './frontmatter-validator.js';
|
|
20
24
|
import { parseMarkdown } from './link-parser.js';
|
|
21
|
-
import { validateLink } from './link-validator.js';
|
|
25
|
+
import { validateLink, type ValidateLinkOptions } from './link-validator.js';
|
|
22
26
|
import type { ResourceCollectionInterface } from './resource-collection-interface.js';
|
|
23
27
|
import type { SHA256 } from './schemas/checksum.js';
|
|
24
28
|
import type { ProjectConfig } from './schemas/project-config.js';
|
|
@@ -150,6 +154,13 @@ export class ResourceRegistry implements ResourceCollectionInterface {
|
|
|
150
154
|
private readonly resourcesByName: Map<string, ResourceMetadata[]> = new Map();
|
|
151
155
|
private readonly resourcesByChecksum: Map<SHA256, ResourceMetadata[]> = new Map();
|
|
152
156
|
|
|
157
|
+
/**
|
|
158
|
+
* Frontmatter-sourced external URLs keyed by resource absolute path.
|
|
159
|
+
* Populated during collection-schema validation; consumed by
|
|
160
|
+
* collectExternalUrls so the URLs feed into the existing health-check pass.
|
|
161
|
+
*/
|
|
162
|
+
private readonly frontmatterExternalUrlsByResource: Map<string, FrontmatterExternalUrl[]> = new Map();
|
|
163
|
+
|
|
153
164
|
constructor(options?: ResourceRegistryOptions) {
|
|
154
165
|
if (options?.baseDir !== undefined) {
|
|
155
166
|
this.baseDir = options.baseDir;
|
|
@@ -479,7 +490,10 @@ export class ResourceRegistry implements ResourceCollectionInterface {
|
|
|
479
490
|
* Validate frontmatter against per-collection schemas.
|
|
480
491
|
* @private
|
|
481
492
|
*/
|
|
482
|
-
private async validateCollectionFrontmatter(
|
|
493
|
+
private async validateCollectionFrontmatter(
|
|
494
|
+
headingsByFile: Map<string, HeadingNode[]>,
|
|
495
|
+
skipGitIgnoreCheck: boolean,
|
|
496
|
+
): Promise<ValidationIssue[]> {
|
|
483
497
|
const issues: ValidationIssue[] = [];
|
|
484
498
|
|
|
485
499
|
// Skip if no config
|
|
@@ -498,7 +512,9 @@ export class ResourceRegistry implements ResourceCollectionInterface {
|
|
|
498
512
|
// Validate against each collection's schema
|
|
499
513
|
const collectionIssues = await this.validateResourceCollectionSchemas(
|
|
500
514
|
resource,
|
|
501
|
-
fsPromises
|
|
515
|
+
fsPromises,
|
|
516
|
+
headingsByFile,
|
|
517
|
+
skipGitIgnoreCheck,
|
|
502
518
|
);
|
|
503
519
|
issues.push(...collectionIssues);
|
|
504
520
|
}
|
|
@@ -512,7 +528,9 @@ export class ResourceRegistry implements ResourceCollectionInterface {
|
|
|
512
528
|
*/
|
|
513
529
|
private async validateResourceCollectionSchemas(
|
|
514
530
|
resource: ResourceMetadata,
|
|
515
|
-
fsModule: typeof fs
|
|
531
|
+
fsModule: typeof fs,
|
|
532
|
+
headingsByFile: Map<string, HeadingNode[]>,
|
|
533
|
+
skipGitIgnoreCheck: boolean,
|
|
516
534
|
): Promise<ValidationIssue[]> {
|
|
517
535
|
const issues: ValidationIssue[] = [];
|
|
518
536
|
|
|
@@ -531,7 +549,9 @@ export class ResourceRegistry implements ResourceCollectionInterface {
|
|
|
531
549
|
const collectionIssues = await this.validateAgainstCollectionSchema(
|
|
532
550
|
resource,
|
|
533
551
|
collection.validation,
|
|
534
|
-
fsModule
|
|
552
|
+
fsModule,
|
|
553
|
+
headingsByFile,
|
|
554
|
+
skipGitIgnoreCheck,
|
|
535
555
|
);
|
|
536
556
|
issues.push(...collectionIssues);
|
|
537
557
|
}
|
|
@@ -546,15 +566,17 @@ export class ResourceRegistry implements ResourceCollectionInterface {
|
|
|
546
566
|
private async validateAgainstCollectionSchema(
|
|
547
567
|
resource: ResourceMetadata,
|
|
548
568
|
validation: NonNullable<NonNullable<ProjectConfig['resources']>['collections']>[string]['validation'],
|
|
549
|
-
fsModule: typeof fs
|
|
569
|
+
fsModule: typeof fs,
|
|
570
|
+
headingsByFile: Map<string, HeadingNode[]>,
|
|
571
|
+
skipGitIgnoreCheck: boolean,
|
|
550
572
|
): Promise<ValidationIssue[]> {
|
|
551
573
|
if (!validation?.frontmatterSchema) {
|
|
552
574
|
return [];
|
|
553
575
|
}
|
|
554
576
|
|
|
555
|
-
const schemaPath =
|
|
577
|
+
const schemaPath = resolveAssetReference(
|
|
578
|
+
validation.frontmatterSchema,
|
|
556
579
|
this.baseDir ?? process.cwd(),
|
|
557
|
-
validation.frontmatterSchema
|
|
558
580
|
);
|
|
559
581
|
|
|
560
582
|
try {
|
|
@@ -564,14 +586,41 @@ export class ResourceRegistry implements ResourceCollectionInterface {
|
|
|
564
586
|
// Determine validation mode (default to permissive)
|
|
565
587
|
const mode = validation.mode ?? 'permissive';
|
|
566
588
|
|
|
567
|
-
// Validate frontmatter
|
|
568
|
-
|
|
589
|
+
// Validate frontmatter against JSON Schema
|
|
590
|
+
const issues = validateFrontmatter(
|
|
569
591
|
resource.frontmatter,
|
|
570
592
|
schema,
|
|
571
593
|
resource.filePath,
|
|
572
594
|
mode,
|
|
573
|
-
schemaPath
|
|
595
|
+
schemaPath,
|
|
574
596
|
);
|
|
597
|
+
|
|
598
|
+
// New: walk URI-family frontmatter values. Default-on; explicit `false` disables.
|
|
599
|
+
if (validation.checkFrontmatterLinks !== false && resource.frontmatter) {
|
|
600
|
+
const linkOptions: ValidateLinkOptions = this.baseDir === undefined
|
|
601
|
+
? { skipGitIgnoreCheck }
|
|
602
|
+
: {
|
|
603
|
+
projectRoot: this.baseDir,
|
|
604
|
+
skipGitIgnoreCheck,
|
|
605
|
+
...(this.gitTracker !== undefined && { gitTracker: this.gitTracker }),
|
|
606
|
+
};
|
|
607
|
+
|
|
608
|
+
const { issues: linkIssues, externalUrls } = await validateFrontmatterLinks(
|
|
609
|
+
resource.frontmatter,
|
|
610
|
+
schema,
|
|
611
|
+
resource.filePath,
|
|
612
|
+
headingsByFile,
|
|
613
|
+
linkOptions,
|
|
614
|
+
);
|
|
615
|
+
issues.push(...linkIssues);
|
|
616
|
+
|
|
617
|
+
if (externalUrls.length > 0) {
|
|
618
|
+
const prior = this.frontmatterExternalUrlsByResource.get(resource.filePath) ?? [];
|
|
619
|
+
this.frontmatterExternalUrlsByResource.set(resource.filePath, [...prior, ...externalUrls]);
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
return issues;
|
|
575
624
|
} catch (error) {
|
|
576
625
|
// Handle missing or invalid schema files gracefully
|
|
577
626
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
@@ -622,6 +671,9 @@ export class ResourceRegistry implements ResourceCollectionInterface {
|
|
|
622
671
|
// Build headings map for validation
|
|
623
672
|
const headingsByFile = this.buildHeadingsByFileMap();
|
|
624
673
|
|
|
674
|
+
// Reset frontmatter external URL state for this validation run
|
|
675
|
+
this.frontmatterExternalUrlsByResource.clear();
|
|
676
|
+
|
|
625
677
|
// Collect all validation issues
|
|
626
678
|
const issues: ValidationIssue[] = [];
|
|
627
679
|
|
|
@@ -636,7 +688,10 @@ export class ResourceRegistry implements ResourceCollectionInterface {
|
|
|
636
688
|
issues.push(...linkIssues);
|
|
637
689
|
|
|
638
690
|
// Per-collection frontmatter validation
|
|
639
|
-
const collectionFrontmatterIssues = await this.validateCollectionFrontmatter(
|
|
691
|
+
const collectionFrontmatterIssues = await this.validateCollectionFrontmatter(
|
|
692
|
+
headingsByFile,
|
|
693
|
+
options?.skipGitIgnoreCheck ?? false,
|
|
694
|
+
);
|
|
640
695
|
issues.push(...collectionFrontmatterIssues);
|
|
641
696
|
|
|
642
697
|
// Global frontmatter validation (if schema provided)
|
|
@@ -743,6 +798,15 @@ export class ResourceRegistry implements ResourceCollectionInterface {
|
|
|
743
798
|
}
|
|
744
799
|
}
|
|
745
800
|
|
|
801
|
+
// Merge frontmatter-sourced external URLs from collection validation
|
|
802
|
+
for (const [resourcePath, urls] of this.frontmatterExternalUrlsByResource) {
|
|
803
|
+
for (const fmUrl of urls) {
|
|
804
|
+
const locations = urlsToValidate.get(fmUrl.url) ?? [];
|
|
805
|
+
locations.push({ resourcePath });
|
|
806
|
+
urlsToValidate.set(fmUrl.url, locations);
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
|
|
746
810
|
return urlsToValidate;
|
|
747
811
|
}
|
|
748
812
|
|