@doxbrix/doxloop 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.
Files changed (152) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/LICENSE +93 -0
  3. package/README.md +576 -0
  4. package/SECURITY.md +15 -0
  5. package/assets/brand/README.md +8 -0
  6. package/assets/brand/doxloop-favicon.png +0 -0
  7. package/assets/brand/doxloop-logo-dark.png +0 -0
  8. package/assets/brand/doxloop-logo-light.png +0 -0
  9. package/assets/doxbrix-preview.css +6672 -0
  10. package/dist/agents.d.ts +26 -0
  11. package/dist/agents.d.ts.map +1 -0
  12. package/dist/agents.js +258 -0
  13. package/dist/agents.js.map +1 -0
  14. package/dist/args.d.ts +8 -0
  15. package/dist/args.d.ts.map +1 -0
  16. package/dist/args.js +95 -0
  17. package/dist/args.js.map +1 -0
  18. package/dist/artifact-deploy.d.ts +8 -0
  19. package/dist/artifact-deploy.d.ts.map +1 -0
  20. package/dist/artifact-deploy.js +240 -0
  21. package/dist/artifact-deploy.js.map +1 -0
  22. package/dist/auth.d.ts +17 -0
  23. package/dist/auth.d.ts.map +1 -0
  24. package/dist/auth.js +245 -0
  25. package/dist/auth.js.map +1 -0
  26. package/dist/author.d.ts +30 -0
  27. package/dist/author.d.ts.map +1 -0
  28. package/dist/author.js +195 -0
  29. package/dist/author.js.map +1 -0
  30. package/dist/capture.d.ts +10 -0
  31. package/dist/capture.d.ts.map +1 -0
  32. package/dist/capture.js +299 -0
  33. package/dist/capture.js.map +1 -0
  34. package/dist/cli.d.ts +3 -0
  35. package/dist/cli.d.ts.map +1 -0
  36. package/dist/cli.js +558 -0
  37. package/dist/cli.js.map +1 -0
  38. package/dist/deploy.d.ts +22 -0
  39. package/dist/deploy.d.ts.map +1 -0
  40. package/dist/deploy.js +136 -0
  41. package/dist/deploy.js.map +1 -0
  42. package/dist/doctor.d.ts +18 -0
  43. package/dist/doctor.d.ts.map +1 -0
  44. package/dist/doctor.js +222 -0
  45. package/dist/doctor.js.map +1 -0
  46. package/dist/doxbrix-markdown.d.ts +20 -0
  47. package/dist/doxbrix-markdown.d.ts.map +1 -0
  48. package/dist/doxbrix-markdown.js +873 -0
  49. package/dist/doxbrix-markdown.js.map +1 -0
  50. package/dist/errors.d.ts +8 -0
  51. package/dist/errors.d.ts.map +1 -0
  52. package/dist/errors.js +15 -0
  53. package/dist/errors.js.map +1 -0
  54. package/dist/fs.d.ts +6 -0
  55. package/dist/fs.d.ts.map +1 -0
  56. package/dist/fs.js +77 -0
  57. package/dist/fs.js.map +1 -0
  58. package/dist/generator-api.d.ts +69 -0
  59. package/dist/generator-api.d.ts.map +1 -0
  60. package/dist/generator-api.js +6 -0
  61. package/dist/generator-api.js.map +1 -0
  62. package/dist/generator-manager.d.ts +13 -0
  63. package/dist/generator-manager.d.ts.map +1 -0
  64. package/dist/generator-manager.js +155 -0
  65. package/dist/generator-manager.js.map +1 -0
  66. package/dist/generator-runtime.d.ts +24 -0
  67. package/dist/generator-runtime.d.ts.map +1 -0
  68. package/dist/generator-runtime.js +265 -0
  69. package/dist/generator-runtime.js.map +1 -0
  70. package/dist/generators.d.ts +21 -0
  71. package/dist/generators.d.ts.map +1 -0
  72. package/dist/generators.js +202 -0
  73. package/dist/generators.js.map +1 -0
  74. package/dist/preview.d.ts +21 -0
  75. package/dist/preview.d.ts.map +1 -0
  76. package/dist/preview.js +691 -0
  77. package/dist/preview.js.map +1 -0
  78. package/dist/progress.d.ts +19 -0
  79. package/dist/progress.d.ts.map +1 -0
  80. package/dist/progress.js +70 -0
  81. package/dist/progress.js.map +1 -0
  82. package/dist/project.d.ts +37 -0
  83. package/dist/project.d.ts.map +1 -0
  84. package/dist/project.js +499 -0
  85. package/dist/project.js.map +1 -0
  86. package/dist/sync.d.ts +7 -0
  87. package/dist/sync.d.ts.map +1 -0
  88. package/dist/sync.js +221 -0
  89. package/dist/sync.js.map +1 -0
  90. package/dist/types.d.ts +141 -0
  91. package/dist/types.d.ts.map +1 -0
  92. package/dist/types.js +2 -0
  93. package/dist/types.js.map +1 -0
  94. package/dist/validation.d.ts +4 -0
  95. package/dist/validation.d.ts.map +1 -0
  96. package/dist/validation.js +478 -0
  97. package/dist/validation.js.map +1 -0
  98. package/dist/version.d.ts +3 -0
  99. package/dist/version.d.ts.map +1 -0
  100. package/dist/version.js +5 -0
  101. package/dist/version.js.map +1 -0
  102. package/docs/agent-compatibility.md +41 -0
  103. package/docs/ci-and-automation.md +56 -0
  104. package/docs/doxbrix-http-api.md +182 -0
  105. package/docs/generator-authoring.md +59 -0
  106. package/docs/generator-selection.md +25 -0
  107. package/docs/project-format.md +97 -0
  108. package/docs/security-model.md +90 -0
  109. package/docs/troubleshooting.md +103 -0
  110. package/package.json +87 -0
  111. package/skills/doxloop-authoring/SKILL.md +381 -0
  112. package/skills/doxloop-authoring/agents/openai.yaml +4 -0
  113. package/skills/doxloop-authoring/assets/screenshot-highlight.js +83 -0
  114. package/skills/doxloop-authoring/references/accessibility.md +54 -0
  115. package/skills/doxloop-authoring/references/audience-flavors.md +93 -0
  116. package/skills/doxloop-authoring/references/branding.md +50 -0
  117. package/skills/doxloop-authoring/references/documentation-types.md +236 -0
  118. package/skills/doxloop-authoring/references/domain-ai-ml.md +67 -0
  119. package/skills/doxloop-authoring/references/domain-api-platform.md +68 -0
  120. package/skills/doxloop-authoring/references/domain-cli-tool.md +65 -0
  121. package/skills/doxloop-authoring/references/domain-data-platform.md +65 -0
  122. package/skills/doxloop-authoring/references/domain-developer-library.md +63 -0
  123. package/skills/doxloop-authoring/references/domain-ecommerce.md +63 -0
  124. package/skills/doxloop-authoring/references/domain-infrastructure-devops.md +67 -0
  125. package/skills/doxloop-authoring/references/domain-payments-fintech.md +69 -0
  126. package/skills/doxloop-authoring/references/domain-saas.md +71 -0
  127. package/skills/doxloop-authoring/references/domain-security-identity.md +65 -0
  128. package/skills/doxloop-authoring/references/editorial-style.md +105 -0
  129. package/skills/doxloop-authoring/references/examples-and-evidence.md +71 -0
  130. package/skills/doxloop-authoring/references/navigation-architecture.md +152 -0
  131. package/skills/doxloop-authoring/references/project-format.md +119 -0
  132. package/skills/doxloop-authoring/references/quality.md +122 -0
  133. package/skills/doxloop-authoring/references/reference-sites.md +207 -0
  134. package/skills/doxloop-authoring/references/screenshots.md +251 -0
  135. package/skills/doxloop-authoring/references/template-routing.md +94 -0
  136. package/skills/doxloop-authoring/references/type-administrator-guide.md +59 -0
  137. package/skills/doxloop-authoring/references/type-api-reference.md +66 -0
  138. package/skills/doxloop-authoring/references/type-architecture-concepts.md +61 -0
  139. package/skills/doxloop-authoring/references/type-cli-manual.md +61 -0
  140. package/skills/doxloop-authoring/references/type-deployment-operations.md +64 -0
  141. package/skills/doxloop-authoring/references/type-developer-portal.md +69 -0
  142. package/skills/doxloop-authoring/references/type-getting-started.md +59 -0
  143. package/skills/doxloop-authoring/references/type-integration-guide.md +59 -0
  144. package/skills/doxloop-authoring/references/type-migration-release.md +66 -0
  145. package/skills/doxloop-authoring/references/type-sdk-guide.md +63 -0
  146. package/skills/doxloop-authoring/references/type-troubleshooting-kb.md +63 -0
  147. package/skills/doxloop-authoring/references/type-user-guide.md +59 -0
  148. package/skills/doxloop-doxbrix/SKILL.md +83 -0
  149. package/skills/doxloop-doxbrix/agents/openai.yaml +4 -0
  150. package/skills/doxloop-doxbrix/references/api-endpoints.md +128 -0
  151. package/skills/doxloop-doxbrix/references/components.md +137 -0
  152. package/skills/doxloop-doxbrix/references/manifest.md +117 -0
