@vibe-agent-toolkit/resources 0.1.37 → 0.1.38

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 (58) hide show
  1. package/README.md +2 -2
  2. package/dist/ajv-factory.d.ts +33 -0
  3. package/dist/ajv-factory.d.ts.map +1 -0
  4. package/dist/ajv-factory.js +51 -0
  5. package/dist/ajv-factory.js.map +1 -0
  6. package/dist/config-parser.d.ts +0 -18
  7. package/dist/config-parser.d.ts.map +1 -1
  8. package/dist/config-parser.js +5 -46
  9. package/dist/config-parser.js.map +1 -1
  10. package/dist/frontmatter-editor.d.ts +45 -0
  11. package/dist/frontmatter-editor.d.ts.map +1 -0
  12. package/dist/frontmatter-editor.js +161 -0
  13. package/dist/frontmatter-editor.js.map +1 -0
  14. package/dist/frontmatter-validator.d.ts.map +1 -1
  15. package/dist/frontmatter-validator.js +11 -6
  16. package/dist/frontmatter-validator.js.map +1 -1
  17. package/dist/index.d.ts +5 -2
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +9 -1
  20. package/dist/index.js.map +1 -1
  21. package/dist/json-pointer-path.d.ts +13 -0
  22. package/dist/json-pointer-path.d.ts.map +1 -0
  23. package/dist/json-pointer-path.js +30 -0
  24. package/dist/json-pointer-path.js.map +1 -0
  25. package/dist/link-parser.js +2 -11
  26. package/dist/link-parser.js.map +1 -1
  27. package/dist/link-validator.d.ts +22 -0
  28. package/dist/link-validator.d.ts.map +1 -1
  29. package/dist/link-validator.js +126 -75
  30. package/dist/link-validator.js.map +1 -1
  31. package/dist/rewriter-helpers.d.ts +49 -0
  32. package/dist/rewriter-helpers.d.ts.map +1 -0
  33. package/dist/rewriter-helpers.js +142 -0
  34. package/dist/rewriter-helpers.js.map +1 -0
  35. package/dist/types/resource-parser.d.ts.map +1 -1
  36. package/dist/types/resource-parser.js +2 -3
  37. package/dist/types/resource-parser.js.map +1 -1
  38. package/dist/types.d.ts +1 -1
  39. package/dist/types.d.ts.map +1 -1
  40. package/dist/types.js +1 -1
  41. package/dist/types.js.map +1 -1
  42. package/dist/utils.d.ts +40 -11
  43. package/dist/utils.d.ts.map +1 -1
  44. package/dist/utils.js +39 -13
  45. package/dist/utils.js.map +1 -1
  46. package/package.json +5 -5
  47. package/src/ajv-factory.ts +56 -0
  48. package/src/config-parser.ts +5 -51
  49. package/src/frontmatter-editor.ts +214 -0
  50. package/src/frontmatter-validator.ts +11 -7
  51. package/src/index.ts +21 -2
  52. package/src/json-pointer-path.ts +29 -0
  53. package/src/link-parser.ts +2 -11
  54. package/src/link-validator.ts +153 -88
  55. package/src/rewriter-helpers.ts +166 -0
  56. package/src/types/resource-parser.ts +2 -3
  57. package/src/types.ts +0 -1
  58. package/src/utils.ts +57 -14
