@vibe-agent-toolkit/resources 0.1.2 → 0.1.4
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 +255 -17
- package/dist/collection-matcher.d.ts +63 -0
- package/dist/collection-matcher.d.ts.map +1 -0
- package/dist/collection-matcher.js +127 -0
- package/dist/collection-matcher.js.map +1 -0
- package/dist/config-parser.d.ts +63 -0
- package/dist/config-parser.d.ts.map +1 -0
- package/dist/config-parser.js +113 -0
- package/dist/config-parser.js.map +1 -0
- package/dist/frontmatter-validator.d.ts +50 -0
- package/dist/frontmatter-validator.d.ts.map +1 -0
- package/dist/frontmatter-validator.js +238 -0
- package/dist/frontmatter-validator.js.map +1 -0
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/link-parser.d.ts +2 -0
- package/dist/link-parser.d.ts.map +1 -1
- package/dist/link-parser.js +41 -0
- package/dist/link-parser.js.map +1 -1
- package/dist/link-validator.d.ts +25 -3
- package/dist/link-validator.d.ts.map +1 -1
- package/dist/link-validator.js +52 -40
- package/dist/link-validator.js.map +1 -1
- package/dist/multi-schema-validator.d.ts +42 -0
- package/dist/multi-schema-validator.d.ts.map +1 -0
- package/dist/multi-schema-validator.js +107 -0
- package/dist/multi-schema-validator.js.map +1 -0
- package/dist/pattern-expander.d.ts +63 -0
- package/dist/pattern-expander.d.ts.map +1 -0
- package/dist/pattern-expander.js +93 -0
- package/dist/pattern-expander.js.map +1 -0
- package/dist/resource-registry.d.ts +104 -8
- package/dist/resource-registry.d.ts.map +1 -1
- package/dist/resource-registry.js +230 -30
- package/dist/resource-registry.js.map +1 -1
- package/dist/schema-assignment.d.ts +49 -0
- package/dist/schema-assignment.d.ts.map +1 -0
- package/dist/schema-assignment.js +95 -0
- package/dist/schema-assignment.js.map +1 -0
- package/dist/schemas/project-config.d.ts +254 -0
- package/dist/schemas/project-config.d.ts.map +1 -0
- package/dist/schemas/project-config.js +57 -0
- package/dist/schemas/project-config.js.map +1 -0
- package/dist/schemas/resource-metadata.d.ts +10 -1
- package/dist/schemas/resource-metadata.d.ts.map +1 -1
- package/dist/schemas/resource-metadata.js +7 -1
- package/dist/schemas/resource-metadata.js.map +1 -1
- package/dist/schemas/validation-result.d.ts +9 -24
- package/dist/schemas/validation-result.d.ts.map +1 -1
- package/dist/schemas/validation-result.js +11 -18
- package/dist/schemas/validation-result.js.map +1 -1
- package/dist/types/resource-parser.d.ts +53 -0
- package/dist/types/resource-parser.d.ts.map +1 -0
- package/dist/types/resource-parser.js +233 -0
- package/dist/types/resource-parser.js.map +1 -0
- package/dist/types/resource-path-utils.d.ts +43 -0
- package/dist/types/resource-path-utils.d.ts.map +1 -0
- package/dist/types/resource-path-utils.js +89 -0
- package/dist/types/resource-path-utils.js.map +1 -0
- package/dist/types/resources.d.ts +140 -0
- package/dist/types/resources.d.ts.map +1 -0
- package/dist/types/resources.js +58 -0
- package/dist/types/resources.js.map +1 -0
- package/dist/types.d.ts +14 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +17 -0
- package/dist/types.js.map +1 -1
- package/dist/utils.d.ts +18 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +39 -0
- package/dist/utils.js.map +1 -1
- package/package.json +5 -2
- package/src/collection-matcher.ts +148 -0
- package/src/config-parser.ts +125 -0
- package/src/frontmatter-validator.ts +279 -0
- package/src/index.ts +10 -2
- package/src/link-parser.ts +50 -0
- package/src/link-validator.ts +70 -43
- package/src/multi-schema-validator.ts +128 -0
- package/src/pattern-expander.ts +100 -0
- package/src/resource-registry.ts +347 -34
- package/src/schema-assignment.ts +119 -0
- package/src/schemas/project-config.ts +71 -0
- package/src/schemas/resource-metadata.ts +7 -1
- package/src/schemas/validation-result.ts +11 -21
- package/src/types/resource-parser.ts +302 -0
- package/src/types/resource-path-utils.ts +102 -0
- package/src/types/resources.ts +211 -0
- package/src/types.ts +89 -1
- package/src/utils.ts +43 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Frontmatter validation using JSON Schema.
|
|
3
|
+
*
|
|
4
|
+
* IMPORTANT: This module uses AJV specifically for validating arbitrary
|
|
5
|
+
* user-provided JSON Schemas against frontmatter data. For all TypeScript
|
|
6
|
+
* validation and internal schemas, use Zod instead.
|
|
7
|
+
*
|
|
8
|
+
* Why AJV here?
|
|
9
|
+
* - Users provide standard JSON Schema files for frontmatter validation
|
|
10
|
+
* - AJV is the industry standard JSON Schema validator
|
|
11
|
+
* - Zod is for TypeScript type safety + runtime validation
|
|
12
|
+
*
|
|
13
|
+
* This is the ONLY place in the codebase that should use AJV.
|
|
14
|
+
*/
|
|
15
|
+
import type { ValidationMode } from './schemas/project-config.js';
|
|
16
|
+
import type { ValidationIssue } from './schemas/validation-result.js';
|
|
17
|
+
/**
|
|
18
|
+
* Validate frontmatter against a JSON Schema.
|
|
19
|
+
*
|
|
20
|
+
* Behavior:
|
|
21
|
+
* - Missing frontmatter: Error only if schema has required fields
|
|
22
|
+
* - Extra fields: Allowed by default (unless schema sets additionalProperties: false)
|
|
23
|
+
* - Type mismatches: Always reported as errors
|
|
24
|
+
* - Permissive mode: Ignores additionalProperties: false (allows schema layering)
|
|
25
|
+
*
|
|
26
|
+
* @param frontmatter - Parsed frontmatter object (or undefined if no frontmatter)
|
|
27
|
+
* @param schema - JSON Schema object
|
|
28
|
+
* @param resourcePath - File path for error reporting
|
|
29
|
+
* @param mode - Validation mode: 'strict' (default) or 'permissive'
|
|
30
|
+
* @param schemaPath - Path to schema file (for error context)
|
|
31
|
+
* @returns Array of validation issues (empty if valid)
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```typescript
|
|
35
|
+
* const schema = {
|
|
36
|
+
* type: 'object',
|
|
37
|
+
* required: ['title'],
|
|
38
|
+
* properties: { title: { type: 'string' } }
|
|
39
|
+
* };
|
|
40
|
+
* const issues = validateFrontmatter(
|
|
41
|
+
* frontmatter,
|
|
42
|
+
* schema,
|
|
43
|
+
* '/docs/guide.md',
|
|
44
|
+
* 'strict',
|
|
45
|
+
* '/schema.json'
|
|
46
|
+
* );
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export declare function validateFrontmatter(frontmatter: Record<string, unknown> | undefined, schema: object, resourcePath: string, mode?: ValidationMode, schemaPath?: string): ValidationIssue[];
|
|
50
|
+
//# sourceMappingURL=frontmatter-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter-validator.d.ts","sourceRoot":"","sources":["../src/frontmatter-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEtE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAChD,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,IAAI,GAAE,cAAyB,EAC/B,UAAU,CAAC,EAAE,MAAM,GAClB,eAAe,EAAE,CA0DnB"}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Frontmatter validation using JSON Schema.
|
|
3
|
+
*
|
|
4
|
+
* IMPORTANT: This module uses AJV specifically for validating arbitrary
|
|
5
|
+
* user-provided JSON Schemas against frontmatter data. For all TypeScript
|
|
6
|
+
* validation and internal schemas, use Zod instead.
|
|
7
|
+
*
|
|
8
|
+
* Why AJV here?
|
|
9
|
+
* - Users provide standard JSON Schema files for frontmatter validation
|
|
10
|
+
* - AJV is the industry standard JSON Schema validator
|
|
11
|
+
* - Zod is for TypeScript type safety + runtime validation
|
|
12
|
+
*
|
|
13
|
+
* This is the ONLY place in the codebase that should use AJV.
|
|
14
|
+
*/
|
|
15
|
+
import { Ajv } from 'ajv';
|
|
16
|
+
/**
|
|
17
|
+
* Validate frontmatter against a JSON Schema.
|
|
18
|
+
*
|
|
19
|
+
* Behavior:
|
|
20
|
+
* - Missing frontmatter: Error only if schema has required fields
|
|
21
|
+
* - Extra fields: Allowed by default (unless schema sets additionalProperties: false)
|
|
22
|
+
* - Type mismatches: Always reported as errors
|
|
23
|
+
* - Permissive mode: Ignores additionalProperties: false (allows schema layering)
|
|
24
|
+
*
|
|
25
|
+
* @param frontmatter - Parsed frontmatter object (or undefined if no frontmatter)
|
|
26
|
+
* @param schema - JSON Schema object
|
|
27
|
+
* @param resourcePath - File path for error reporting
|
|
28
|
+
* @param mode - Validation mode: 'strict' (default) or 'permissive'
|
|
29
|
+
* @param schemaPath - Path to schema file (for error context)
|
|
30
|
+
* @returns Array of validation issues (empty if valid)
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* const schema = {
|
|
35
|
+
* type: 'object',
|
|
36
|
+
* required: ['title'],
|
|
37
|
+
* properties: { title: { type: 'string' } }
|
|
38
|
+
* };
|
|
39
|
+
* const issues = validateFrontmatter(
|
|
40
|
+
* frontmatter,
|
|
41
|
+
* schema,
|
|
42
|
+
* '/docs/guide.md',
|
|
43
|
+
* 'strict',
|
|
44
|
+
* '/schema.json'
|
|
45
|
+
* );
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export function validateFrontmatter(frontmatter, schema, resourcePath, mode = 'strict', schemaPath) {
|
|
49
|
+
const issues = [];
|
|
50
|
+
// In permissive mode, clone schema and set additionalProperties: true
|
|
51
|
+
let effectiveSchema = schema;
|
|
52
|
+
if (mode === 'permissive') {
|
|
53
|
+
effectiveSchema = makeSchemaPermissive(schema);
|
|
54
|
+
}
|
|
55
|
+
// Configure AJV with permissive settings
|
|
56
|
+
const ajv = new Ajv({
|
|
57
|
+
strict: false, // Allow non-strict schemas
|
|
58
|
+
allErrors: true, // Report all errors, not just first
|
|
59
|
+
allowUnionTypes: true, // Support JSON Schema draft features
|
|
60
|
+
});
|
|
61
|
+
const validate = ajv.compile(effectiveSchema);
|
|
62
|
+
// Case 1: No frontmatter present
|
|
63
|
+
if (!frontmatter) {
|
|
64
|
+
// Check if schema requires any fields
|
|
65
|
+
const schemaRequires = schema.required;
|
|
66
|
+
if (schemaRequires && schemaRequires.length > 0) {
|
|
67
|
+
// Build context message with schema path and validation mode
|
|
68
|
+
const schemaContext = schemaPath ? ` (schema: ${schemaPath}, mode: ${mode})` : '';
|
|
69
|
+
const requiredFields = schemaRequires.join(', ');
|
|
70
|
+
issues.push({
|
|
71
|
+
resourcePath,
|
|
72
|
+
line: 1,
|
|
73
|
+
type: 'frontmatter_missing',
|
|
74
|
+
link: '',
|
|
75
|
+
message: `No frontmatter found in file. Schema requires: ${requiredFields}${schemaContext}`,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return issues;
|
|
79
|
+
}
|
|
80
|
+
// Case 2: Frontmatter present, validate against schema
|
|
81
|
+
const valid = validate(frontmatter);
|
|
82
|
+
if (valid || !validate.errors) {
|
|
83
|
+
return issues;
|
|
84
|
+
}
|
|
85
|
+
// Format validation errors with helpful messages
|
|
86
|
+
for (const error of validate.errors) {
|
|
87
|
+
const message = formatValidationError(error, frontmatter, mode, schemaPath);
|
|
88
|
+
issues.push({
|
|
89
|
+
resourcePath,
|
|
90
|
+
line: 1,
|
|
91
|
+
type: 'frontmatter_schema_error',
|
|
92
|
+
link: '',
|
|
93
|
+
message,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
return issues;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Format AJV validation error into helpful message
|
|
100
|
+
*
|
|
101
|
+
* @param error - AJV error object
|
|
102
|
+
* @param frontmatter - Frontmatter data
|
|
103
|
+
* @param mode - Validation mode (strict/permissive)
|
|
104
|
+
* @param schemaPath - Path to schema file (for error context)
|
|
105
|
+
* @returns Formatted error message
|
|
106
|
+
*/
|
|
107
|
+
function formatValidationError(error, frontmatter, mode, schemaPath) {
|
|
108
|
+
const field = error.instancePath.replace(/^\//, '') || 'root';
|
|
109
|
+
const fieldName = field === 'root' ? '(root)' : field;
|
|
110
|
+
// Get the actual invalid value
|
|
111
|
+
const actualValue = field === 'root' ? frontmatter : getNestedValue(frontmatter, field);
|
|
112
|
+
const actualValueStr = actualValue === undefined ? 'undefined' : JSON.stringify(actualValue);
|
|
113
|
+
let message = `Frontmatter validation failed for '${fieldName}' (got: ${actualValueStr})`;
|
|
114
|
+
// Add context based on error type
|
|
115
|
+
if (error.keyword === 'enum' && error.params?.['allowedValues']) {
|
|
116
|
+
const allowed = error.params['allowedValues']
|
|
117
|
+
.map((v) => JSON.stringify(v))
|
|
118
|
+
.join(', ');
|
|
119
|
+
message += `. Expected one of: ${allowed}`;
|
|
120
|
+
}
|
|
121
|
+
else if (error.keyword === 'pattern' && error.params?.['pattern']) {
|
|
122
|
+
// Convert to string directly in template to avoid SonarQube warning
|
|
123
|
+
message += `. Must match pattern: ${JSON.stringify(error.params['pattern'])}`;
|
|
124
|
+
}
|
|
125
|
+
else if (error.keyword === 'type' && error.params?.['type']) {
|
|
126
|
+
// Convert to string directly in template to avoid SonarQube warning
|
|
127
|
+
message += `. Expected type: ${JSON.stringify(error.params['type'])}`;
|
|
128
|
+
}
|
|
129
|
+
else if (error.keyword === 'required' && error.params?.['missingProperty']) {
|
|
130
|
+
// Convert to string directly in template to avoid SonarQube warning
|
|
131
|
+
message += `. Missing required property: ${JSON.stringify(error.params['missingProperty'])}`;
|
|
132
|
+
}
|
|
133
|
+
else if (error.message) {
|
|
134
|
+
message += `. ${error.message}`;
|
|
135
|
+
}
|
|
136
|
+
// Add schema context to help users understand the requirement
|
|
137
|
+
const schemaContext = schemaPath ? ` (schema: ${schemaPath}, mode: ${mode})` : '';
|
|
138
|
+
message += schemaContext;
|
|
139
|
+
return message;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Get nested value from object using dot-separated path
|
|
143
|
+
*
|
|
144
|
+
* @param obj - Object to get value from
|
|
145
|
+
* @param path - Dot-separated path (e.g., "user.name")
|
|
146
|
+
* @returns Value at path or undefined
|
|
147
|
+
*/
|
|
148
|
+
function getNestedValue(obj, path) {
|
|
149
|
+
// eslint-disable-next-line local/no-hardcoded-path-split -- JSON Schema instancePath uses forward slashes (not file paths)
|
|
150
|
+
const parts = path.split('/').filter(Boolean);
|
|
151
|
+
let current = obj;
|
|
152
|
+
for (const part of parts) {
|
|
153
|
+
if (typeof current !== 'object' || current === null) {
|
|
154
|
+
return undefined;
|
|
155
|
+
}
|
|
156
|
+
current = current[part];
|
|
157
|
+
}
|
|
158
|
+
return current;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Clone schema and recursively set additionalProperties: true
|
|
162
|
+
*
|
|
163
|
+
* Used in permissive mode to allow extra fields for schema layering.
|
|
164
|
+
* Handles nested objects and properties recursively.
|
|
165
|
+
*
|
|
166
|
+
* @param schema - Original JSON Schema
|
|
167
|
+
* @returns Cloned schema with additionalProperties: true
|
|
168
|
+
*/
|
|
169
|
+
function makeSchemaPermissive(schema) {
|
|
170
|
+
// Deep clone to avoid mutating original
|
|
171
|
+
const cloned = structuredClone(schema);
|
|
172
|
+
// Recursively process schema to set additionalProperties: true
|
|
173
|
+
processSchemaRecursively(cloned);
|
|
174
|
+
return cloned;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Recursively process schema object to set additionalProperties: true
|
|
178
|
+
*
|
|
179
|
+
* @param obj - Schema object or nested schema fragment
|
|
180
|
+
*/
|
|
181
|
+
function processSchemaRecursively(obj) {
|
|
182
|
+
// eslint-disable-next-line sonarjs/different-types-comparison
|
|
183
|
+
if (typeof obj !== 'object' || obj === null) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
// Set additionalProperties: true if this is an object schema
|
|
187
|
+
const typeValue = obj['type'];
|
|
188
|
+
const isObjectType = typeValue === 'object';
|
|
189
|
+
const hasProperties = 'properties' in obj;
|
|
190
|
+
if (isObjectType || hasProperties) {
|
|
191
|
+
obj['additionalProperties'] = true;
|
|
192
|
+
}
|
|
193
|
+
// Recurse into properties
|
|
194
|
+
processSchemaProperties(obj);
|
|
195
|
+
// Recurse into nested schemas (allOf, anyOf, oneOf, items)
|
|
196
|
+
processNestedSchemas(obj);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Process properties field of a schema
|
|
200
|
+
*
|
|
201
|
+
* @param obj - Schema object
|
|
202
|
+
*/
|
|
203
|
+
function processSchemaProperties(obj) {
|
|
204
|
+
if (obj['properties'] === undefined || typeof obj['properties'] !== 'object') {
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
const properties = obj['properties'];
|
|
208
|
+
for (const value of Object.values(properties)) {
|
|
209
|
+
if (typeof value === 'object' && value !== null) {
|
|
210
|
+
processSchemaRecursively(value);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Process nested schema keywords (allOf, anyOf, oneOf, items)
|
|
216
|
+
*
|
|
217
|
+
* @param obj - Schema object
|
|
218
|
+
*/
|
|
219
|
+
function processNestedSchemas(obj) {
|
|
220
|
+
const nestedKeys = ['allOf', 'anyOf', 'oneOf', 'items'];
|
|
221
|
+
for (const key of nestedKeys) {
|
|
222
|
+
const value = obj[key];
|
|
223
|
+
if (value === undefined) {
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
if (Array.isArray(value)) {
|
|
227
|
+
for (const item of value) {
|
|
228
|
+
if (typeof item === 'object' && item !== null) {
|
|
229
|
+
processSchemaRecursively(item);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
else if (typeof value === 'object' && value !== null) {
|
|
234
|
+
processSchemaRecursively(value);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=frontmatter-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter-validator.js","sourceRoot":"","sources":["../src/frontmatter-validator.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -25,12 +25,13 @@
|
|
|
25
25
|
* }
|
|
26
26
|
* ```
|
|
27
27
|
*/
|
|
28
|
-
export { ResourceRegistry, type CrawlOptions, type ResourceRegistryOptions, type RegistryStats, } from './resource-registry.js';
|
|
28
|
+
export { ResourceRegistry, type CrawlOptions, type ResourceRegistryOptions, type RegistryStats, type CollectionStats, type CollectionStat, } from './resource-registry.js';
|
|
29
29
|
export { ResourceQuery } from './resource-query.js';
|
|
30
30
|
export { ResourceCollection } from './resource-collection.js';
|
|
31
31
|
export type { ResourceCollectionInterface } from './resource-collection-interface.js';
|
|
32
|
-
export type { LinkType, HeadingNode, ResourceLink, ResourceMetadata,
|
|
32
|
+
export type { LinkType, HeadingNode, ResourceLink, ResourceMetadata, ValidationIssue, ValidationResult, ProjectConfig, ResourcesConfig, CollectionConfig, CollectionValidation, ValidationMode, } from './types.js';
|
|
33
33
|
export { LinkTypeSchema, HeadingNodeSchema, ResourceLinkSchema, ResourceMetadataSchema, } from './schemas/resource-metadata.js';
|
|
34
|
-
export {
|
|
34
|
+
export { ValidationIssueSchema, ValidationResultSchema, } from './schemas/validation-result.js';
|
|
35
35
|
export { parseMarkdown, type ParseResult } from './link-parser.js';
|
|
36
|
+
export { validateFrontmatter } from './frontmatter-validator.js';
|
|
36
37
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,EACL,gBAAgB,EAChB,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAC5B,KAAK,aAAa,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,EACL,gBAAgB,EAChB,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAC5B,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,cAAc,GACpB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAG9D,YAAY,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AAGtF,YAAY,EACV,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,GACf,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EAAE,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -33,9 +33,11 @@ export { ResourceQuery } from './resource-query.js';
|
|
|
33
33
|
export { ResourceCollection } from './resource-collection.js';
|
|
34
34
|
// Export schemas for external use (e.g., JSON Schema generation, runtime validation)
|
|
35
35
|
export { LinkTypeSchema, HeadingNodeSchema, ResourceLinkSchema, ResourceMetadataSchema, } from './schemas/resource-metadata.js';
|
|
36
|
-
export {
|
|
36
|
+
export { ValidationIssueSchema, ValidationResultSchema, } from './schemas/validation-result.js';
|
|
37
37
|
// Export parser interface for advanced use cases
|
|
38
38
|
export { parseMarkdown } from './link-parser.js';
|
|
39
|
+
// Export frontmatter validation
|
|
40
|
+
export { validateFrontmatter } from './frontmatter-validator.js';
|
|
39
41
|
// Note: link-parser and link-validator internals are NOT exported
|
|
40
42
|
// They are implementation details. Users should use ResourceRegistry API.
|
|
41
43
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,qCAAqC;AACrC,OAAO,EACL,gBAAgB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,qCAAqC;AACrC,OAAO,EACL,gBAAgB,GAMjB,MAAM,wBAAwB,CAAC;AAEhC,yDAAyD;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,oFAAoF;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAoB9D,qFAAqF;AACrF,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,gCAAgC,CAAC;AAExC,iDAAiD;AACjD,OAAO,EAAE,aAAa,EAAoB,MAAM,kBAAkB,CAAC;AAEnE,gCAAgC;AAChC,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,kEAAkE;AAClE,0EAA0E"}
|
package/dist/link-parser.d.ts
CHANGED
|
@@ -15,6 +15,8 @@ import type { HeadingNode, ResourceLink } from './types.js';
|
|
|
15
15
|
export interface ParseResult {
|
|
16
16
|
links: ResourceLink[];
|
|
17
17
|
headings: HeadingNode[];
|
|
18
|
+
frontmatter?: Record<string, unknown>;
|
|
19
|
+
frontmatterError?: string;
|
|
18
20
|
content: string;
|
|
19
21
|
sizeBytes: number;
|
|
20
22
|
estimatedTokenCount: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link-parser.d.ts","sourceRoot":"","sources":["../src/link-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"link-parser.d.ts","sourceRoot":"","sources":["../src/link-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAYH,OAAO,KAAK,EAAE,WAAW,EAAY,YAAY,EAAE,MAAM,YAAY,CAAC;AAEtE;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAwC1E"}
|
package/dist/link-parser.js
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* Uses unified/remark for robust markdown parsing with GFM support.
|
|
10
10
|
*/
|
|
11
11
|
import { readFile, stat } from 'node:fs/promises';
|
|
12
|
+
import * as yaml from 'js-yaml';
|
|
12
13
|
import remarkFrontmatter from 'remark-frontmatter';
|
|
13
14
|
import remarkGfm from 'remark-gfm';
|
|
14
15
|
import remarkParse from 'remark-parse';
|
|
@@ -48,9 +49,15 @@ export async function parseMarkdown(filePath) {
|
|
|
48
49
|
const links = extractLinks(tree);
|
|
49
50
|
// Extract headings with tree structure
|
|
50
51
|
const headings = extractHeadings(tree);
|
|
52
|
+
// Extract frontmatter
|
|
53
|
+
const { frontmatter, error: frontmatterError } = extractFrontmatter(tree);
|
|
54
|
+
// With exactOptionalPropertyTypes: true, we must conditionally include the property
|
|
55
|
+
// rather than assigning undefined to it
|
|
51
56
|
return {
|
|
52
57
|
links,
|
|
53
58
|
headings,
|
|
59
|
+
...(frontmatter !== undefined && { frontmatter }),
|
|
60
|
+
...(frontmatterError !== undefined && { frontmatterError }),
|
|
54
61
|
content,
|
|
55
62
|
sizeBytes,
|
|
56
63
|
estimatedTokenCount,
|
|
@@ -324,4 +331,38 @@ function cleanupEmptyChildren(headings) {
|
|
|
324
331
|
}
|
|
325
332
|
}
|
|
326
333
|
}
|
|
334
|
+
/**
|
|
335
|
+
* Extract and parse frontmatter from the markdown AST.
|
|
336
|
+
*
|
|
337
|
+
* Uses remark-frontmatter which creates 'yaml' nodes for frontmatter blocks.
|
|
338
|
+
* Parses YAML content and returns as plain object.
|
|
339
|
+
*
|
|
340
|
+
* @param tree - Markdown AST from unified/remark
|
|
341
|
+
* @returns Object with parsed frontmatter and any error message
|
|
342
|
+
*/
|
|
343
|
+
function extractFrontmatter(tree) {
|
|
344
|
+
let frontmatterData;
|
|
345
|
+
let errorMessage;
|
|
346
|
+
visit(tree, 'yaml', (node) => {
|
|
347
|
+
if (node.value.trim() === '') {
|
|
348
|
+
// Empty frontmatter block
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
try {
|
|
352
|
+
const parsed = yaml.load(node.value);
|
|
353
|
+
if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {
|
|
354
|
+
frontmatterData = parsed;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
catch (error) {
|
|
358
|
+
// Capture YAML parsing error for validation reporting
|
|
359
|
+
errorMessage = error instanceof Error ? error.message : String(error);
|
|
360
|
+
}
|
|
361
|
+
});
|
|
362
|
+
// With exactOptionalPropertyTypes: true, we must conditionally include properties
|
|
363
|
+
return {
|
|
364
|
+
...(frontmatterData !== undefined && { frontmatter: frontmatterData }),
|
|
365
|
+
...(errorMessage !== undefined && { error: errorMessage }),
|
|
366
|
+
};
|
|
367
|
+
}
|
|
327
368
|
//# sourceMappingURL=link-parser.js.map
|
package/dist/link-parser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link-parser.js","sourceRoot":"","sources":["../src/link-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"link-parser.js","sourceRoot":"","sources":["../src/link-parser.ts"],"names":[],"mappings":"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"}
|
package/dist/link-validator.d.ts
CHANGED
|
@@ -2,29 +2,51 @@
|
|
|
2
2
|
* Link validation for markdown resources.
|
|
3
3
|
*
|
|
4
4
|
* Validates different types of links:
|
|
5
|
-
* - local_file: Checks if file exists, validates anchors if present
|
|
5
|
+
* - local_file: Checks if file exists, validates anchors if present, checks git-ignore safety
|
|
6
6
|
* - anchor: Validates heading exists in current or target file
|
|
7
7
|
* - external: Returns info (not validated)
|
|
8
8
|
* - email: Returns null (valid by default)
|
|
9
9
|
* - unknown: Returns warning
|
|
10
|
+
*
|
|
11
|
+
* Git-ignore safety (Phase 3):
|
|
12
|
+
* - Non-ignored files cannot link to ignored files (error: link_to_gitignored)
|
|
13
|
+
* - Ignored files CAN link to ignored files (no error)
|
|
14
|
+
* - Ignored files CAN link to non-ignored files (no error)
|
|
15
|
+
* - External resources (outside project) skip git-ignore checks
|
|
10
16
|
*/
|
|
17
|
+
import { type GitTracker } from '@vibe-agent-toolkit/utils';
|
|
11
18
|
import type { ValidationIssue } from './schemas/validation-result.js';
|
|
12
19
|
import type { HeadingNode, ResourceLink } from './types.js';
|
|
20
|
+
/**
|
|
21
|
+
* Options for link validation.
|
|
22
|
+
*/
|
|
23
|
+
export interface ValidateLinkOptions {
|
|
24
|
+
/** Project root directory (for git-ignore checking) */
|
|
25
|
+
projectRoot?: string;
|
|
26
|
+
/** Skip git-ignore checks (optimization when checkGitIgnored is false) */
|
|
27
|
+
skipGitIgnoreCheck?: boolean;
|
|
28
|
+
/** Git tracker for efficient git-ignore checking (optional, improves performance) */
|
|
29
|
+
gitTracker?: GitTracker;
|
|
30
|
+
}
|
|
13
31
|
/**
|
|
14
32
|
* Validate a single link in a markdown resource.
|
|
15
33
|
*
|
|
16
34
|
* @param link - The link to validate
|
|
17
35
|
* @param sourceFilePath - Absolute path to the file containing the link
|
|
18
36
|
* @param headingsByFile - Map of file paths to their heading trees
|
|
37
|
+
* @param options - Validation options (projectRoot, skipGitIgnoreCheck)
|
|
19
38
|
* @returns ValidationIssue if link is broken, null if valid
|
|
20
39
|
*
|
|
21
40
|
* @example
|
|
22
41
|
* ```typescript
|
|
23
|
-
* const issue = await validateLink(link, '/project/docs/guide.md', headingsMap
|
|
42
|
+
* const issue = await validateLink(link, '/project/docs/guide.md', headingsMap, {
|
|
43
|
+
* projectRoot: '/project',
|
|
44
|
+
* skipGitIgnoreCheck: false
|
|
45
|
+
* });
|
|
24
46
|
* if (issue) {
|
|
25
47
|
* console.log(`${issue.severity}: ${issue.message}`);
|
|
26
48
|
* }
|
|
27
49
|
* ```
|
|
28
50
|
*/
|
|
29
|
-
export declare function validateLink(link: ResourceLink, sourceFilePath: string, headingsByFile: Map<string, HeadingNode[]
|
|
51
|
+
export declare function validateLink(link: ResourceLink, sourceFilePath: string, headingsByFile: Map<string, HeadingNode[]>, options?: ValidateLinkOptions): Promise<ValidationIssue | null>;
|
|
30
52
|
//# sourceMappingURL=link-validator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link-validator.d.ts","sourceRoot":"","sources":["../src/link-validator.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"link-validator.d.ts","sourceRoot":"","sources":["../src/link-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAE1E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG5D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,qFAAqF;IACrF,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,YAAY,EAClB,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,EAC1C,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CA+BjC"}
|