@@ -0,0 +1,478 @@
1
+ import { access, readFile } from 'node:fs/promises';
2
+ import { dirname, extname, join, relative, resolve } from 'node:path';
3
+ import { pathExists, resolveContainedDirectory } from './fs.js';
4
+ import { loadGeneratorAdapter } from './generators.js';
5
+ import { loadPages, loadProject, loadSiteConfig, pageId, readPage, relativePath, siteConfigPath, } from './project.js';
6
+ export async function validateProject(root) {
7
+ const issues = [];
8
+ const project = await loadProject(root);
9
+ const contentRoot = await resolveContainedDirectory(root, project.contentDir, 'Validation content directory');
10
+ const files = await loadPages(root, project);
11
+ const pages = files.map((path) => pageId(contentRoot, path));
12
+ const pageSet = new Set(pages);
13
+ const adapter = project.generator === 'doxbrix'
14
+ ? undefined
15
+ : await loadGeneratorAdapter(root, project);
16
+ if (project.generator === 'doxbrix') {
17
+ const site = await loadSiteConfig(root, project);
18
+ const configFile = relativePath(root, await siteConfigPath(root, project));
19
+ validateDoxbrixNavigation(site.spaces, pageSet, pages, configFile, issues);
20
+ await validateDoxbrixTheme(site.theme, contentRoot, configFile, issues);
21
+ }
22
+ else {
23
+ issues.push(...(await adapter.validate({
24
+ root,
25
+ contentRoot,
26
+ project,
27
+ pages: files,
28
+ pageIds: pages,
29
+ })));
30
+ }
31
+ for (const path of files) {
32
+ const file = relativePath(root, path);
33
+ const raw = await readFile(path, 'utf8');
34
+ const page = adapter?.readPage ? await adapter.readPage(path) : await readPage(path);
35
+ if (page.title === '') {
36
+ issues.push(error('missing-title', 'Page frontmatter needs a title.', file));
37
+ }
38
+ if (page.description === undefined || page.description === '') {
39
+ issues.push(error('missing-description', 'Page frontmatter needs an outcome-focused description.', file));
40
+ }
41
+ if (page.body.trim() === '') {
42
+ issues.push(error('empty-page', 'Page content cannot be empty.', file));
43
+ }
44
+ if ((adapter?.project.contentFormat ?? 'markdown') === 'markdown') {
45
+ const fences = raw.match(/^```/gm)?.length ?? 0;
46
+ if (fences % 2 !== 0) {
47
+ issues.push(error('code-fence', 'Code fences are not balanced.', file));
48
+ }
49
+ }
50
+ if (project.generator === 'doxbrix') {
51
+ issues.push(...validateDoxbrixComponents(raw, file));
52
+ }
53
+ issues.push(...validateProfessionalContent(page.body, raw, file));
54
+ if ((adapter?.project.contentFormat ?? 'markdown') === 'markdown') {
55
+ issues.push(...(await validateLinks(path, contentRoot, raw, root, adapter)));
56
+ }
57
+ }
58
+ const errors = issues.filter((issue) => issue.severity === 'error').length;
59
+ const warnings = issues.length - errors;
60
+ return { issues, pages, errors, warnings };
61
+ }
62
+ function validateDoxbrixNavigation(spaces, pageSet, pages, configFile, issues) {
63
+ const navigation = new Set();
64
+ if (spaces.length === 0) {
65
+ issues.push(error('navigation-spaces', 'Doxbrix docs.json needs at least one space.', configFile));
66
+ }
67
+ const visit = (nodes, location) => {
68
+ for (const [index, node] of nodes.entries()) {
69
+ const nodeLocation = `${location} item ${index + 1}`;
70
+ if (!node || typeof node !== 'object' || typeof node.type !== 'string') {
71
+ issues.push(error('navigation-node', `${nodeLocation} is invalid.`, configFile));
72
+ continue;
73
+ }
74
+ if (node.type === 'page') {
75
+ if (typeof node.file !== 'string' || node.file.trim() === '') {
76
+ issues.push(error('navigation-page', `${nodeLocation} needs a page file.`, configFile));
77
+ continue;
78
+ }
79
+ if (navigation.has(node.file)) {
80
+ issues.push(error('duplicate-navigation', `"${node.file}" appears more than once.`, configFile));
81
+ }
82
+ navigation.add(node.file);
83
+ if (!pageSet.has(node.file)) {
84
+ issues.push(error('missing-page', `Navigation references missing page "${node.file}".`, configFile));
85
+ }
86
+ }
87
+ else if (node.type === 'group') {
88
+ if (typeof node.label !== 'string' || !Array.isArray(node.items)) {
89
+ issues.push(error('navigation-group', `${nodeLocation} needs a label and items array.`, configFile));
90
+ continue;
91
+ }
92
+ visit(node.items, `group "${node.label}"`);
93
+ }
94
+ else if (!['label', 'divider', 'link', 'api'].includes(node.type)) {
95
+ issues.push(error('navigation-node', `${nodeLocation} has unsupported type "${node.type}".`, configFile));
96
+ }
97
+ }
98
+ };
99
+ for (const [index, space] of spaces.entries()) {
100
+ if (typeof space.name !== 'string' || !Array.isArray(space.nav)) {
101
+ issues.push(error('navigation-space', `Space ${index + 1} must have a name and nav array.`, configFile));
102
+ continue;
103
+ }
104
+ visit(space.nav, `space "${space.name}"`);
105
+ }
106
+ for (const id of pages) {
107
+ if (!navigation.has(id)) {
108
+ issues.push(error('unnavigated-page', `Page "${id}" is not in Doxbrix navigation.`));
109
+ }
110
+ }
111
+ }
112
+ async function validateDoxbrixTheme(value, contentRoot, configFile, issues) {
113
+ if (value === undefined)
114
+ return;
115
+ if (value === 'light' || value === 'dark' || value === 'system')
116
+ return;
117
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
118
+ issues.push(error('theme-config', 'Doxbrix theme must be an object.', configFile));
119
+ return;
120
+ }
121
+ const theme = value;
122
+ const colorKeys = [
123
+ 'primaryColor',
124
+ 'lightColor',
125
+ 'darkColor',
126
+ 'backgroundColorLight',
127
+ 'backgroundColorDark',
128
+ ];
129
+ for (const key of colorKeys) {
130
+ const color = theme[key];
131
+ if (color !== undefined && (typeof color !== 'string' || !/^#[0-9a-f]{6}$/i.test(color))) {
132
+ issues.push(error('theme-color', `Doxbrix theme.${key} must be a six-digit hex color.`, configFile));
133
+ }
134
+ }
135
+ if (theme.mode !== undefined &&
136
+ !['light', 'dark', 'system'].includes(String(theme.mode))) {
137
+ issues.push(error('theme-mode', 'Doxbrix theme.mode must be light, dark, or system.', configFile));
138
+ }
139
+ for (const key of ['font', 'headingFont', 'codeFont']) {
140
+ const font = theme[key];
141
+ if (font !== undefined && (typeof font !== 'string' || font.trim() === '')) {
142
+ issues.push(error('theme-font', `Doxbrix theme.${key} must be a font-family name.`, configFile));
143
+ }
144
+ }
145
+ if (theme.logoHref !== undefined &&
146
+ (typeof theme.logoHref !== 'string' || !isThemeAssetReference(theme.logoHref))) {
147
+ issues.push(error('theme-link', 'Doxbrix theme.logoHref must be an HTTPS or root-relative URL.', configFile));
148
+ }
149
+ for (const key of [
150
+ 'logoLight',
151
+ 'logoDark',
152
+ 'favicon',
153
+ 'faviconLight',
154
+ 'faviconDark',
155
+ 'backgroundImage',
156
+ ]) {
157
+ const asset = theme[key];
158
+ if (asset === undefined)
159
+ continue;
160
+ if (typeof asset !== 'string' || !isThemeAssetReference(asset)) {
161
+ issues.push(error('theme-asset', `Doxbrix theme.${key} must be an HTTPS or root-relative asset path.`, configFile));
162
+ continue;
163
+ }
164
+ if (asset.startsWith('/') && !(await localThemeAssetExists(contentRoot, asset))) {
165
+ issues.push(error('missing-theme-asset', `Doxbrix theme.${key} is missing "${asset}".`, configFile));
166
+ }
167
+ }
168
+ if (theme.fontSources !== undefined && !Array.isArray(theme.fontSources)) {
169
+ issues.push(error('theme-font-source', 'Doxbrix theme.fontSources must be an array.', configFile));
170
+ return;
171
+ }
172
+ for (const [index, entry] of (theme.fontSources ?? []).entries()) {
173
+ if (!entry || typeof entry !== 'object') {
174
+ issues.push(error('theme-font-source', `Doxbrix font source ${index + 1} is invalid.`, configFile));
175
+ continue;
176
+ }
177
+ const source = entry;
178
+ if (typeof source.family !== 'string' ||
179
+ source.family.trim() === '' ||
180
+ typeof source.source !== 'string' ||
181
+ !isThemeAssetReference(source.source)) {
182
+ issues.push(error('theme-font-source', `Doxbrix font source ${index + 1} needs a family and HTTPS or root-relative source.`, configFile));
183
+ continue;
184
+ }
185
+ if (source.source.startsWith('/') &&
186
+ !(await localThemeAssetExists(contentRoot, source.source))) {
187
+ issues.push(error('missing-theme-asset', `Doxbrix font source ${index + 1} is missing "${source.source}".`, configFile));
188
+ }
189
+ }
190
+ }
191
+ function isThemeAssetReference(value) {
192
+ return value.startsWith('/') || /^https:\/\//i.test(value);
193
+ }
194
+ async function localThemeAssetExists(contentRoot, reference) {
195
+ const path = resolve(contentRoot, `.${reference}`);
196
+ if (relative(contentRoot, path).startsWith('..'))
197
+ return false;
198
+ return pathExists(path);
199
+ }
200
+ const DOXBRIX_CONTAINER_COMPONENTS = [
201
+ 'Info',
202
+ 'Note',
203
+ 'Tip',
204
+ 'Check',
205
+ 'Warning',
206
+ 'Danger',
207
+ 'Steps',
208
+ 'Step',
209
+ 'Tabs',
210
+ 'Tab',
211
+ 'Accordion',
212
+ 'AccordionGroup',
213
+ 'AccordionItem',
214
+ 'Expandable',
215
+ 'CardGroup',
216
+ 'Card',
217
+ 'Columns',
218
+ 'Column',
219
+ 'CodeGroup',
220
+ 'Terminal',
221
+ 'Frame',
222
+ 'Update',
223
+ 'Mermaid',
224
+ 'Math',
225
+ 'ApiEndpoint',
226
+ 'Param',
227
+ 'Response',
228
+ 'ParameterTable',
229
+ 'ResponseExample',
230
+ ];
231
+ function validateDoxbrixComponents(content, file) {
232
+ const issues = [];
233
+ const withoutFences = content.replace(/```[\s\S]*?```/g, '');
234
+ for (const name of DOXBRIX_CONTAINER_COMPONENTS) {
235
+ const openings = withoutFences.match(new RegExp(`<${name}(?:\\s[^>]*)?(?<!/)>`, 'g'))?.length ?? 0;
236
+ const closings = withoutFences.match(new RegExp(`</${name}>`, 'g'))?.length ?? 0;
237
+ if (openings !== closings) {
238
+ issues.push(error('component-tag', `<${name}> tags are not balanced (${openings} opening, ${closings} closing).`, file));
239
+ }
240
+ }
241
+ issues.push(...validateDoxbrixApiEndpoints(withoutFences, file));
242
+ return issues;
243
+ }
244
+ function validateDoxbrixApiEndpoints(content, file) {
245
+ const issues = [];
246
+ for (const [index, match] of [
247
+ ...content.matchAll(/<ApiEndpoint\b([^>]*)>([\s\S]*?)<\/ApiEndpoint>/g),
248
+ ].entries()) {
249
+ const label = `API endpoint ${index + 1}`;
250
+ const attributes = componentAttributes(match[1] ?? '');
251
+ const body = match[2] ?? '';
252
+ const method = stringAttribute(attributes.method).toUpperCase();
253
+ const path = stringAttribute(attributes.path);
254
+ const baseUrl = stringAttribute(attributes.baseUrl);
255
+ if (!['GET', 'POST', 'PUT', 'PATCH', 'DELETE'].includes(method)) {
256
+ issues.push(error('api-endpoint-method', `${label} needs method GET, POST, PUT, PATCH, or DELETE.`, file));
257
+ }
258
+ if (!path.startsWith('/')) {
259
+ issues.push(error('api-endpoint-path', `${label} needs an absolute API path beginning with "/".`, file));
260
+ }
261
+ if (!/^https?:\/\/[^/\s]+/i.test(baseUrl)) {
262
+ issues.push(error('api-endpoint-base-url', `${label} needs an absolute HTTP or HTTPS baseUrl so Doxbrix can generate the request example.`, file));
263
+ }
264
+ if (stringAttribute(attributes.summary) === '' ||
265
+ stringAttribute(attributes.description) === '') {
266
+ issues.push(warning('api-endpoint-description', `${label} should include both summary and description attributes.`, file));
267
+ }
268
+ const pathParameters = new Set();
269
+ const paramPattern = /<Param\b([^>]*)>([\s\S]*?)<\/Param>/g;
270
+ for (const [paramIndex, paramMatch] of [
271
+ ...body.matchAll(paramPattern),
272
+ ].entries()) {
273
+ const param = componentAttributes(paramMatch[1] ?? '');
274
+ const name = stringAttribute(param.name);
275
+ const location = stringAttribute(param.in);
276
+ const type = stringAttribute(param.type);
277
+ if (name === '' || type === '' || !['path', 'query', 'header', 'body'].includes(location)) {
278
+ issues.push(error('api-endpoint-param', `${label} parameter ${paramIndex + 1} needs name, type, and in="path|query|header|body".`, file));
279
+ }
280
+ if (location === 'path') {
281
+ pathParameters.add(name);
282
+ if (!trueAttribute(param.required)) {
283
+ issues.push(error('api-endpoint-path-param', `${label} path parameter "${name}" must set required.`, file));
284
+ }
285
+ }
286
+ if (stringAttribute(param.example) === '') {
287
+ issues.push(warning('api-endpoint-param-example', `${label} parameter "${name || paramIndex + 1}" should include a verified example for the generated request.`, file));
288
+ }
289
+ }
290
+ for (const placeholder of path.matchAll(/\{([^}]+)}/g)) {
291
+ const name = placeholder[1] ?? '';
292
+ if (!pathParameters.has(name)) {
293
+ issues.push(error('api-endpoint-path-param', `${label} path placeholder "{${name}}" needs a matching required <Param in="path">.`, file));
294
+ }
295
+ }
296
+ const responses = [...body.matchAll(/<Response\b([^>]*)>([\s\S]*?)<\/Response>/g)];
297
+ if (responses.length === 0) {
298
+ issues.push(error('api-endpoint-response', `${label} needs at least one <Response> with a verified example body.`, file));
299
+ }
300
+ for (const [responseIndex, responseMatch] of responses.entries()) {
301
+ const response = componentAttributes(responseMatch[1] ?? '');
302
+ const status = stringAttribute(response.status);
303
+ if (!/^\d{3}$/.test(status)) {
304
+ issues.push(error('api-endpoint-response', `${label} response ${responseIndex + 1} needs a numeric status such as status={200}.`, file));
305
+ }
306
+ if (stringAttribute(response.contentType) === '' ||
307
+ stringAttribute(response.description) === '') {
308
+ issues.push(warning('api-endpoint-response-metadata', `${label} response ${status || responseIndex + 1} should include contentType and description.`, file));
309
+ }
310
+ if ((responseMatch[2] ?? '').trim() === '') {
311
+ issues.push(error('api-endpoint-response', `${label} response ${status || responseIndex + 1} needs an example body.`, file));
312
+ }
313
+ }
314
+ }
315
+ return issues;
316
+ }
317
+ function componentAttributes(source) {
318
+ const attributes = {};
319
+ const pattern = /([A-Za-z_][\w-]*)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|\{([^}]*)\}))?/g;
320
+ for (const match of source.matchAll(pattern)) {
321
+ const name = match[1];
322
+ if (name === undefined)
323
+ continue;
324
+ attributes[name] =
325
+ match[2] ?? match[3] ?? match[4]?.trim().replace(/^['"]|['"]$/g, '') ?? true;
326
+ }
327
+ return attributes;
328
+ }
329
+ function stringAttribute(value) {
330
+ return typeof value === 'string' ? value.trim() : '';
331
+ }
332
+ function trueAttribute(value) {
333
+ return value === true || value === 'true';
334
+ }
335
+ function validateProfessionalContent(body, raw, file) {
336
+ const issues = [];
337
+ const prose = stripCodeFences(body);
338
+ if (/(?:<!--|\{\/\*)\s*doxloop:starter-page\s*(?:-->|\*\/\})/i.test(prose) ||
339
+ /\b(?:replace this starter|the authoring agent will replace this starter)\b/i.test(prose)) {
340
+ issues.push(error('starter-content', 'Replace generated starter content before validation or publishing.', file));
341
+ }
342
+ if (/^\s*(?:TODO|TBD|FIXME)(?:\s*:|\b)/im.test(prose)) {
343
+ issues.push(error('unresolved-placeholder', 'Resolve TODO, TBD, or FIXME placeholder content.', file));
344
+ }
345
+ const secretPatterns = [
346
+ {
347
+ pattern: /-----BEGIN (?:RSA |EC |OPENSSH )?PRIVATE KEY-----/,
348
+ label: 'private key',
349
+ },
350
+ { pattern: /\bAKIA[0-9A-Z]{16}\b/, label: 'AWS access key' },
351
+ {
352
+ pattern: /\bgh[pousr]_[A-Za-z0-9]{36,}\b/,
353
+ label: 'GitHub token',
354
+ },
355
+ ];
356
+ for (const secret of secretPatterns) {
357
+ if (secret.pattern.test(raw)) {
358
+ issues.push(error('sensitive-content', `Remove the apparent ${secret.label} from reader-facing content.`, file));
359
+ }
360
+ }
361
+ if (/\/(?:Users|home)\/[A-Za-z0-9._-]+\//.test(prose) ||
362
+ /[A-Za-z]:\\Users\\[^\\\s]+\\/i.test(prose)) {
363
+ issues.push(error('private-path', 'Replace the local user path with a portable placeholder or project-relative path.', file));
364
+ }
365
+ for (const match of prose.matchAll(/<img\b[^>]*>/gi)) {
366
+ if (!/\balt\s*=/i.test(match[0])) {
367
+ issues.push(error('missing-image-alt', 'HTML images need an alt attribute.', file));
368
+ }
369
+ }
370
+ if (/!\[\s*]\([^)]+\)/.test(prose)) {
371
+ issues.push(warning('empty-image-alt', 'Confirm that every image with empty alternative text is decorative.', file));
372
+ }
373
+ for (const match of prose.matchAll(/(?<!!)\[([^\]]+)]\([^)]+\)/g)) {
374
+ const label = match[1]?.trim().toLowerCase();
375
+ if (label !== undefined &&
376
+ ['click here', 'here', 'read more', 'learn more', 'this link'].includes(label)) {
377
+ issues.push(warning('weak-link-text', `Replace vague link text "${match[1]}" with a descriptive destination or action.`, file));
378
+ }
379
+ }
380
+ let previousHeading = 0;
381
+ for (const match of prose.matchAll(/^(#{1,6})\s+\S.*$/gm)) {
382
+ const level = match[1]?.length ?? 0;
383
+ if (previousHeading > 0 && level > previousHeading + 1) {
384
+ issues.push(warning('heading-order', `Heading level jumps from h${previousHeading} to h${level}.`, file));
385
+ }
386
+ previousHeading = level;
387
+ }
388
+ let insideFence = false;
389
+ for (const line of body.split(/\r?\n/)) {
390
+ const fence = line.match(/^```(.*)$/);
391
+ if (!fence)
392
+ continue;
393
+ if (!insideFence && fence[1]?.trim() === '') {
394
+ issues.push(warning('code-language', 'Add a language identifier to the fenced code block when known.', file));
395
+ }
396
+ insideFence = !insideFence;
397
+ }
398
+ return issues;
399
+ }
400
+ function stripCodeFences(content) {
401
+ return content.replace(/```[\s\S]*?```/g, '');
402
+ }
403
+ async function validateLinks(pagePath, contentRoot, content, projectRoot, adapter) {
404
+ const issues = [];
405
+ const pattern = /!?\[[^\]]*]\(([^)\s]+)(?:\s+["'][^"']*["'])?\)/g;
406
+ for (const match of content.matchAll(pattern)) {
407
+ const href = match[1];
408
+ if (href === undefined ||
409
+ href.startsWith('#') ||
410
+ /^[a-z][a-z0-9+.-]*:/i.test(href)) {
411
+ continue;
412
+ }
413
+ let decoded;
414
+ try {
415
+ decoded = decodeURIComponent(href.split('#')[0] ?? '');
416
+ }
417
+ catch {
418
+ issues.push(error('invalid-link', `Local link is not valid URL syntax: ${href}`, relativePath(projectRoot, pagePath)));
419
+ continue;
420
+ }
421
+ if (decoded === '')
422
+ continue;
423
+ const base = decoded.startsWith('/')
424
+ ? resolve(contentRoot, `.${decoded}`)
425
+ : resolve(dirname(pagePath), decoded);
426
+ const candidates = extname(base) === ''
427
+ ? [base, `${base}.md`, `${base}.mdx`, join(base, 'index.md'), join(base, 'index.mdx')]
428
+ : [base];
429
+ const generatorAsset = adapter?.resolveLocalAsset?.({
430
+ root: projectRoot,
431
+ contentRoot,
432
+ pagePath,
433
+ reference: decoded,
434
+ });
435
+ if (generatorAsset)
436
+ candidates.push(generatorAsset);
437
+ let found = false;
438
+ for (const candidate of candidates) {
439
+ const relation = relative(contentRoot, candidate);
440
+ const projectRelation = relative(projectRoot, candidate);
441
+ if (relation.startsWith('..') &&
442
+ (candidate !== generatorAsset || projectRelation.startsWith('..'))) {
443
+ continue;
444
+ }
445
+ try {
446
+ await access(candidate);
447
+ found = true;
448
+ break;
449
+ }
450
+ catch {
451
+ // Try the next supported form.
452
+ }
453
+ }
454
+ if (!found) {
455
+ issues.push(error('broken-link', `Local link target does not exist: ${decoded}`, relativePath(projectRoot, pagePath)));
456
+ }
457
+ }
458
+ return issues;
459
+ }
460
+ export function formatValidation(result) {
461
+ const lines = result.issues.map((issue) => {
462
+ const location = issue.file ? `${issue.file}: ` : '';
463
+ return `${issue.severity === 'error' ? 'error' : 'warning'} ${issue.code} ${location}${issue.message}`;
464
+ });
465
+ lines.push(`${result.pages.length} page${result.pages.length === 1 ? '' : 's'}, ${result.errors} error${result.errors === 1 ? '' : 's'}, ${result.warnings} warning${result.warnings === 1 ? '' : 's'}`);
466
+ return lines.join('\n');
467
+ }
468
+ function error(code, message, file) {
469
+ return file === undefined
470
+ ? { severity: 'error', code, message }
471
+ : { severity: 'error', code, message, file };
472
+ }
473
+ function warning(code, message, file) {
474
+ return file === undefined
475
+ ? { severity: 'warning', code, message }
476
+ : { severity: 'warning', code, message, file };
477
+ }
478
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const PACKAGE_NAME: string;
2
+ export declare const VERSION: string;
3
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,YAAY,QAAgB,CAAA;AACzC,eAAO,MAAM,OAAO,QAAmB,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { readFileSync } from 'node:fs';
2
+ const metadata = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8'));
3
+ export const PACKAGE_NAME = metadata.name;
4
+ export const VERSION = metadata.version;
5
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAEtC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CACzB,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAC7B,CAAA;AAEtC,MAAM,CAAC,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAA;AACzC,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAA"}
@@ -0,0 +1,41 @@
1
+ # Agent compatibility
2
+
3
+ Doxloop supports Codex, Claude Code, and Gemini CLI. It discovers executables on
4
+ `PATH` or accepts an explicit `--agent`.
5
+
6
+ ## Invocation modes
7
+
8
+ | Workflow | Codex | Claude Code | Gemini CLI |
9
+ | --- | --- | --- | --- |
10
+ | Create/update | Interactive prompt | Interactive prompt | Interactive `-i` prompt |
11
+ | Review | Read-only ephemeral execution | Print with plan permissions | Plan approval mode |
12
+ | External IDE | `--print` prepared prompt | `--print` prepared prompt | `--print` prepared prompt |
13
+
14
+ Review is deliberately non-interactive so it can remain read-only. Create may
15
+ pause once for consolidated reader or scope decisions.
16
+
17
+ Doxloop forwards `--model` using each CLI's native model option. The
18
+ `--reasoning` option is Codex-only and accepts `minimal`, `low`, `medium`,
19
+ `high`, or `xhigh`.
20
+
21
+ ## Project skills
22
+
23
+ Initialization installs the shared authoring skill and selected format skill
24
+ under `.agents/skills` for Codex and Gemini and `.claude/skills` for Claude
25
+ Code. Use:
26
+
27
+ ```bash
28
+ doxloop agent status
29
+ doxloop agent update
30
+ ```
31
+
32
+ `review` does not install or replace skills because that would mutate the
33
+ project. Run `doxloop agent setup` before review if skills were removed.
34
+
35
+ ## Compatibility policy
36
+
37
+ Agent CLIs evolve independently. Release checks validate argument construction,
38
+ and optional real-agent evaluations exercise installed CLIs. A release should
39
+ record the tested CLI versions in its release notes. When an invocation fails,
40
+ run the agent directly to confirm its installed version and then use
41
+ `doxloop create --print` as a version-independent fallback.
@@ -0,0 +1,56 @@
1
+ # CI and automation
2
+
3
+ Deterministic validation is suitable for pull requests. Agent authoring is
4
+ optional because it may require credentials, model access, and interactive
5
+ decisions.
6
+
7
+ ## Validate in CI
8
+
9
+ ```bash
10
+ pnpm install --frozen-lockfile
11
+ doxloop test
12
+ ```
13
+
14
+ `doxloop test` exits with status 1 when validation errors remain. Warnings are
15
+ reported but do not change the exit status.
16
+
17
+ Use structured output when another tool consumes the result:
18
+
19
+ ```bash
20
+ doxloop test --format json > doxloop-validation.json
21
+ doxloop status --format json
22
+ ```
23
+
24
+ Run the selected generator's strict build after Doxloop validation. Obtain the
25
+ command and output directory with:
26
+
27
+ ```bash
28
+ doxloop generator doctor
29
+ doxloop generator info <generator>
30
+ ```
31
+
32
+ ## Agent evaluations
33
+
34
+ ```bash
35
+ pnpm eval:agents -- --agent codex --case cli
36
+ ```
37
+
38
+ Real-agent evaluations run reviews in read-only/plan mode. A case must:
39
+
40
+ - exit successfully;
41
+ - identify the required behavior signals;
42
+ - cite enough configured source evidence;
43
+ - prioritize findings;
44
+ - report a score out of 100; and
45
+ - leave the fixture project byte-for-byte unchanged.
46
+
47
+ Evaluation output is written below the Git-ignored `evals/results/` directory.
48
+ Use a scheduled or manually approved job for model-backed evaluations; keep the
49
+ deterministic typecheck, tests, skill validation, build, and package checks on
50
+ every pull request.
51
+
52
+ ## Publishing
53
+
54
+ Never run `doxloop deploy` in an untrusted pull-request context. Use protected
55
+ environments and short-lived or scoped credentials. Run `doxloop deploy
56
+ --dry-run` before an approved deployment.