@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.
Files changed (92) hide show
  1. package/README.md +255 -17
  2. package/dist/collection-matcher.d.ts +63 -0
  3. package/dist/collection-matcher.d.ts.map +1 -0
  4. package/dist/collection-matcher.js +127 -0
  5. package/dist/collection-matcher.js.map +1 -0
  6. package/dist/config-parser.d.ts +63 -0
  7. package/dist/config-parser.d.ts.map +1 -0
  8. package/dist/config-parser.js +113 -0
  9. package/dist/config-parser.js.map +1 -0
  10. package/dist/frontmatter-validator.d.ts +50 -0
  11. package/dist/frontmatter-validator.d.ts.map +1 -0
  12. package/dist/frontmatter-validator.js +238 -0
  13. package/dist/frontmatter-validator.js.map +1 -0
  14. package/dist/index.d.ts +4 -3
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +3 -1
  17. package/dist/index.js.map +1 -1
  18. package/dist/link-parser.d.ts +2 -0
  19. package/dist/link-parser.d.ts.map +1 -1
  20. package/dist/link-parser.js +41 -0
  21. package/dist/link-parser.js.map +1 -1
  22. package/dist/link-validator.d.ts +25 -3
  23. package/dist/link-validator.d.ts.map +1 -1
  24. package/dist/link-validator.js +52 -40
  25. package/dist/link-validator.js.map +1 -1
  26. package/dist/multi-schema-validator.d.ts +42 -0
  27. package/dist/multi-schema-validator.d.ts.map +1 -0
  28. package/dist/multi-schema-validator.js +107 -0
  29. package/dist/multi-schema-validator.js.map +1 -0
  30. package/dist/pattern-expander.d.ts +63 -0
  31. package/dist/pattern-expander.d.ts.map +1 -0
  32. package/dist/pattern-expander.js +93 -0
  33. package/dist/pattern-expander.js.map +1 -0
  34. package/dist/resource-registry.d.ts +104 -8
  35. package/dist/resource-registry.d.ts.map +1 -1
  36. package/dist/resource-registry.js +230 -30
  37. package/dist/resource-registry.js.map +1 -1
  38. package/dist/schema-assignment.d.ts +49 -0
  39. package/dist/schema-assignment.d.ts.map +1 -0
  40. package/dist/schema-assignment.js +95 -0
  41. package/dist/schema-assignment.js.map +1 -0
  42. package/dist/schemas/project-config.d.ts +254 -0
  43. package/dist/schemas/project-config.d.ts.map +1 -0
  44. package/dist/schemas/project-config.js +57 -0
  45. package/dist/schemas/project-config.js.map +1 -0
  46. package/dist/schemas/resource-metadata.d.ts +10 -1
  47. package/dist/schemas/resource-metadata.d.ts.map +1 -1
  48. package/dist/schemas/resource-metadata.js +7 -1
  49. package/dist/schemas/resource-metadata.js.map +1 -1
  50. package/dist/schemas/validation-result.d.ts +9 -24
  51. package/dist/schemas/validation-result.d.ts.map +1 -1
  52. package/dist/schemas/validation-result.js +11 -18
  53. package/dist/schemas/validation-result.js.map +1 -1
  54. package/dist/types/resource-parser.d.ts +53 -0
  55. package/dist/types/resource-parser.d.ts.map +1 -0
  56. package/dist/types/resource-parser.js +233 -0
  57. package/dist/types/resource-parser.js.map +1 -0
  58. package/dist/types/resource-path-utils.d.ts +43 -0
  59. package/dist/types/resource-path-utils.d.ts.map +1 -0
  60. package/dist/types/resource-path-utils.js +89 -0
  61. package/dist/types/resource-path-utils.js.map +1 -0
  62. package/dist/types/resources.d.ts +140 -0
  63. package/dist/types/resources.d.ts.map +1 -0
  64. package/dist/types/resources.js +58 -0
  65. package/dist/types/resources.js.map +1 -0
  66. package/dist/types.d.ts +14 -1
  67. package/dist/types.d.ts.map +1 -1
  68. package/dist/types.js +17 -0
  69. package/dist/types.js.map +1 -1
  70. package/dist/utils.d.ts +18 -0
  71. package/dist/utils.d.ts.map +1 -1
  72. package/dist/utils.js +39 -0
  73. package/dist/utils.js.map +1 -1
  74. package/package.json +5 -2
  75. package/src/collection-matcher.ts +148 -0
  76. package/src/config-parser.ts +125 -0
  77. package/src/frontmatter-validator.ts +279 -0
  78. package/src/index.ts +10 -2
  79. package/src/link-parser.ts +50 -0
  80. package/src/link-validator.ts +70 -43
  81. package/src/multi-schema-validator.ts +128 -0
  82. package/src/pattern-expander.ts +100 -0
  83. package/src/resource-registry.ts +347 -34
  84. package/src/schema-assignment.ts +119 -0
  85. package/src/schemas/project-config.ts +71 -0
  86. package/src/schemas/resource-metadata.ts +7 -1
  87. package/src/schemas/validation-result.ts +11 -21
  88. package/src/types/resource-parser.ts +302 -0
  89. package/src/types/resource-path-utils.ts +102 -0
  90. package/src/types/resources.ts +211 -0
  91. package/src/types.ts +89 -1
  92. 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, ValidationSeverity, ValidationIssue, ValidationResult, } from './types.js';
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 { ValidationSeveritySchema, ValidationIssueSchema, ValidationResultSchema, } from './schemas/validation-result.js';
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
@@ -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,GACnB,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,kBAAkB,EAClB,eAAe,EACf,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EAAE,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
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 { ValidationSeveritySchema, ValidationIssueSchema, ValidationResultSchema, } from './schemas/validation-result.js';
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,GAIjB,MAAM,wBAAwB,CAAC;AAEhC,yDAAyD;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,oFAAoF;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAgB9D,qFAAqF;AACrF,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,gCAAgC,CAAC;AAExC,iDAAiD;AACjD,OAAO,EAAE,aAAa,EAAoB,MAAM,kBAAkB,CAAC;AAEnE,kEAAkE;AAClE,0EAA0E"}
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"}
@@ -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;AAWH,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,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,CAiC1E"}
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"}
@@ -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
@@ -1 +1 @@
1
- {"version":3,"file":"link-parser.js","sourceRoot":"","sources":["../src/link-parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"link-parser.js","sourceRoot":"","sources":["../src/link-parser.ts"],"names":[],"mappings":"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"}
@@ -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[]>): Promise<ValidationIssue | null>;
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;;;;;;;;;GASG;AAOH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG5D;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,YAAY,EAClB,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,GACzC,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAuCjC"}
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"}