@@ -1 +1 @@
1
- {"version":3,"file":"resource-parser.js","sourceRoot":"","sources":["../../src/types/resource-parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resource-parser.js","sourceRoot":"","sources":["../../src/types/resource-parser.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -20,7 +20,7 @@ export type { BaseResource, Heading, JsonResource, JsonSchemaResource, MarkdownR
20
20
  export { getResourceAbsolutePath, isValidProjectPath, normalizeProjectPath, } from './types/resource-path-utils.js';
21
21
  export { detectResourceType, parseJsonResource, parseJsonSchemaResource, parseMarkdownResource, parseYamlResource, } from './types/resource-parser.js';
22
22
  export type { ValidationMode, CollectionValidation, CollectionConfig, ResourcesConfig, ProjectConfig, SkillFileEntry, SkillPackagingConfig, SkillsConfig, ClaudeConfig, ClaudeMarketplaceConfig, ClaudeMarketplacePluginEntry, } from './schemas/project-config.js';
23
- export { findConfigFile, parseConfigFile, loadConfig, } from './config-parser.js';
23
+ export { parseConfigFile, loadConfig, } from './config-parser.js';
24
24
  export { isGlobPattern, expandPattern, expandPatterns, } from './pattern-expander.js';
25
25
  export { matchesCollection, getCollectionsForFile, } from './collection-matcher.js';
26
26
  export type { ValidateLinkOptions } from './link-validator.js';
@@ -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;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"}
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,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
@@ -18,7 +18,7 @@ export { getResourceAbsolutePath, isValidProjectPath, normalizeProjectPath, } fr
18
18
  // Resource parsing
19
19
  export { detectResourceType, parseJsonResource, parseJsonSchemaResource, parseMarkdownResource, parseYamlResource, } from './types/resource-parser.js';
20
20
  // Config parsing
21
- export { findConfigFile, parseConfigFile, loadConfig, } from './config-parser.js';
21
+ export { parseConfigFile, loadConfig, } from './config-parser.js';
22
22
  // Pattern expansion
23
23
  export { isGlobPattern, expandPattern, expandPatterns, } from './pattern-expander.js';
24
24
  // Collection matching
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;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"}
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,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
@@ -35,32 +35,60 @@ export declare function matchesGlobPattern(filePath: string, pattern: string): b
35
35
  */
36
36
  export declare function splitHrefAnchor(href: string): [string, string | undefined];
37
37
  /**
38
- * Resolve a markdown link href to an absolute filesystem path.
38
+ * Discriminated union returned by {@link resolveLocalHref}.
39
+ *
40
+ * - `anchor_only` — the href was `#fragment` only (no file component).
41
+ * - `resolved` — the href resolved to an absolute filesystem path.
42
+ * - `absolute_no_root` — the href is an RFC 3986 §4.2 absolute-path
43
+ * reference (starts with `/`) but no `projectRoot` was supplied.
44
+ * - `absolute_escapes_root` — the absolute-path reference resolved to a
45
+ * location outside `projectRoot` (e.g., via `..` traversal or a symlink
46
+ * pointing outside the project).
47
+ */
48
+ export type ResolveLocalHrefResult = {
49
+ kind: 'anchor_only';
50
+ } | {
51
+ kind: 'resolved';
52
+ resolvedPath: string;
53
+ anchor: string | undefined;
54
+ } | {
55
+ kind: 'absolute_no_root';
56
+ href: string;
57
+ anchor: string | undefined;
58
+ } | {
59
+ kind: 'absolute_escapes_root';
60
+ href: string;
61
+ anchor: string | undefined;
62
+ };
63
+ /**
64
+ * Resolve a markdown link href to a filesystem path or a typed failure.
39
65
  *
40
66
  * Performs the standard href → path conversion used by both audit and validate:
41
67
  * 1. Strips anchor fragment (`#section`)
42
68
  * 2. Decodes URL-encoded characters (`%20` → space, `%26` → `&`)
43
- * 3. Resolves the path relative to the source file's directory
44
- *
45
- * Returns `null` for anchor-only links (e.g., `#heading`).
69
+ * 3. Resolves the path:
70
+ * - Leading `/` (RFC 3986 §4.2 absolute-path reference) → resolve against
71
+ * `projectRoot`. Requires a `projectRoot`; must not escape it.
72
+ * - Otherwise → resolve relative to the source file's directory.
46
73
  *
47
74
  * @param href - Raw href from a markdown link
48
75
  * @param sourceFilePath - Absolute path of the file containing the link
49
- * @returns Resolved path info, or null for anchor-only links
76
+ * @param projectRoot - Optional project root for absolute-path references.
77
+ * @returns A {@link ResolveLocalHrefResult} discriminating success vs failure modes.
50
78
  *
51
79
  * @example
52
80
  * ```typescript
53
81
  * resolveLocalHref('My%20Folder/doc.md#intro', '/project/README.md')
54
- * // { resolvedPath: '/project/My Folder/doc.md', anchor: 'intro' }
82
+ * // { kind: 'resolved', resolvedPath: '/project/My Folder/doc.md', anchor: 'intro' }
55
83
  *
56
84
  * resolveLocalHref('#heading', '/project/README.md')
57
- * // null
85
+ * // { kind: 'anchor_only' }
86
+ *
87
+ * resolveLocalHref('/docs/foo.md', '/project/docs/sub/page.md', '/project')
88
+ * // { kind: 'resolved', resolvedPath: '/project/docs/foo.md', anchor: undefined }
58
89
  * ```
59
90
  */
60
- export declare function resolveLocalHref(href: string, sourceFilePath: string): {
61
- resolvedPath: string;
62
- anchor: string | undefined;
63
- } | null;
91
+ export declare function resolveLocalHref(href: string, sourceFilePath: string, projectRoot?: string): ResolveLocalHrefResult;
64
92
  /**
65
93
  * Check if a file path is within a project directory.
66
94
  *
@@ -100,4 +128,5 @@ export declare function decodeJsonPointerSegment(segment: string): string;
100
128
  * formatJsonPointerAsDotted('') // ''
101
129
  */
102
130
  export declare function formatJsonPointerAsDotted(pointer: string): string;
131
+ export declare function isCanonicalArrayIndex(s: string): boolean;
103
132
  //# sourceMappingURL=utils.d.ts.map
@@ -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;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"}
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;;;;;;;;;;GAUG;AACH,MAAM,MAAM,sBAAsB,GAC9B;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACtE;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACtE;IAAE,IAAI,EAAE,uBAAuB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EACtB,WAAW,CAAC,EAAE,MAAM,GACnB,sBAAsB,CA6BxB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CA6B9E;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;AAED,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAUxD"}
package/dist/utils.js CHANGED
@@ -64,32 +64,37 @@ export function splitHrefAnchor(href) {
64
64
  return [filePath, anchor];
65
65
  }
66
66
  /**
67
- * Resolve a markdown link href to an absolute filesystem path.
67
+ * Resolve a markdown link href to a filesystem path or a typed failure.
68
68
  *
69
69
  * Performs the standard href → path conversion used by both audit and validate:
70
70
  * 1. Strips anchor fragment (`#section`)
71
71
  * 2. Decodes URL-encoded characters (`%20` → space, `%26` → `&`)
72
- * 3. Resolves the path relative to the source file's directory
73
- *
74
- * Returns `null` for anchor-only links (e.g., `#heading`).
72
+ * 3. Resolves the path:
73
+ * - Leading `/` (RFC 3986 §4.2 absolute-path reference) → resolve against
74
+ * `projectRoot`. Requires a `projectRoot`; must not escape it.
75
+ * - Otherwise → resolve relative to the source file's directory.
75
76
  *
76
77
  * @param href - Raw href from a markdown link
77
78
  * @param sourceFilePath - Absolute path of the file containing the link
78
- * @returns Resolved path info, or null for anchor-only links
79
+ * @param projectRoot - Optional project root for absolute-path references.
80
+ * @returns A {@link ResolveLocalHrefResult} discriminating success vs failure modes.
79
81
  *
80
82
  * @example
81
83
  * ```typescript
82
84
  * resolveLocalHref('My%20Folder/doc.md#intro', '/project/README.md')
83
- * // { resolvedPath: '/project/My Folder/doc.md', anchor: 'intro' }
85
+ * // { kind: 'resolved', resolvedPath: '/project/My Folder/doc.md', anchor: 'intro' }
84
86
  *
85
87
  * resolveLocalHref('#heading', '/project/README.md')
86
- * // null
88
+ * // { kind: 'anchor_only' }
89
+ *
90
+ * resolveLocalHref('/docs/foo.md', '/project/docs/sub/page.md', '/project')
91
+ * // { kind: 'resolved', resolvedPath: '/project/docs/foo.md', anchor: undefined }
87
92
  * ```
88
93
  */
89
- export function resolveLocalHref(href, sourceFilePath) {
94
+ export function resolveLocalHref(href, sourceFilePath, projectRoot) {
90
95
  const [fileHref, anchor] = splitHrefAnchor(href);
91
96
  if (fileHref === '') {
92
- return null;
97
+ return { kind: 'anchor_only' };
93
98
  }
94
99
  let decodedHref;
95
100
  try {
@@ -98,9 +103,21 @@ export function resolveLocalHref(href, sourceFilePath) {
98
103
  catch {
99
104
  decodedHref = fileHref;
100
105
  }
106
+ // RFC 3986 §4.2 absolute-path reference — resolve against projectRoot.
107
+ if (decodedHref.startsWith('/')) {
108
+ if (!projectRoot) {
109
+ return { kind: 'absolute_no_root', href: fileHref, anchor };
110
+ }
111
+ const candidate = safePath.resolve(projectRoot, decodedHref.slice(1));
112
+ if (!isWithinProject(candidate, projectRoot)) {
113
+ return { kind: 'absolute_escapes_root', href: fileHref, anchor };
114
+ }
115
+ return { kind: 'resolved', resolvedPath: candidate, anchor };
116
+ }
117
+ // Relative reference — resolve against the source file's directory.
101
118
  const sourceDir = path.dirname(sourceFilePath);
102
119
  const resolvedPath = safePath.resolve(sourceDir, decodedHref);
103
- return { resolvedPath, anchor };
120
+ return { kind: 'resolved', resolvedPath, anchor };
104
121
  }
105
122
  /**
106
123
  * Check if a file path is within a project directory.
@@ -120,7 +137,9 @@ export function resolveLocalHref(href, sourceFilePath) {
120
137
  * ```
121
138
  */
122
139
  export function isWithinProject(filePath, projectRoot) {
123
- // Resolve symlinks to get real paths
140
+ // Canonicalize both sides symmetrically. Asymmetric handling (realpath one
141
+ // side, resolve the other) false-flags legitimate matches when projectRoot
142
+ // traverses a symlink — e.g. macOS /tmp → /private/tmp, bind mounts.
124
143
  let resolvedFilePath;
125
144
  try {
126
145
  // eslint-disable-next-line security/detect-non-literal-fs-filename -- filePath is validated path parameter
@@ -130,7 +149,14 @@ export function isWithinProject(filePath, projectRoot) {
130
149
  // If realpath fails, file doesn't exist - use original path
131
150
  resolvedFilePath = safePath.resolve(filePath);
132
151
  }
133
- const resolvedProjectRoot = safePath.resolve(projectRoot);
152
+ let resolvedProjectRoot;
153
+ try {
154
+ // eslint-disable-next-line security/detect-non-literal-fs-filename -- projectRoot is validated path parameter
155
+ resolvedProjectRoot = fs.realpathSync(projectRoot);
156
+ }
157
+ catch {
158
+ resolvedProjectRoot = safePath.resolve(projectRoot);
159
+ }
134
160
  // Normalize to forward slashes for cross-platform comparison
135
161
  const normalizedFile = toForwardSlash(resolvedFilePath);
136
162
  const normalizedRoot = toForwardSlash(resolvedProjectRoot);
@@ -179,7 +205,7 @@ export function formatJsonPointerAsDotted(pointer) {
179
205
  }
180
206
  return out;
181
207
  }
182
- function isCanonicalArrayIndex(s) {
208
+ export function isCanonicalArrayIndex(s) {
183
209
  // Canonical integer per RFC 6901 §4 + JSON canonical form: no leading zeros
184
210
  // except for "0" itself.
185
211
  if (s === '')
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.37",
3
+ "version": "0.1.38",
4
4
  "description": "Markdown resource parsing, validation, and link integrity checking",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -33,11 +33,11 @@
33
33
  "author": "Jeff Dutton",
34
34
  "license": "MIT",
35
35
  "dependencies": {
36
- "@vibe-agent-toolkit/agent-schema": "0.1.37",
37
- "@vibe-agent-toolkit/utils": "0.1.37",
36
+ "@vibe-agent-toolkit/agent-schema": "0.1.38",
37
+ "@vibe-agent-toolkit/utils": "0.1.38",
38
38
  "ajv": "^8.17.1",
39
+ "ajv-formats": "^3.0.1",
39
40
  "github-slugger": "^2.0.0",
40
- "js-yaml": "^4.1.1",
41
41
  "markdown-link-check": "^3.14.2",
42
42
  "picomatch": "^4.0.3",
43
43
  "remark-frontmatter": "^5.0.0",
@@ -46,10 +46,10 @@
46
46
  "semver": "^7.7.3",
47
47
  "unified": "^11.0.5",
48
48
  "unist-util-visit": "^5.0.0",
49
+ "yaml": "^2.6.1",
49
50
  "zod": "^3.24.1"
50
51
  },
51
52
  "devDependencies": {
52
- "@types/js-yaml": "^4.0.9",
53
53
  "@types/mdast": "^4.0.4",
54
54
  "@types/node": "^22.10.5",
55
55
  "@types/picomatch": "^4.0.2",
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Ajv factory for adopters consuming VAT-generated schemas.
3
+ *
4
+ * VAT's frontmatter walker treats `format: "uri-reference"` (plus `uri`,
5
+ * `iri`, `iri-reference`) as first-class URI families and validates the
6
+ * referenced files via {@link import('./utils.js').resolveLocalHref}, not via
7
+ * Ajv. But adopters consuming the same schemas with vanilla
8
+ * `new Ajv(...)` hit Ajv's default strict mode, which upgrades
9
+ * `unknown format "uri-reference" ignored` from a warning to a thrown error.
10
+ *
11
+ * This helper returns an Ajv instance with the standard JSON Schema format
12
+ * vocabulary registered (via `ajv-formats`) plus no-op shims for
13
+ * `iri` / `iri-reference` (which `ajv-formats` does not ship). All
14
+ * URI-family schemas compile cleanly under strict mode.
15
+ */
16
+
17
+ import { Ajv, type Options as AjvOptions } from 'ajv';
18
+ // ajv-formats is a CJS module published with `module.exports = formatsPlugin`
19
+ // plus an `exports.default` alias. Under NodeNext module resolution the
20
+ // default import is typed as the namespace object (not callable), even
21
+ // though the runtime value IS the plugin function. The `.default ??
22
+ // namespace` pattern below resolves both at type level and runtime.
23
+ import * as ajvFormatsModule from 'ajv-formats';
24
+
25
+ type AddFormatsFn = (ajv: Ajv) => Ajv;
26
+
27
+ const addFormats: AddFormatsFn =
28
+ (ajvFormatsModule as unknown as { default?: AddFormatsFn }).default ??
29
+ (ajvFormatsModule as unknown as AddFormatsFn);
30
+
31
+ /**
32
+ * Construct an Ajv instance pre-registered with the URI-family formats VAT
33
+ * schemas use. Use this anywhere downstream code compiles a schema that may
34
+ * reference `format: "uri-reference"` (or `uri`, `iri`, `iri-reference`).
35
+ *
36
+ * @param options - Ajv options. Passed through unchanged — caller controls
37
+ * `allErrors`, `strict`, `allowUnionTypes`, `verbose`, etc.
38
+ *
39
+ * @example
40
+ * import { createAjvWithUriFormats } from '@vibe-agent-toolkit/resources';
41
+ *
42
+ * const ajv = createAjvWithUriFormats({ allErrors: true });
43
+ * const validate = ajv.compile(mySchemaWithUriReference);
44
+ * if (!validate(data)) console.error(validate.errors);
45
+ */
46
+ export function createAjvWithUriFormats(options: AjvOptions = {}): Ajv {
47
+ const ajv = new Ajv(options);
48
+ addFormats(ajv);
49
+ // ajv-formats does not register `iri` / `iri-reference`. Adopters whose
50
+ // schemas declare those would still hit "unknown format" under strict
51
+ // mode. Register no-op validators — Ajv accepts the format token, and
52
+ // semantic validation happens through resolveLocalHref / equivalent.
53
+ ajv.addFormat('iri', true);
54
+ ajv.addFormat('iri-reference', true);
55
+ return ajv;
56
+ }
@@ -5,58 +5,12 @@
5
5
  */
6
6
 
7
7
  import { readFile } from 'node:fs/promises';
8
- import path from 'node:path';
9
8
 
10
- import { safePath } from '@vibe-agent-toolkit/utils';
11
- import { CORE_SCHEMA, load as loadYaml } from 'js-yaml';
9
+ import { findConfigFile } from '@vibe-agent-toolkit/utils';
10
+ import { parse as parseYaml } from 'yaml';
12
11
 
13
12
  import { ProjectConfigSchema, type ProjectConfig } from './schemas/project-config.js';
14
13
 
15
- const CONFIG_FILENAME = 'vibe-agent-toolkit.config.yaml';
16
-
17
- /**
18
- * Find the config file by walking up the directory tree.
19
- *
20
- * Starts from the current directory and walks up until the config file is found
21
- * or the root directory is reached.
22
- *
23
- * @param startDir - Directory to start searching from (default: process.cwd())
24
- * @returns Absolute path to config file, or undefined if not found
25
- *
26
- * @example
27
- * ```typescript
28
- * const configPath = await findConfigFile();
29
- * if (configPath) {
30
- * console.log(`Found config: ${configPath}`);
31
- * }
32
- * ```
33
- */
34
- export async function findConfigFile(startDir: string = process.cwd()): Promise<string | undefined> {
35
- let currentDir = safePath.resolve(startDir);
36
- const { root } = path.parse(currentDir);
37
-
38
- while (true) {
39
- const configPath = safePath.join(currentDir, CONFIG_FILENAME);
40
-
41
- try {
42
- // Check if file exists by attempting to read metadata
43
- // eslint-disable-next-line security/detect-non-literal-fs-filename -- constructing path during tree walk
44
- await readFile(configPath, 'utf-8');
45
- return configPath;
46
- } catch {
47
- // File doesn't exist, continue walking up
48
- }
49
-
50
- // Check if we've reached the root
51
- if (currentDir === root) {
52
- return undefined;
53
- }
54
-
55
- // Move up one directory
56
- currentDir = path.dirname(currentDir);
57
- }
58
- }
59
-
60
14
  /**
61
15
  * Parse a project configuration file.
62
16
  *
@@ -81,8 +35,7 @@ export async function parseConfigFile(configPath: string): Promise<ProjectConfig
81
35
  // Parse YAML
82
36
  let parsed: unknown;
83
37
  try {
84
- // CORE_SCHEMA: YAML 1.2 spec — see link-parser.ts for rationale.
85
- parsed = loadYaml(content, { schema: CORE_SCHEMA });
38
+ parsed = parseYaml(content);
86
39
  } catch (error) {
87
40
  throw new Error(`Invalid YAML in config file: ${error instanceof Error ? error.message : String(error)}`);
88
41
  }
@@ -118,7 +71,8 @@ export async function parseConfigFile(configPath: string): Promise<ProjectConfig
118
71
  * ```
119
72
  */
120
73
  export async function loadConfig(startDir: string = process.cwd()): Promise<ProjectConfig | undefined> {
121
- const configPath = await findConfigFile(startDir);
74
+ // findConfigFile from utils is synchronous; awaiting a non-promise is a no-op.
75
+ const configPath = findConfigFile(startDir);
122
76
  if (!configPath) {
123
77
  return undefined;
124
78
  }