benjamin-docs 0.1.0
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/LICENSE +21 -0
- package/README.md +352 -0
- package/dist/src/anchors.d.ts +1 -0
- package/dist/src/anchors.js +50 -0
- package/dist/src/anchors.js.map +1 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +231 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/constants.d.ts +12 -0
- package/dist/src/constants.js +13 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/export.d.ts +1 -0
- package/dist/src/export.js +70 -0
- package/dist/src/export.js.map +1 -0
- package/dist/src/frontmatter.d.ts +3 -0
- package/dist/src/frontmatter.js +119 -0
- package/dist/src/frontmatter.js.map +1 -0
- package/dist/src/fsx.d.ts +14 -0
- package/dist/src/fsx.js +129 -0
- package/dist/src/fsx.js.map +1 -0
- package/dist/src/info.d.ts +3 -0
- package/dist/src/info.js +65 -0
- package/dist/src/info.js.map +1 -0
- package/dist/src/init.d.ts +12 -0
- package/dist/src/init.js +145 -0
- package/dist/src/init.js.map +1 -0
- package/dist/src/next.d.ts +2 -0
- package/dist/src/next.js +65 -0
- package/dist/src/next.js.map +1 -0
- package/dist/src/project-config.d.ts +6 -0
- package/dist/src/project-config.js +41 -0
- package/dist/src/project-config.js.map +1 -0
- package/dist/src/scopes.d.ts +1 -0
- package/dist/src/scopes.js +52 -0
- package/dist/src/scopes.js.map +1 -0
- package/dist/src/status.d.ts +1 -0
- package/dist/src/status.js +38 -0
- package/dist/src/status.js.map +1 -0
- package/dist/src/templates.d.ts +19 -0
- package/dist/src/templates.js +82 -0
- package/dist/src/templates.js.map +1 -0
- package/dist/src/types.d.ts +51 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/validate.d.ts +5 -0
- package/dist/src/validate.js +542 -0
- package/dist/src/validate.js.map +1 -0
- package/package.json +45 -0
- package/skills/benjamin-docs/SKILL.md +129 -0
|
@@ -0,0 +1,542 @@
|
|
|
1
|
+
import { existsSync, lstatSync, readdirSync, readFileSync, realpathSync, statSync } from "node:fs";
|
|
2
|
+
import { dirname, isAbsolute, join, normalize, relative, resolve, sep, win32 } from "node:path";
|
|
3
|
+
import { ANCHORS_FILE, CONFIG_DIR, CONFIG_FILE, DEFAULT_DOCS_ROOT, KNOWN_FOCUS_TYPES, KNOWN_SCOPES, KNOWN_STATUSES, MANIFEST_FILE, SCOPES_FILE } from "./constants.js";
|
|
4
|
+
import { parseMarkdown } from "./frontmatter.js";
|
|
5
|
+
import { readJson, rootPath } from "./fsx.js";
|
|
6
|
+
import { isSafeDocsRoot, normalizeConfig } from "./project-config.js";
|
|
7
|
+
const ANCHOR_ID_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
8
|
+
export function validateProject(root) {
|
|
9
|
+
const resolvedRoot = resolve(root);
|
|
10
|
+
const errors = [];
|
|
11
|
+
const warnings = [];
|
|
12
|
+
const realRoot = resolveRealPath(resolvedRoot, "Project root", resolvedRoot, errors) ?? resolvedRoot;
|
|
13
|
+
const metadataRoot = rootPath(resolvedRoot, CONFIG_DIR);
|
|
14
|
+
const metadataRootIsSafe = validateMetadataRoot(realRoot, metadataRoot, errors);
|
|
15
|
+
const rawConfig = metadataRootIsSafe
|
|
16
|
+
? readMetadataFile(resolvedRoot, realRoot, join(CONFIG_DIR, CONFIG_FILE), errors)
|
|
17
|
+
: undefined;
|
|
18
|
+
const config = rawConfig ? normalizeConfig(rawConfig) : undefined;
|
|
19
|
+
const manifest = metadataRootIsSafe
|
|
20
|
+
? readMetadataFile(resolvedRoot, realRoot, join(CONFIG_DIR, MANIFEST_FILE), errors)
|
|
21
|
+
: undefined;
|
|
22
|
+
const scopes = metadataRootIsSafe
|
|
23
|
+
? readMetadataFile(resolvedRoot, realRoot, join(CONFIG_DIR, SCOPES_FILE), errors)
|
|
24
|
+
: undefined;
|
|
25
|
+
const anchors = metadataRootIsSafe
|
|
26
|
+
? readMetadataFile(resolvedRoot, realRoot, join(CONFIG_DIR, ANCHORS_FILE), errors)
|
|
27
|
+
: undefined;
|
|
28
|
+
if (config)
|
|
29
|
+
validateConfig(config, errors);
|
|
30
|
+
if (manifest)
|
|
31
|
+
validateManifest(resolvedRoot, realRoot, manifest, errors);
|
|
32
|
+
if (scopes)
|
|
33
|
+
validateScopes(resolvedRoot, realRoot, scopes, errors);
|
|
34
|
+
const docsRootName = config?.docsRoot ?? DEFAULT_DOCS_ROOT;
|
|
35
|
+
const docsRoot = resolveProjectPath(resolvedRoot, docsRootName, `${docsRootName}/`, errors);
|
|
36
|
+
const docs = docsRoot && validateDocsRoot(realRoot, docsRoot, docsRootName, errors) ? findMarkdownFiles(resolvedRoot, realRoot, docsRoot, errors) : [];
|
|
37
|
+
const managedDocs = manifest ? new Set(manifest.docs.map(normalizeProjectPath)) : undefined;
|
|
38
|
+
if (docs.length === 0)
|
|
39
|
+
warnings.push(`No Markdown docs found under ${docsRootName}/`);
|
|
40
|
+
for (const doc of docs) {
|
|
41
|
+
const relativeDoc = toProjectPath(resolvedRoot, doc);
|
|
42
|
+
if (!managedDocs || managedDocs.has(relativeDoc)) {
|
|
43
|
+
validateMarkdownDoc(resolvedRoot, realRoot, doc, errors);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
validateMarkdownPath(resolvedRoot, realRoot, doc, errors);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (anchors)
|
|
50
|
+
validateAnchors(resolvedRoot, realRoot, anchors, errors);
|
|
51
|
+
return { errors, warnings };
|
|
52
|
+
}
|
|
53
|
+
function readMetadataFile(root, realRoot, relativePath, errors) {
|
|
54
|
+
const fullPath = rootPath(root, relativePath);
|
|
55
|
+
try {
|
|
56
|
+
lstatSync(fullPath);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
if (isNotFoundError(error)) {
|
|
60
|
+
errors.push(`Missing required file: ${relativePath}`);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
errors.push(`${relativePath}: could not be inspected: ${error instanceof Error ? error.message : String(error)}`);
|
|
64
|
+
}
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
const realTarget = resolveRealPath(fullPath, `${relativePath} target`, relativePath, errors);
|
|
68
|
+
if (!realTarget)
|
|
69
|
+
return undefined;
|
|
70
|
+
if (!isInsideRoot(realRoot, realTarget)) {
|
|
71
|
+
errors.push(`${relativePath} must remain inside project root`);
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
if (!safeStatIsFile(realTarget)) {
|
|
75
|
+
errors.push(`Required metadata path is not a file: ${relativePath}`);
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
return readJson(fullPath);
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
errors.push(`${relativePath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function validateMetadataRoot(realRoot, metadataRoot, errors) {
|
|
87
|
+
let stat;
|
|
88
|
+
try {
|
|
89
|
+
stat = lstatSync(metadataRoot);
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
if (isNotFoundError(error))
|
|
93
|
+
return true;
|
|
94
|
+
errors.push(`${CONFIG_DIR}/: could not be inspected: ${error instanceof Error ? error.message : String(error)}`);
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
const realMetadataRoot = resolveRealPath(metadataRoot, `${CONFIG_DIR}/`, `${CONFIG_DIR}/`, errors);
|
|
98
|
+
if (!realMetadataRoot)
|
|
99
|
+
return false;
|
|
100
|
+
if (!isInsideRoot(realRoot, realMetadataRoot)) {
|
|
101
|
+
errors.push(`${CONFIG_DIR}/ must remain inside project root`);
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
if (stat.isSymbolicLink() && !safeStatIsDirectory(realMetadataRoot)) {
|
|
105
|
+
errors.push(`${CONFIG_DIR}/ symlink target must be a directory`);
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
if (!stat.isSymbolicLink() && !stat.isDirectory()) {
|
|
109
|
+
errors.push(`${CONFIG_DIR}/ must be a directory`);
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
function validateConfig(config, errors) {
|
|
115
|
+
if (!isRecord(config)) {
|
|
116
|
+
errors.push(`${CONFIG_DIR}/${CONFIG_FILE}: expected an object`);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
if (config.version !== 1)
|
|
120
|
+
errors.push(`${CONFIG_DIR}/${CONFIG_FILE}: version must be 1`);
|
|
121
|
+
if (config.mode !== "planning" && config.mode !== "codebase") {
|
|
122
|
+
errors.push(`${CONFIG_DIR}/${CONFIG_FILE}: mode must be planning or codebase`);
|
|
123
|
+
}
|
|
124
|
+
if (!isSafeDocsRoot(config.docsRoot)) {
|
|
125
|
+
errors.push(`${CONFIG_DIR}/${CONFIG_FILE}: docsRoot must be a safe relative path`);
|
|
126
|
+
}
|
|
127
|
+
if (!KNOWN_FOCUS_TYPES.includes(config.focus)) {
|
|
128
|
+
errors.push(`${CONFIG_DIR}/${CONFIG_FILE}: focus must be project, codebase, or feature`);
|
|
129
|
+
}
|
|
130
|
+
if (config.feature !== undefined && typeof config.feature !== "string") {
|
|
131
|
+
errors.push(`${CONFIG_DIR}/${CONFIG_FILE}: feature must be a string`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
function validateManifest(root, realRoot, manifest, errors) {
|
|
135
|
+
if (!isRecord(manifest)) {
|
|
136
|
+
errors.push(`${CONFIG_DIR}/${MANIFEST_FILE}: expected an object`);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
if (manifest.version !== 1)
|
|
140
|
+
errors.push(`${CONFIG_DIR}/${MANIFEST_FILE}: version must be 1`);
|
|
141
|
+
if (!Array.isArray(manifest.docs)) {
|
|
142
|
+
errors.push(`${CONFIG_DIR}/${MANIFEST_FILE}: docs must be an array`);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
manifest.docs.forEach((doc, index) => {
|
|
146
|
+
if (typeof doc !== "string" || doc.length === 0) {
|
|
147
|
+
errors.push(`${CONFIG_DIR}/${MANIFEST_FILE}: docs[${index}] must be a non-empty string`);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
const fullPath = resolveProjectPath(root, doc, `Manifest doc`, errors);
|
|
151
|
+
if (!fullPath)
|
|
152
|
+
return;
|
|
153
|
+
if (!existsSync(fullPath)) {
|
|
154
|
+
errors.push(`Manifest doc is missing: ${doc}`);
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
if (!safeStatIsFile(fullPath)) {
|
|
158
|
+
errors.push(`Manifest doc is not a file: ${doc}`);
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
const realDoc = resolveRealPath(fullPath, `Manifest doc target`, doc, errors);
|
|
162
|
+
if (realDoc && !isInsideRoot(realRoot, realDoc)) {
|
|
163
|
+
errors.push(`Manifest doc must remain inside project root: ${doc}`);
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
function validateScopes(root, realRoot, scopes, errors) {
|
|
168
|
+
if (!isRecord(scopes)) {
|
|
169
|
+
errors.push(`${CONFIG_DIR}/${SCOPES_FILE}: expected an object`);
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
if (scopes.version !== 1)
|
|
173
|
+
errors.push(`${CONFIG_DIR}/${SCOPES_FILE}: version must be 1`);
|
|
174
|
+
if (!Array.isArray(scopes.scopes)) {
|
|
175
|
+
errors.push(`${CONFIG_DIR}/${SCOPES_FILE}: scopes must be an array`);
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
const seenScopeIds = new Set();
|
|
179
|
+
scopes.scopes.forEach((scope, index) => {
|
|
180
|
+
if (!isScopeRecord(scope)) {
|
|
181
|
+
errors.push(`${CONFIG_DIR}/${SCOPES_FILE}: scopes[${index}] must be a scope record`);
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
if (seenScopeIds.has(scope.id))
|
|
185
|
+
errors.push(`Duplicate scope id: ${scope.id}`);
|
|
186
|
+
seenScopeIds.add(scope.id);
|
|
187
|
+
if (!KNOWN_SCOPES.includes(scope.kind)) {
|
|
188
|
+
errors.push(`Scope ${scope.id} has unknown kind: ${scope.kind}`);
|
|
189
|
+
}
|
|
190
|
+
if (!KNOWN_STATUSES.includes(scope.status)) {
|
|
191
|
+
errors.push(`Scope ${scope.id} has unknown status: ${scope.status}`);
|
|
192
|
+
}
|
|
193
|
+
const fullPath = resolveProjectPath(root, scope.path, `Scope ${scope.id} path`, errors);
|
|
194
|
+
if (!fullPath)
|
|
195
|
+
return;
|
|
196
|
+
if (!existsSync(fullPath)) {
|
|
197
|
+
errors.push(`Scope path is missing: ${scope.path}`);
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
validatePathInsideRoot(realRoot, fullPath, `Scope ${scope.id} path`, scope.path, errors);
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
function validateMarkdownDoc(root, realRoot, fullPath, errors) {
|
|
204
|
+
const relativePath = toProjectPath(root, fullPath);
|
|
205
|
+
if (!validateMarkdownPath(root, realRoot, fullPath, errors))
|
|
206
|
+
return;
|
|
207
|
+
let content;
|
|
208
|
+
try {
|
|
209
|
+
content = readFileSync(fullPath, "utf8");
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
errors.push(`${relativePath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
try {
|
|
216
|
+
const parsed = parseMarkdown(content);
|
|
217
|
+
validateLinks(root, realRoot, relativePath, parsed.body, errors);
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
errors.push(`${relativePath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
function validateMarkdownPath(root, realRoot, fullPath, errors) {
|
|
224
|
+
const relativePath = toProjectPath(root, fullPath);
|
|
225
|
+
let stat;
|
|
226
|
+
try {
|
|
227
|
+
stat = lstatSync(fullPath);
|
|
228
|
+
}
|
|
229
|
+
catch (error) {
|
|
230
|
+
errors.push(`${relativePath}: could not be inspected: ${error instanceof Error ? error.message : String(error)}`);
|
|
231
|
+
return false;
|
|
232
|
+
}
|
|
233
|
+
if (stat.isSymbolicLink()) {
|
|
234
|
+
const realTarget = resolveRealPath(fullPath, `${relativePath}: symlink target`, relativePath, errors);
|
|
235
|
+
if (!realTarget)
|
|
236
|
+
return false;
|
|
237
|
+
if (!isInsideRoot(realRoot, realTarget)) {
|
|
238
|
+
errors.push(`${relativePath}: symlink target must remain inside project root`);
|
|
239
|
+
return false;
|
|
240
|
+
}
|
|
241
|
+
if (!safeStatIsFile(realTarget)) {
|
|
242
|
+
errors.push(`${relativePath}: symlink target is not a file`);
|
|
243
|
+
return false;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
else if (!stat.isFile()) {
|
|
247
|
+
errors.push(`${relativePath}: Markdown path is not a file`);
|
|
248
|
+
return false;
|
|
249
|
+
}
|
|
250
|
+
return true;
|
|
251
|
+
}
|
|
252
|
+
function validateLinks(root, realRoot, docPath, body, errors) {
|
|
253
|
+
const linkPattern = /!?\[[^\]]*]\(([^)]+)\)/g;
|
|
254
|
+
for (const match of body.matchAll(linkPattern)) {
|
|
255
|
+
const rawTarget = match[1];
|
|
256
|
+
const target = extractLinkTarget(rawTarget);
|
|
257
|
+
if (!target || isNonRelativeLink(target))
|
|
258
|
+
continue;
|
|
259
|
+
const pathPart = stripFragmentAndQuery(target);
|
|
260
|
+
if (!pathPart)
|
|
261
|
+
continue;
|
|
262
|
+
const decodedPath = decodeLinkPath(pathPart);
|
|
263
|
+
const targetPath = resolveProjectPath(root, join(dirname(docPath), decodedPath), `${docPath}: link`, errors);
|
|
264
|
+
if (!targetPath) {
|
|
265
|
+
errors.push(`${docPath}: broken link ${target}`);
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
if (!existsSync(targetPath)) {
|
|
269
|
+
errors.push(`${docPath}: broken link ${target}`);
|
|
270
|
+
continue;
|
|
271
|
+
}
|
|
272
|
+
const realTarget = resolveRealPath(targetPath, `${docPath}: link target`, target, errors);
|
|
273
|
+
if (!realTarget)
|
|
274
|
+
continue;
|
|
275
|
+
if (!isInsideRoot(realRoot, realTarget)) {
|
|
276
|
+
errors.push(`${docPath}: link must remain inside project root: ${target}`);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
function validateAnchors(root, realRoot, anchors, errors) {
|
|
281
|
+
if (!isRecord(anchors)) {
|
|
282
|
+
errors.push(`${CONFIG_DIR}/${ANCHORS_FILE}: expected an object`);
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
if (anchors.version !== 1)
|
|
286
|
+
errors.push(`${CONFIG_DIR}/${ANCHORS_FILE}: version must be 1`);
|
|
287
|
+
if (!isRecord(anchors.anchors)) {
|
|
288
|
+
errors.push(`${CONFIG_DIR}/${ANCHORS_FILE}: anchors must be an object`);
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
for (const [id, anchor] of Object.entries(anchors.anchors)) {
|
|
292
|
+
if (!ANCHOR_ID_PATTERN.test(id)) {
|
|
293
|
+
errors.push(`Invalid anchor id: ${id}`);
|
|
294
|
+
}
|
|
295
|
+
if (!isAnchorRecord(anchor)) {
|
|
296
|
+
errors.push(`${CONFIG_DIR}/${ANCHORS_FILE}: anchor ${id} must contain a file and docs array`);
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
299
|
+
validateAnchorFile(root, realRoot, id, anchor.file, errors);
|
|
300
|
+
for (const doc of anchor.docs)
|
|
301
|
+
validateAnchorDoc(root, realRoot, id, doc, errors);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
function validateAnchorFile(root, realRoot, id, file, errors) {
|
|
305
|
+
const fullPath = resolveAnchorPath(root, file, "anchor file", errors);
|
|
306
|
+
if (!fullPath)
|
|
307
|
+
return;
|
|
308
|
+
if (!existsSync(fullPath)) {
|
|
309
|
+
errors.push(`Anchor ${id} points to missing file: ${file}`);
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
let isRegularFile = false;
|
|
313
|
+
try {
|
|
314
|
+
isRegularFile = statSync(fullPath).isFile();
|
|
315
|
+
}
|
|
316
|
+
catch (error) {
|
|
317
|
+
errors.push(`Anchor ${id} file could not be inspected: ${file}: ${error instanceof Error ? error.message : String(error)}`);
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
if (!isRegularFile) {
|
|
321
|
+
errors.push(`Anchor ${id} file must be a regular file: ${file}`);
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
let realTarget;
|
|
325
|
+
try {
|
|
326
|
+
realTarget = realpathSync(fullPath);
|
|
327
|
+
}
|
|
328
|
+
catch (error) {
|
|
329
|
+
errors.push(`Anchor ${id} file could not be resolved: ${file}: ${error instanceof Error ? error.message : String(error)}`);
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
332
|
+
if (!isInsideRoot(realRoot, realTarget)) {
|
|
333
|
+
errors.push(`Anchor ${id} file must remain inside project root: ${file}`);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
function validateAnchorDoc(root, realRoot, id, doc, errors) {
|
|
337
|
+
const fullPath = resolveAnchorPath(root, doc, "anchor docs path", errors);
|
|
338
|
+
if (!fullPath)
|
|
339
|
+
return;
|
|
340
|
+
if (!existsSync(fullPath)) {
|
|
341
|
+
errors.push(`Anchor ${id} points to missing doc: ${doc}`);
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
if (!safeStatIsFile(fullPath)) {
|
|
345
|
+
errors.push(`Anchor ${id} doc is not a file: ${doc}`);
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
348
|
+
validatePathInsideRoot(realRoot, fullPath, `Anchor ${id} doc`, doc, errors);
|
|
349
|
+
}
|
|
350
|
+
function resolveAnchorPath(root, path, label, errors) {
|
|
351
|
+
if (!path || path.includes("\\") || win32.isAbsolute(path) || hasDotSegment(path)) {
|
|
352
|
+
errors.push(`Invalid ${label}: ${path}`);
|
|
353
|
+
return undefined;
|
|
354
|
+
}
|
|
355
|
+
return resolveProjectPath(root, path, label, errors);
|
|
356
|
+
}
|
|
357
|
+
function validatePathInsideRoot(realRoot, fullPath, label, displayPath, errors) {
|
|
358
|
+
const realTarget = resolveRealPath(fullPath, `${label} target`, displayPath, errors);
|
|
359
|
+
if (!realTarget)
|
|
360
|
+
return false;
|
|
361
|
+
if (!isInsideRoot(realRoot, realTarget)) {
|
|
362
|
+
errors.push(`${label} must remain inside project root: ${displayPath}`);
|
|
363
|
+
return false;
|
|
364
|
+
}
|
|
365
|
+
return true;
|
|
366
|
+
}
|
|
367
|
+
function resolveProjectPath(root, path, label, errors) {
|
|
368
|
+
if (!path || isAbsolute(path)) {
|
|
369
|
+
errors.push(`${label} must be a relative project path: ${path}`);
|
|
370
|
+
return undefined;
|
|
371
|
+
}
|
|
372
|
+
try {
|
|
373
|
+
return rootPath(root, path);
|
|
374
|
+
}
|
|
375
|
+
catch {
|
|
376
|
+
errors.push(`${label} must remain inside project root: ${path}`);
|
|
377
|
+
return undefined;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
function validateDocsRoot(realRoot, docsRoot, docsRootName, errors) {
|
|
381
|
+
let stat;
|
|
382
|
+
try {
|
|
383
|
+
stat = lstatSync(docsRoot);
|
|
384
|
+
}
|
|
385
|
+
catch (error) {
|
|
386
|
+
if (isNotFoundError(error))
|
|
387
|
+
return true;
|
|
388
|
+
errors.push(`${docsRootName}/: could not be inspected: ${error instanceof Error ? error.message : String(error)}`);
|
|
389
|
+
return false;
|
|
390
|
+
}
|
|
391
|
+
const realDocsRoot = resolveRealPath(docsRoot, `${docsRootName}/`, `${docsRootName}/`, errors);
|
|
392
|
+
if (!realDocsRoot)
|
|
393
|
+
return false;
|
|
394
|
+
if (!isInsideRoot(realRoot, realDocsRoot)) {
|
|
395
|
+
errors.push(`${docsRootName}/ must remain inside project root`);
|
|
396
|
+
return false;
|
|
397
|
+
}
|
|
398
|
+
if (stat.isSymbolicLink() && !safeStatIsDirectory(realDocsRoot)) {
|
|
399
|
+
errors.push(`${docsRootName}/ symlink target must be a directory`);
|
|
400
|
+
return false;
|
|
401
|
+
}
|
|
402
|
+
if (!stat.isSymbolicLink() && !stat.isDirectory()) {
|
|
403
|
+
errors.push(`${docsRootName}/ must be a directory`);
|
|
404
|
+
return false;
|
|
405
|
+
}
|
|
406
|
+
return true;
|
|
407
|
+
}
|
|
408
|
+
function findMarkdownFiles(root, realRoot, dir, errors) {
|
|
409
|
+
if (!existsSync(dir))
|
|
410
|
+
return [];
|
|
411
|
+
const files = [];
|
|
412
|
+
let entries;
|
|
413
|
+
try {
|
|
414
|
+
entries = readdirSync(dir);
|
|
415
|
+
}
|
|
416
|
+
catch (error) {
|
|
417
|
+
errors.push(`${toProjectPath(root, dir)}: could not be read: ${error instanceof Error ? error.message : String(error)}`);
|
|
418
|
+
return files;
|
|
419
|
+
}
|
|
420
|
+
for (const entry of entries) {
|
|
421
|
+
const fullPath = join(dir, entry);
|
|
422
|
+
let stat;
|
|
423
|
+
try {
|
|
424
|
+
stat = lstatSync(fullPath);
|
|
425
|
+
}
|
|
426
|
+
catch (error) {
|
|
427
|
+
errors.push(`${toProjectPath(root, fullPath)}: could not be inspected: ${error instanceof Error ? error.message : String(error)}`);
|
|
428
|
+
continue;
|
|
429
|
+
}
|
|
430
|
+
if (stat.isSymbolicLink()) {
|
|
431
|
+
if (fullPath.endsWith(".md"))
|
|
432
|
+
files.push(fullPath);
|
|
433
|
+
else
|
|
434
|
+
validateSymlinkDirectory(root, realRoot, fullPath, errors);
|
|
435
|
+
continue;
|
|
436
|
+
}
|
|
437
|
+
if (stat.isDirectory())
|
|
438
|
+
files.push(...findMarkdownFiles(root, realRoot, fullPath, errors));
|
|
439
|
+
if (stat.isFile() && fullPath.endsWith(".md"))
|
|
440
|
+
files.push(fullPath);
|
|
441
|
+
}
|
|
442
|
+
return files.sort();
|
|
443
|
+
}
|
|
444
|
+
function validateSymlinkDirectory(root, realRoot, fullPath, errors) {
|
|
445
|
+
const relativePath = toProjectPath(root, fullPath);
|
|
446
|
+
const realTarget = resolveRealPath(fullPath, `${relativePath}: symlink target`, relativePath, errors);
|
|
447
|
+
if (!realTarget)
|
|
448
|
+
return;
|
|
449
|
+
if (!isInsideRoot(realRoot, realTarget)) {
|
|
450
|
+
errors.push(`${relativePath}: symlink target must remain inside project root`);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
function extractLinkTarget(rawTarget) {
|
|
454
|
+
const trimmed = rawTarget.trim();
|
|
455
|
+
if (trimmed.startsWith("<")) {
|
|
456
|
+
const end = trimmed.indexOf(">");
|
|
457
|
+
return end === -1 ? trimmed : trimmed.slice(1, end);
|
|
458
|
+
}
|
|
459
|
+
const whitespace = trimmed.search(/\s/);
|
|
460
|
+
return whitespace === -1 ? trimmed : trimmed.slice(0, whitespace);
|
|
461
|
+
}
|
|
462
|
+
function stripFragmentAndQuery(target) {
|
|
463
|
+
return target.split("#", 1)[0].split("?", 1)[0];
|
|
464
|
+
}
|
|
465
|
+
function decodeLinkPath(path) {
|
|
466
|
+
try {
|
|
467
|
+
return decodeURI(path);
|
|
468
|
+
}
|
|
469
|
+
catch {
|
|
470
|
+
return path;
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
function isNonRelativeLink(target) {
|
|
474
|
+
return target.startsWith("#") || target.startsWith("/") || target.startsWith("//") || /^[a-z][a-z0-9+.-]*:/i.test(target);
|
|
475
|
+
}
|
|
476
|
+
function safeStatIsFile(path) {
|
|
477
|
+
try {
|
|
478
|
+
return statSync(path).isFile();
|
|
479
|
+
}
|
|
480
|
+
catch {
|
|
481
|
+
return false;
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
function safeStatIsDirectory(path) {
|
|
485
|
+
try {
|
|
486
|
+
return statSync(path).isDirectory();
|
|
487
|
+
}
|
|
488
|
+
catch {
|
|
489
|
+
return false;
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
function resolveRealPath(fullPath, label, displayPath, errors) {
|
|
493
|
+
try {
|
|
494
|
+
return realpathSync(fullPath);
|
|
495
|
+
}
|
|
496
|
+
catch (error) {
|
|
497
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
498
|
+
if (message.includes("ENOENT")) {
|
|
499
|
+
errors.push(`${label} is missing: ${displayPath}`);
|
|
500
|
+
return undefined;
|
|
501
|
+
}
|
|
502
|
+
errors.push(`${label} could not be resolved: ${displayPath}: ${message}`);
|
|
503
|
+
return undefined;
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
function isNotFoundError(error) {
|
|
507
|
+
return isRecord(error) && error.code === "ENOENT";
|
|
508
|
+
}
|
|
509
|
+
function toProjectPath(root, fullPath) {
|
|
510
|
+
return normalize(relative(root, fullPath)).split(sep).join("/");
|
|
511
|
+
}
|
|
512
|
+
function normalizeProjectPath(path) {
|
|
513
|
+
return normalize(path).split(sep).join("/");
|
|
514
|
+
}
|
|
515
|
+
function isInsideRoot(root, target) {
|
|
516
|
+
const relativePath = relative(root, target);
|
|
517
|
+
return relativePath === "" || (!relativePath.startsWith(`..${sep}`) && relativePath !== ".." && !isAbsolute(relativePath));
|
|
518
|
+
}
|
|
519
|
+
function isRecord(value) {
|
|
520
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
521
|
+
}
|
|
522
|
+
function hasDotSegment(path) {
|
|
523
|
+
return path.split("/").some((part) => part === "." || part === ".." || part === "");
|
|
524
|
+
}
|
|
525
|
+
function isScopeRecord(value) {
|
|
526
|
+
return (isRecord(value) &&
|
|
527
|
+
typeof value.id === "string" &&
|
|
528
|
+
value.id.length > 0 &&
|
|
529
|
+
typeof value.kind === "string" &&
|
|
530
|
+
typeof value.title === "string" &&
|
|
531
|
+
typeof value.path === "string" &&
|
|
532
|
+
value.path.length > 0 &&
|
|
533
|
+
typeof value.status === "string");
|
|
534
|
+
}
|
|
535
|
+
function isAnchorRecord(value) {
|
|
536
|
+
return (isRecord(value) &&
|
|
537
|
+
typeof value.file === "string" &&
|
|
538
|
+
value.file.length > 0 &&
|
|
539
|
+
Array.isArray(value.docs) &&
|
|
540
|
+
value.docs.every((doc) => typeof doc === "string" && doc.length > 0));
|
|
541
|
+
}
|
|
542
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/validate.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "benjamin-docs",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Repo-local project memory for humans and AI agents.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"ai",
|
|
7
|
+
"agents",
|
|
8
|
+
"documentation",
|
|
9
|
+
"project-memory",
|
|
10
|
+
"cli"
|
|
11
|
+
],
|
|
12
|
+
"homepage": "https://github.com/msiksnis/benjamin-docs#readme",
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/msiksnis/benjamin-docs/issues"
|
|
15
|
+
},
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "git+https://github.com/msiksnis/benjamin-docs.git"
|
|
19
|
+
},
|
|
20
|
+
"type": "module",
|
|
21
|
+
"bin": {
|
|
22
|
+
"benjamin-docs": "./dist/src/cli.js"
|
|
23
|
+
},
|
|
24
|
+
"files": [
|
|
25
|
+
"dist/src",
|
|
26
|
+
"skills",
|
|
27
|
+
"README.md",
|
|
28
|
+
"LICENSE"
|
|
29
|
+
],
|
|
30
|
+
"engines": {
|
|
31
|
+
"node": ">=22"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@types/node": "25.9.1",
|
|
35
|
+
"typescript": "6.0.3"
|
|
36
|
+
},
|
|
37
|
+
"license": "MIT",
|
|
38
|
+
"scripts": {
|
|
39
|
+
"build": "tsc -p tsconfig.json",
|
|
40
|
+
"test": "node --test dist/test/**/*.test.js",
|
|
41
|
+
"typecheck": "tsc --noEmit",
|
|
42
|
+
"check": "pnpm typecheck && pnpm build && pnpm test",
|
|
43
|
+
"release:check": "pnpm check && node dist/src/cli.js validate && npm pack --dry-run"
|
|
44
|
+
}
|
|
45
|
+
}
|