@vibe-agent-toolkit/resources 0.1.36 → 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.
- package/README.md +2 -2
- package/dist/ajv-factory.d.ts +33 -0
- package/dist/ajv-factory.d.ts.map +1 -0
- package/dist/ajv-factory.js +51 -0
- package/dist/ajv-factory.js.map +1 -0
- package/dist/config-parser.d.ts +0 -18
- package/dist/config-parser.d.ts.map +1 -1
- package/dist/config-parser.js +5 -45
- package/dist/config-parser.js.map +1 -1
- package/dist/frontmatter-editor.d.ts +45 -0
- package/dist/frontmatter-editor.d.ts.map +1 -0
- package/dist/frontmatter-editor.js +161 -0
- package/dist/frontmatter-editor.js.map +1 -0
- package/dist/frontmatter-validator.d.ts.map +1 -1
- package/dist/frontmatter-validator.js +11 -6
- package/dist/frontmatter-validator.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/json-pointer-path.d.ts +13 -0
- package/dist/json-pointer-path.d.ts.map +1 -0
- package/dist/json-pointer-path.js +30 -0
- package/dist/json-pointer-path.js.map +1 -0
- package/dist/link-parser.js +2 -2
- package/dist/link-parser.js.map +1 -1
- package/dist/link-validator.d.ts +22 -0
- package/dist/link-validator.d.ts.map +1 -1
- package/dist/link-validator.js +126 -75
- package/dist/link-validator.js.map +1 -1
- package/dist/rewriter-helpers.d.ts +49 -0
- package/dist/rewriter-helpers.d.ts.map +1 -0
- package/dist/rewriter-helpers.js +142 -0
- package/dist/rewriter-helpers.js.map +1 -0
- package/dist/types/resource-parser.js +2 -2
- package/dist/types/resource-parser.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils.d.ts +40 -11
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +39 -13
- package/dist/utils.js.map +1 -1
- package/package.json +5 -5
- package/src/ajv-factory.ts +56 -0
- package/src/config-parser.ts +5 -50
- package/src/frontmatter-editor.ts +214 -0
- package/src/frontmatter-validator.ts +11 -7
- package/src/index.ts +21 -2
- package/src/json-pointer-path.ts +29 -0
- package/src/link-parser.ts +2 -2
- package/src/link-validator.ts +153 -88
- package/src/rewriter-helpers.ts +166 -0
- package/src/types/resource-parser.ts +2 -2
- package/src/types.ts +0 -1
- package/src/utils.ts +57 -14
package/dist/link-parser.js
CHANGED
|
@@ -10,12 +10,12 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { readFile, stat } from 'node:fs/promises';
|
|
12
12
|
import GithubSlugger from 'github-slugger';
|
|
13
|
-
import * as yaml from 'js-yaml';
|
|
14
13
|
import remarkFrontmatter from 'remark-frontmatter';
|
|
15
14
|
import remarkGfm from 'remark-gfm';
|
|
16
15
|
import remarkParse from 'remark-parse';
|
|
17
16
|
import { unified } from 'unified';
|
|
18
17
|
import { visit } from 'unist-util-visit';
|
|
18
|
+
import * as yaml from 'yaml';
|
|
19
19
|
/**
|
|
20
20
|
* Parse a markdown file and extract all links, headings, and metadata.
|
|
21
21
|
*
|
|
@@ -376,7 +376,7 @@ function extractFrontmatter(tree) {
|
|
|
376
376
|
return;
|
|
377
377
|
}
|
|
378
378
|
try {
|
|
379
|
-
const parsed = yaml.
|
|
379
|
+
const parsed = yaml.parse(node.value);
|
|
380
380
|
if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {
|
|
381
381
|
frontmatterData = parsed;
|
|
382
382
|
}
|
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;AAElD,OAAO,aAAa,MAAM,gBAAgB,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
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
import { type GitTracker } from '@vibe-agent-toolkit/utils';
|
|
18
18
|
import type { ValidationIssue } from './schemas/validation-result.js';
|
|
19
19
|
import type { HeadingNode, ResourceLink } from './types.js';
|
|
20
|
+
import { resolveLocalHref } from './utils.js';
|
|
20
21
|
/**
|
|
21
22
|
* Options for link validation.
|
|
22
23
|
*/
|
|
@@ -49,4 +50,25 @@ export interface ValidateLinkOptions {
|
|
|
49
50
|
* ```
|
|
50
51
|
*/
|
|
51
52
|
export declare function validateLink(link: ResourceLink, sourceFilePath: string, headingsByFile: Map<string, HeadingNode[]>, options?: ValidateLinkOptions): Promise<ValidationIssue | null>;
|
|
53
|
+
/**
|
|
54
|
+
* Convert a resolution failure kind to a broken_file ValidationIssue. Returns
|
|
55
|
+
* null for `resolved` (caller continues) and `anchor_only` (defensive no-op —
|
|
56
|
+
* the parser classifies anchor-only hrefs as 'anchor', not 'local_file').
|
|
57
|
+
*/
|
|
58
|
+
export declare function resolutionFailureIssue(resolved: ReturnType<typeof resolveLocalHref>, link: ResourceLink, sourceFilePath: string): ValidationIssue | null;
|
|
59
|
+
/**
|
|
60
|
+
* Convert a non-existent file result into a broken_file ValidationIssue.
|
|
61
|
+
* Returns null when the file exists.
|
|
62
|
+
*/
|
|
63
|
+
export declare function fileExistenceIssue(fileResult: {
|
|
64
|
+
exists: boolean;
|
|
65
|
+
resolvedPath: string;
|
|
66
|
+
actualName?: string;
|
|
67
|
+
}, link: ResourceLink, sourceFilePath: string): ValidationIssue | null;
|
|
68
|
+
/**
|
|
69
|
+
* Check git-ignore safety: a non-ignored source file must not link to a
|
|
70
|
+
* gitignored target. Returns a ValidationIssue when this rule is violated,
|
|
71
|
+
* null otherwise (including when checks are disabled or out of scope).
|
|
72
|
+
*/
|
|
73
|
+
export declare function gitIgnoreSafetyIssue(link: ResourceLink, sourceFilePath: string, resolvedTarget: string, options: ValidateLinkOptions | undefined): ValidationIssue | null;
|
|
52
74
|
//# 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;;;;;;;;;;;;;;;GAeG;
|
|
1
|
+
{"version":3,"file":"link-validator.d.ts","sourceRoot":"","sources":["../src/link-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,OAAO,EAEL,KAAK,UAAU,EAEhB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAmB,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE/D;;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;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,EAC7C,IAAI,EAAE,YAAY,EAClB,cAAc,EAAE,MAAM,GACrB,eAAe,GAAG,IAAI,CA4BxB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,EAC1E,IAAI,EAAE,YAAY,EAClB,cAAc,EAAE,MAAM,GACrB,eAAe,GAAG,IAAI,CAuBxB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,YAAY,EAClB,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,mBAAmB,GAAG,SAAS,GACvC,eAAe,GAAG,IAAI,CA8BxB"}
|
package/dist/link-validator.js
CHANGED
|
@@ -14,9 +14,10 @@
|
|
|
14
14
|
* - Ignored files CAN link to non-ignored files (no error)
|
|
15
15
|
* - External resources (outside project) skip git-ignore checks
|
|
16
16
|
*/
|
|
17
|
+
import fs from 'node:fs/promises';
|
|
17
18
|
import path from 'node:path';
|
|
18
|
-
import { isGitIgnored, verifyCaseSensitiveFilename,
|
|
19
|
-
import { isWithinProject, resolveLocalHref
|
|
19
|
+
import { isGitIgnored, verifyCaseSensitiveFilename, } from '@vibe-agent-toolkit/utils';
|
|
20
|
+
import { isWithinProject, resolveLocalHref } from './utils.js';
|
|
20
21
|
/**
|
|
21
22
|
* Validate a single link in a markdown resource.
|
|
22
23
|
*
|
|
@@ -65,75 +66,129 @@ export async function validateLink(link, sourceFilePath, headingsByFile, options
|
|
|
65
66
|
}
|
|
66
67
|
}
|
|
67
68
|
/**
|
|
68
|
-
*
|
|
69
|
+
* Convert a resolution failure kind to a broken_file ValidationIssue. Returns
|
|
70
|
+
* null for `resolved` (caller continues) and `anchor_only` (defensive no-op —
|
|
71
|
+
* the parser classifies anchor-only hrefs as 'anchor', not 'local_file').
|
|
69
72
|
*/
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
message: `File found but case mismatch: expected "${expectedName}" but found "${fileResult.actualName}". This will fail on case-sensitive filesystems (Linux). Update the link to match the actual filename.`,
|
|
85
|
-
suggestion: `Use "${fileResult.actualName}" instead of "${expectedName}"`,
|
|
86
|
-
};
|
|
87
|
-
}
|
|
73
|
+
export function resolutionFailureIssue(resolved, link, sourceFilePath) {
|
|
74
|
+
if (resolved.kind === 'absolute_no_root') {
|
|
75
|
+
return {
|
|
76
|
+
resourcePath: sourceFilePath,
|
|
77
|
+
line: link.line,
|
|
78
|
+
type: 'broken_file',
|
|
79
|
+
link: link.href,
|
|
80
|
+
message: `Absolute-path link "${link.href}" requires a configured projectRoot; ` +
|
|
81
|
+
`none was provided. Configure vibe-agent-toolkit.config.yaml or run ` +
|
|
82
|
+
`from within a git repository.`,
|
|
83
|
+
suggestion: 'Rewrite as a source-relative link, or run from a directory with a config or git ancestor.',
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
if (resolved.kind === 'absolute_escapes_root') {
|
|
88
87
|
return {
|
|
89
88
|
resourcePath: sourceFilePath,
|
|
90
89
|
line: link.line,
|
|
91
90
|
type: 'broken_file',
|
|
92
91
|
link: link.href,
|
|
93
|
-
message: `
|
|
92
|
+
message: `Absolute-path link "${link.href}" escapes the project root via path traversal.`,
|
|
94
93
|
suggestion: '',
|
|
95
94
|
};
|
|
96
95
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
:
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
:
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Convert a non-existent file result into a broken_file ValidationIssue.
|
|
100
|
+
* Returns null when the file exists.
|
|
101
|
+
*/
|
|
102
|
+
export function fileExistenceIssue(fileResult, link, sourceFilePath) {
|
|
103
|
+
if (fileResult.exists)
|
|
104
|
+
return null;
|
|
105
|
+
if (fileResult.actualName) {
|
|
106
|
+
const expectedName = path.basename(fileResult.resolvedPath);
|
|
107
|
+
return {
|
|
108
|
+
resourcePath: sourceFilePath,
|
|
109
|
+
line: link.line,
|
|
110
|
+
type: 'broken_file',
|
|
111
|
+
link: link.href,
|
|
112
|
+
message: `File found but case mismatch: expected "${expectedName}" but found "${fileResult.actualName}". This will fail on case-sensitive filesystems (Linux). Update the link to match the actual filename.`,
|
|
113
|
+
suggestion: `Use "${fileResult.actualName}" instead of "${expectedName}"`,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
resourcePath: sourceFilePath,
|
|
118
|
+
line: link.line,
|
|
119
|
+
type: 'broken_file',
|
|
120
|
+
link: link.href,
|
|
121
|
+
message: `File not found: ${fileResult.resolvedPath}`,
|
|
122
|
+
suggestion: '',
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Check git-ignore safety: a non-ignored source file must not link to a
|
|
127
|
+
* gitignored target. Returns a ValidationIssue when this rule is violated,
|
|
128
|
+
* null otherwise (including when checks are disabled or out of scope).
|
|
129
|
+
*/
|
|
130
|
+
export function gitIgnoreSafetyIssue(link, sourceFilePath, resolvedTarget, options) {
|
|
131
|
+
if (options?.skipGitIgnoreCheck === true ||
|
|
132
|
+
options?.projectRoot === undefined ||
|
|
133
|
+
!isWithinProject(resolvedTarget, options.projectRoot)) {
|
|
134
|
+
return null;
|
|
126
135
|
}
|
|
127
|
-
//
|
|
128
|
-
|
|
129
|
-
|
|
136
|
+
// Prefer the O(1) active-set lookup on the shared GitTracker (no spawn).
|
|
137
|
+
// isIgnoredByActiveSet falls back internally to isIgnored for paths outside
|
|
138
|
+
// the project root, so this is safe for the rare out-of-project case.
|
|
139
|
+
// When no tracker is threaded in, fall back to isGitIgnored (one-off spawn).
|
|
140
|
+
const sourceIsIgnored = options.gitTracker
|
|
141
|
+
? options.gitTracker.isIgnoredByActiveSet(sourceFilePath)
|
|
142
|
+
: isGitIgnored(sourceFilePath, options.projectRoot);
|
|
143
|
+
const targetIsIgnored = options.gitTracker
|
|
144
|
+
? options.gitTracker.isIgnoredByActiveSet(resolvedTarget)
|
|
145
|
+
: isGitIgnored(resolvedTarget, options.projectRoot);
|
|
146
|
+
if (sourceIsIgnored || !targetIsIgnored)
|
|
147
|
+
return null;
|
|
148
|
+
return {
|
|
149
|
+
resourcePath: sourceFilePath,
|
|
150
|
+
line: link.line,
|
|
151
|
+
type: 'link_to_gitignored',
|
|
152
|
+
link: link.href,
|
|
153
|
+
message: `Non-ignored file links to gitignored file: ${resolvedTarget}. Gitignored files are local-only and will not exist in the repository. Remove this link or unignore the target file.`,
|
|
154
|
+
suggestion: '',
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Validate a local file link (with optional anchor).
|
|
159
|
+
*/
|
|
160
|
+
async function validateLocalFileLink(link, sourceFilePath, headingsByFile, options) {
|
|
161
|
+
const resolved = resolveLocalHref(link.href, sourceFilePath, options?.projectRoot);
|
|
162
|
+
if (resolved.kind !== 'resolved') {
|
|
163
|
+
// anchor_only → null no-op; absolute_no_root / absolute_escapes_root → broken_file.
|
|
164
|
+
return resolutionFailureIssue(resolved, link, sourceFilePath);
|
|
165
|
+
}
|
|
166
|
+
const fileResult = await validateResolvedFile(resolved.resolvedPath);
|
|
167
|
+
const notFound = fileExistenceIssue(fileResult, link, sourceFilePath);
|
|
168
|
+
if (notFound)
|
|
169
|
+
return notFound;
|
|
170
|
+
if (fileResult.isDirectory) {
|
|
171
|
+
return {
|
|
172
|
+
resourcePath: sourceFilePath,
|
|
173
|
+
line: link.line,
|
|
174
|
+
type: 'broken_file',
|
|
175
|
+
link: link.href,
|
|
176
|
+
message: `Link target is a directory: ${fileResult.resolvedPath}`,
|
|
177
|
+
suggestion: 'Link to a file inside the directory (e.g., README.md or index.md), or fix the link to point at the intended file.',
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
const gitIgnoreIssue = gitIgnoreSafetyIssue(link, sourceFilePath, fileResult.resolvedPath, options);
|
|
181
|
+
if (gitIgnoreIssue)
|
|
182
|
+
return gitIgnoreIssue;
|
|
183
|
+
if (resolved.anchor) {
|
|
184
|
+
const anchorValid = await validateAnchor(resolved.anchor, fileResult.resolvedPath, headingsByFile);
|
|
130
185
|
if (!anchorValid) {
|
|
131
186
|
return {
|
|
132
187
|
resourcePath: sourceFilePath,
|
|
133
188
|
line: link.line,
|
|
134
189
|
type: 'broken_anchor',
|
|
135
190
|
link: link.href,
|
|
136
|
-
message: `Anchor not found: #${anchor} in ${fileResult.resolvedPath}`,
|
|
191
|
+
message: `Anchor not found: #${resolved.anchor} in ${fileResult.resolvedPath}`,
|
|
137
192
|
suggestion: '',
|
|
138
193
|
};
|
|
139
194
|
}
|
|
@@ -161,32 +216,28 @@ async function validateAnchorLink(link, sourceFilePath, headingsByFile) {
|
|
|
161
216
|
return null;
|
|
162
217
|
}
|
|
163
218
|
/**
|
|
164
|
-
*
|
|
165
|
-
*
|
|
166
|
-
* @param href - The href to the file (relative or absolute)
|
|
167
|
-
* @param sourceFilePath - Absolute path to the source file
|
|
168
|
-
* @returns Object with exists flag, resolved absolute path, and optional case mismatch info
|
|
219
|
+
* Verify that the resolved filesystem path exists with the correct case.
|
|
169
220
|
*
|
|
170
|
-
* @
|
|
171
|
-
*
|
|
172
|
-
* const result = await validateLocalFile('./docs/guide.md', '/project/README.md');
|
|
173
|
-
* if (result.exists) {
|
|
174
|
-
* console.log('File exists at:', result.resolvedPath);
|
|
175
|
-
* } else if (result.actualName) {
|
|
176
|
-
* console.log('Case mismatch:', result.actualName);
|
|
177
|
-
* }
|
|
178
|
-
* ```
|
|
221
|
+
* @param resolvedPath - Absolute filesystem path produced by {@link resolveLocalHref}.
|
|
222
|
+
* @returns Object with exists flag, the path, and optional case-mismatch info.
|
|
179
223
|
*/
|
|
180
|
-
async function
|
|
181
|
-
// Resolve href to filesystem path (decode percent-encoding, resolve relative to source)
|
|
182
|
-
const resolved = resolveLocalHref(href, sourceFilePath);
|
|
183
|
-
const resolvedPath = resolved?.resolvedPath ?? safePath.resolve(path.dirname(sourceFilePath), href);
|
|
184
|
-
// Check if file exists with correct case
|
|
224
|
+
async function validateResolvedFile(resolvedPath) {
|
|
185
225
|
const verification = await verifyCaseSensitiveFilename(resolvedPath);
|
|
186
|
-
|
|
226
|
+
let isDirectory = false;
|
|
227
|
+
if (verification.exists) {
|
|
228
|
+
try {
|
|
229
|
+
// eslint-disable-next-line security/detect-non-literal-fs-filename -- resolvedPath validated by verifyCaseSensitiveFilename
|
|
230
|
+
const stats = await fs.stat(resolvedPath);
|
|
231
|
+
isDirectory = stats.isDirectory();
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
// Stat failed after verifyCaseSensitiveFilename said exists — treat as file.
|
|
235
|
+
}
|
|
236
|
+
}
|
|
187
237
|
const result = {
|
|
188
238
|
exists: verification.exists,
|
|
189
239
|
resolvedPath,
|
|
240
|
+
isDirectory,
|
|
190
241
|
};
|
|
191
242
|
if (verification.actualName) {
|
|
192
243
|
result.actualName = verification.actualName;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link-validator.js","sourceRoot":"","sources":["../src/link-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EACL,YAAY,EAEZ,2BAA2B,
|
|
1
|
+
{"version":3,"file":"link-validator.js","sourceRoot":"","sources":["../src/link-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public rewriter helpers built on FrontmatterEditor and shared callback
|
|
3
|
+
* shape `(href: string) => string`.
|
|
4
|
+
*
|
|
5
|
+
* Three layers:
|
|
6
|
+
* 1. rewriteFrontmatterUriReferencesFromSchema — schema-driven; used by
|
|
7
|
+
* VAT packager and by schema-aware adopter scripts.
|
|
8
|
+
* 2. rewriteFrontmatterFieldsAtPaths — path-driven; used by ad-hoc
|
|
9
|
+
* adopter scripts (no JSON Schema available; field paths known by
|
|
10
|
+
* convention).
|
|
11
|
+
* 3. rewriteBodyLinks — standalone body-side counterpart. Parallel to
|
|
12
|
+
* `transformContent` but with a callback model instead of templates.
|
|
13
|
+
*
|
|
14
|
+
* See docs/superpowers/specs/2026-05-17-frontmatter-editor-and-yaml-consolidation-design.md
|
|
15
|
+
* §6 for the design contract.
|
|
16
|
+
*/
|
|
17
|
+
import type { FrontmatterEditor } from './frontmatter-editor.js';
|
|
18
|
+
/** Type for the rewrite policy callback — same shape for body and frontmatter. */
|
|
19
|
+
export type RewriteHref = (href: string) => string;
|
|
20
|
+
/**
|
|
21
|
+
* Apply `rewriteHref` to every frontmatter scalar whose schema position has
|
|
22
|
+
* a URI-family `format`. Preserves comments via FrontmatterEditor.
|
|
23
|
+
*/
|
|
24
|
+
export declare function rewriteFrontmatterUriReferencesFromSchema(editor: FrontmatterEditor, schema: object, rewriteHref: RewriteHref): void;
|
|
25
|
+
/**
|
|
26
|
+
* Apply `rewriteHref` to specific frontmatter fields named by explicit
|
|
27
|
+
* dotted paths. Used by adopter scripts that know which fields hold
|
|
28
|
+
* references without a JSON Schema.
|
|
29
|
+
*
|
|
30
|
+
* Path syntax:
|
|
31
|
+
* - 'name' — top-level scalar
|
|
32
|
+
* - 'name[]' — array of strings (rewrite each string item)
|
|
33
|
+
* - 'meta.parent' — dotted nested scalar
|
|
34
|
+
* - 'meta.refs[]' — dotted nested array of strings
|
|
35
|
+
*
|
|
36
|
+
* Missing paths are silent no-ops. Non-string values are skipped.
|
|
37
|
+
*/
|
|
38
|
+
export declare function rewriteFrontmatterFieldsAtPaths(editor: FrontmatterEditor, paths: readonly string[], rewriteHref: RewriteHref): void;
|
|
39
|
+
/**
|
|
40
|
+
* Apply `rewriteHref` to every inline-link and reference-definition href in
|
|
41
|
+
* a markdown body. Parallel to `transformContent` but with a callback model
|
|
42
|
+
* — appropriate for adopter scripts and for any caller that wants a
|
|
43
|
+
* per-href rewrite without rule/template ceremony.
|
|
44
|
+
*
|
|
45
|
+
* `rewriteHref` receives the raw href (including any fragment) and returns
|
|
46
|
+
* the new href. Returning the same string is a no-op for that link.
|
|
47
|
+
*/
|
|
48
|
+
export declare function rewriteBodyLinks(body: string, rewriteHref: RewriteHref): string;
|
|
49
|
+
//# sourceMappingURL=rewriter-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rewriter-helpers.d.ts","sourceRoot":"","sources":["../src/rewriter-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAiBjE,kFAAkF;AAClF,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;AAEnD;;;GAGG;AACH,wBAAgB,yCAAyC,CACvD,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW,GACvB,IAAI,CAmBN;AAuCD;;;;;;;;;;;;GAYG;AACH,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,iBAAiB,EACzB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,WAAW,EAAE,WAAW,GACvB,IAAI,CAWN;AAYD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,GAAG,MAAM,CAW/E"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public rewriter helpers built on FrontmatterEditor and shared callback
|
|
3
|
+
* shape `(href: string) => string`.
|
|
4
|
+
*
|
|
5
|
+
* Three layers:
|
|
6
|
+
* 1. rewriteFrontmatterUriReferencesFromSchema — schema-driven; used by
|
|
7
|
+
* VAT packager and by schema-aware adopter scripts.
|
|
8
|
+
* 2. rewriteFrontmatterFieldsAtPaths — path-driven; used by ad-hoc
|
|
9
|
+
* adopter scripts (no JSON Schema available; field paths known by
|
|
10
|
+
* convention).
|
|
11
|
+
* 3. rewriteBodyLinks — standalone body-side counterpart. Parallel to
|
|
12
|
+
* `transformContent` but with a callback model instead of templates.
|
|
13
|
+
*
|
|
14
|
+
* See docs/superpowers/specs/2026-05-17-frontmatter-editor-and-yaml-consolidation-design.md
|
|
15
|
+
* §6 for the design contract.
|
|
16
|
+
*/
|
|
17
|
+
import { isNode } from 'yaml';
|
|
18
|
+
import { jsonPointerToPath } from './json-pointer-path.js';
|
|
19
|
+
import { walkFrontmatterUriReferences } from './schema-uri-walker.js';
|
|
20
|
+
/**
|
|
21
|
+
* Normalize a value returned by `FrontmatterEditor.get(path)` into plain JS.
|
|
22
|
+
*
|
|
23
|
+
* The underlying yaml library's `getIn(path, false)` unwraps scalar leaves to
|
|
24
|
+
* JS primitives but leaves YAMLMap / YAMLSeq collections as Node instances.
|
|
25
|
+
* The rewriter helpers reason in terms of JS values (arrays, strings), so we
|
|
26
|
+
* unwrap collection Nodes here once at the boundary.
|
|
27
|
+
*/
|
|
28
|
+
function toPlainJs(value) {
|
|
29
|
+
if (isNode(value))
|
|
30
|
+
return value.toJSON();
|
|
31
|
+
return value;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Apply `rewriteHref` to every frontmatter scalar whose schema position has
|
|
35
|
+
* a URI-family `format`. Preserves comments via FrontmatterEditor.
|
|
36
|
+
*/
|
|
37
|
+
export function rewriteFrontmatterUriReferencesFromSchema(editor, schema, rewriteHref) {
|
|
38
|
+
const frontmatter = editor.get([]);
|
|
39
|
+
if (frontmatter === undefined || frontmatter === null)
|
|
40
|
+
return;
|
|
41
|
+
if (typeof frontmatter !== 'object')
|
|
42
|
+
return;
|
|
43
|
+
const captures = walkFrontmatterUriReferences(frontmatter, schema);
|
|
44
|
+
for (const capture of captures) {
|
|
45
|
+
const path = jsonPointerToPath(capture.pointer);
|
|
46
|
+
if (path.length === 0)
|
|
47
|
+
continue;
|
|
48
|
+
const newValue = rewriteHref(capture.value);
|
|
49
|
+
if (newValue === capture.value)
|
|
50
|
+
continue;
|
|
51
|
+
const lastSegment = path.at(-1);
|
|
52
|
+
if (typeof lastSegment === 'number') {
|
|
53
|
+
const parentPath = path.slice(0, -1);
|
|
54
|
+
editor.setArrayItem(parentPath, lastSegment, newValue);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
editor.set(path, newValue);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function parsePathPattern(pattern) {
|
|
62
|
+
const isArray = pattern.endsWith('[]');
|
|
63
|
+
const cleaned = isArray ? pattern.slice(0, -2) : pattern;
|
|
64
|
+
const segments = cleaned.split('.');
|
|
65
|
+
return { segments, isArray };
|
|
66
|
+
}
|
|
67
|
+
function rewriteArrayPath(editor, segments, value, rewriteHref) {
|
|
68
|
+
if (!Array.isArray(value))
|
|
69
|
+
return;
|
|
70
|
+
for (const [i, item] of value.entries()) {
|
|
71
|
+
if (typeof item !== 'string')
|
|
72
|
+
continue;
|
|
73
|
+
const newValue = rewriteHref(item);
|
|
74
|
+
if (newValue !== item)
|
|
75
|
+
editor.setArrayItem(segments, i, newValue);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function rewriteScalarPath(editor, segments, value, rewriteHref) {
|
|
79
|
+
if (typeof value !== 'string')
|
|
80
|
+
return;
|
|
81
|
+
const newValue = rewriteHref(value);
|
|
82
|
+
if (newValue !== value)
|
|
83
|
+
editor.set(segments, newValue);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Apply `rewriteHref` to specific frontmatter fields named by explicit
|
|
87
|
+
* dotted paths. Used by adopter scripts that know which fields hold
|
|
88
|
+
* references without a JSON Schema.
|
|
89
|
+
*
|
|
90
|
+
* Path syntax:
|
|
91
|
+
* - 'name' — top-level scalar
|
|
92
|
+
* - 'name[]' — array of strings (rewrite each string item)
|
|
93
|
+
* - 'meta.parent' — dotted nested scalar
|
|
94
|
+
* - 'meta.refs[]' — dotted nested array of strings
|
|
95
|
+
*
|
|
96
|
+
* Missing paths are silent no-ops. Non-string values are skipped.
|
|
97
|
+
*/
|
|
98
|
+
export function rewriteFrontmatterFieldsAtPaths(editor, paths, rewriteHref) {
|
|
99
|
+
for (const pattern of paths) {
|
|
100
|
+
const { segments, isArray } = parsePathPattern(pattern);
|
|
101
|
+
const value = toPlainJs(editor.get(segments));
|
|
102
|
+
if (value === undefined || value === null)
|
|
103
|
+
continue;
|
|
104
|
+
if (isArray) {
|
|
105
|
+
rewriteArrayPath(editor, segments, value, rewriteHref);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
rewriteScalarPath(editor, segments, value, rewriteHref);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Inline + reference-style link patterns. These match `transformContent`'s
|
|
114
|
+
* regex contract — see content-transform.ts for the rationale on negated
|
|
115
|
+
* character classes.
|
|
116
|
+
*/
|
|
117
|
+
// eslint-disable-next-line sonarjs/slow-regex -- negated character classes [^\]] and [^)] are non-backtracking
|
|
118
|
+
const INLINE_LINK_REGEX = /\[([^\]]*)\]\(([^)]*)\)/g;
|
|
119
|
+
// eslint-disable-next-line sonarjs/slow-regex -- Controlled markdown reference link definitions on line boundaries
|
|
120
|
+
const DEFINITION_LINK_REGEX = /^\[([^\]]*?)\]:\s*(.+)$/gm;
|
|
121
|
+
/**
|
|
122
|
+
* Apply `rewriteHref` to every inline-link and reference-definition href in
|
|
123
|
+
* a markdown body. Parallel to `transformContent` but with a callback model
|
|
124
|
+
* — appropriate for adopter scripts and for any caller that wants a
|
|
125
|
+
* per-href rewrite without rule/template ceremony.
|
|
126
|
+
*
|
|
127
|
+
* `rewriteHref` receives the raw href (including any fragment) and returns
|
|
128
|
+
* the new href. Returning the same string is a no-op for that link.
|
|
129
|
+
*/
|
|
130
|
+
export function rewriteBodyLinks(body, rewriteHref) {
|
|
131
|
+
let out = body.replaceAll(INLINE_LINK_REGEX, (full, text, href) => {
|
|
132
|
+
const next = rewriteHref(href);
|
|
133
|
+
return next === href ? full : `[${text}](${next})`;
|
|
134
|
+
});
|
|
135
|
+
out = out.replaceAll(DEFINITION_LINK_REGEX, (full, ref, href) => {
|
|
136
|
+
const trimmed = href.trim();
|
|
137
|
+
const next = rewriteHref(trimmed);
|
|
138
|
+
return next === trimmed ? full : `[${ref}]: ${next}`;
|
|
139
|
+
});
|
|
140
|
+
return out;
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=rewriter-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rewriter-helpers.js","sourceRoot":"","sources":["../src/rewriter-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Handles markdown, JSON, JSON Schema, and YAML formats.
|
|
6
6
|
*/
|
|
7
7
|
import { promises as fs } from 'node:fs';
|
|
8
|
-
import yaml from '
|
|
8
|
+
import * as yaml from 'yaml';
|
|
9
9
|
import { calculateChecksum } from '../checksum.js';
|
|
10
10
|
import { parseMarkdown } from '../link-parser.js';
|
|
11
11
|
import { isJsonSchema, ResourceType } from './resources.js';
|
|
@@ -157,7 +157,7 @@ export async function parseYamlResource(absolutePath, projectPath, collectionNam
|
|
|
157
157
|
// Read and parse YAML
|
|
158
158
|
// eslint-disable-next-line security/detect-non-literal-fs-filename
|
|
159
159
|
const content = await fs.readFile(absolutePath, 'utf-8');
|
|
160
|
-
const data = yaml.
|
|
160
|
+
const data = yaml.parse(content);
|
|
161
161
|
// Calculate checksum
|
|
162
162
|
const checksum = await calculateChecksum(absolutePath);
|
|
163
163
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-parser.js","sourceRoot":"","sources":["../../src/types/resource-parser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AAEzC,OAAO,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"resource-parser.js","sourceRoot":"","sources":["../../src/types/resource-parser.ts"],"names":[],"mappings":"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"}
|