@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.
- package/CHANGELOG.md +34 -0
- package/LICENSE +93 -0
- package/README.md +576 -0
- package/SECURITY.md +15 -0
- package/assets/brand/README.md +8 -0
- package/assets/brand/doxloop-favicon.png +0 -0
- package/assets/brand/doxloop-logo-dark.png +0 -0
- package/assets/brand/doxloop-logo-light.png +0 -0
- package/assets/doxbrix-preview.css +6672 -0
- package/dist/agents.d.ts +26 -0
- package/dist/agents.d.ts.map +1 -0
- package/dist/agents.js +258 -0
- package/dist/agents.js.map +1 -0
- package/dist/args.d.ts +8 -0
- package/dist/args.d.ts.map +1 -0
- package/dist/args.js +95 -0
- package/dist/args.js.map +1 -0
- package/dist/artifact-deploy.d.ts +8 -0
- package/dist/artifact-deploy.d.ts.map +1 -0
- package/dist/artifact-deploy.js +240 -0
- package/dist/artifact-deploy.js.map +1 -0
- package/dist/auth.d.ts +17 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +245 -0
- package/dist/auth.js.map +1 -0
- package/dist/author.d.ts +30 -0
- package/dist/author.d.ts.map +1 -0
- package/dist/author.js +195 -0
- package/dist/author.js.map +1 -0
- package/dist/capture.d.ts +10 -0
- package/dist/capture.d.ts.map +1 -0
- package/dist/capture.js +299 -0
- package/dist/capture.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +558 -0
- package/dist/cli.js.map +1 -0
- package/dist/deploy.d.ts +22 -0
- package/dist/deploy.d.ts.map +1 -0
- package/dist/deploy.js +136 -0
- package/dist/deploy.js.map +1 -0
- package/dist/doctor.d.ts +18 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +222 -0
- package/dist/doctor.js.map +1 -0
- package/dist/doxbrix-markdown.d.ts +20 -0
- package/dist/doxbrix-markdown.d.ts.map +1 -0
- package/dist/doxbrix-markdown.js +873 -0
- package/dist/doxbrix-markdown.js.map +1 -0
- package/dist/errors.d.ts +8 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +15 -0
- package/dist/errors.js.map +1 -0
- package/dist/fs.d.ts +6 -0
- package/dist/fs.d.ts.map +1 -0
- package/dist/fs.js +77 -0
- package/dist/fs.js.map +1 -0
- package/dist/generator-api.d.ts +69 -0
- package/dist/generator-api.d.ts.map +1 -0
- package/dist/generator-api.js +6 -0
- package/dist/generator-api.js.map +1 -0
- package/dist/generator-manager.d.ts +13 -0
- package/dist/generator-manager.d.ts.map +1 -0
- package/dist/generator-manager.js +155 -0
- package/dist/generator-manager.js.map +1 -0
- package/dist/generator-runtime.d.ts +24 -0
- package/dist/generator-runtime.d.ts.map +1 -0
- package/dist/generator-runtime.js +265 -0
- package/dist/generator-runtime.js.map +1 -0
- package/dist/generators.d.ts +21 -0
- package/dist/generators.d.ts.map +1 -0
- package/dist/generators.js +202 -0
- package/dist/generators.js.map +1 -0
- package/dist/preview.d.ts +21 -0
- package/dist/preview.d.ts.map +1 -0
- package/dist/preview.js +691 -0
- package/dist/preview.js.map +1 -0
- package/dist/progress.d.ts +19 -0
- package/dist/progress.d.ts.map +1 -0
- package/dist/progress.js +70 -0
- package/dist/progress.js.map +1 -0
- package/dist/project.d.ts +37 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project.js +499 -0
- package/dist/project.js.map +1 -0
- package/dist/sync.d.ts +7 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +221 -0
- package/dist/sync.js.map +1 -0
- package/dist/types.d.ts +141 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +4 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +478 -0
- package/dist/validation.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/docs/agent-compatibility.md +41 -0
- package/docs/ci-and-automation.md +56 -0
- package/docs/doxbrix-http-api.md +182 -0
- package/docs/generator-authoring.md +59 -0
- package/docs/generator-selection.md +25 -0
- package/docs/project-format.md +97 -0
- package/docs/security-model.md +90 -0
- package/docs/troubleshooting.md +103 -0
- package/package.json +87 -0
- package/skills/doxloop-authoring/SKILL.md +381 -0
- package/skills/doxloop-authoring/agents/openai.yaml +4 -0
- package/skills/doxloop-authoring/assets/screenshot-highlight.js +83 -0
- package/skills/doxloop-authoring/references/accessibility.md +54 -0
- package/skills/doxloop-authoring/references/audience-flavors.md +93 -0
- package/skills/doxloop-authoring/references/branding.md +50 -0
- package/skills/doxloop-authoring/references/documentation-types.md +236 -0
- package/skills/doxloop-authoring/references/domain-ai-ml.md +67 -0
- package/skills/doxloop-authoring/references/domain-api-platform.md +68 -0
- package/skills/doxloop-authoring/references/domain-cli-tool.md +65 -0
- package/skills/doxloop-authoring/references/domain-data-platform.md +65 -0
- package/skills/doxloop-authoring/references/domain-developer-library.md +63 -0
- package/skills/doxloop-authoring/references/domain-ecommerce.md +63 -0
- package/skills/doxloop-authoring/references/domain-infrastructure-devops.md +67 -0
- package/skills/doxloop-authoring/references/domain-payments-fintech.md +69 -0
- package/skills/doxloop-authoring/references/domain-saas.md +71 -0
- package/skills/doxloop-authoring/references/domain-security-identity.md +65 -0
- package/skills/doxloop-authoring/references/editorial-style.md +105 -0
- package/skills/doxloop-authoring/references/examples-and-evidence.md +71 -0
- package/skills/doxloop-authoring/references/navigation-architecture.md +152 -0
- package/skills/doxloop-authoring/references/project-format.md +119 -0
- package/skills/doxloop-authoring/references/quality.md +122 -0
- package/skills/doxloop-authoring/references/reference-sites.md +207 -0
- package/skills/doxloop-authoring/references/screenshots.md +251 -0
- package/skills/doxloop-authoring/references/template-routing.md +94 -0
- package/skills/doxloop-authoring/references/type-administrator-guide.md +59 -0
- package/skills/doxloop-authoring/references/type-api-reference.md +66 -0
- package/skills/doxloop-authoring/references/type-architecture-concepts.md +61 -0
- package/skills/doxloop-authoring/references/type-cli-manual.md +61 -0
- package/skills/doxloop-authoring/references/type-deployment-operations.md +64 -0
- package/skills/doxloop-authoring/references/type-developer-portal.md +69 -0
- package/skills/doxloop-authoring/references/type-getting-started.md +59 -0
- package/skills/doxloop-authoring/references/type-integration-guide.md +59 -0
- package/skills/doxloop-authoring/references/type-migration-release.md +66 -0
- package/skills/doxloop-authoring/references/type-sdk-guide.md +63 -0
- package/skills/doxloop-authoring/references/type-troubleshooting-kb.md +63 -0
- package/skills/doxloop-authoring/references/type-user-guide.md +59 -0
- package/skills/doxloop-doxbrix/SKILL.md +83 -0
- package/skills/doxloop-doxbrix/agents/openai.yaml +4 -0
- package/skills/doxloop-doxbrix/references/api-endpoints.md +128 -0
- package/skills/doxloop-doxbrix/references/components.md +137 -0
- package/skills/doxloop-doxbrix/references/manifest.md +117 -0
package/dist/deploy.js
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { apiUrl, authenticatedRequest, authenticatedRequestOptional, } from './auth.js';
|
|
3
|
+
import { DoxloopError } from './errors.js';
|
|
4
|
+
import { listFiles, resolveContainedDirectory } from './fs.js';
|
|
5
|
+
import { deployGeneratedSite } from './artifact-deploy.js';
|
|
6
|
+
import { loadPages, loadProject, loadSiteConfig, relativePath, } from './project.js';
|
|
7
|
+
import { createStepList, formatDuration } from './progress.js';
|
|
8
|
+
import { validateProject } from './validation.js';
|
|
9
|
+
const MEDIA_EXTENSIONS = new Set([
|
|
10
|
+
'.avif',
|
|
11
|
+
'.bmp',
|
|
12
|
+
'.eot',
|
|
13
|
+
'.gif',
|
|
14
|
+
'.ico',
|
|
15
|
+
'.jpeg',
|
|
16
|
+
'.jpg',
|
|
17
|
+
'.mov',
|
|
18
|
+
'.mp3',
|
|
19
|
+
'.mp4',
|
|
20
|
+
'.ogg',
|
|
21
|
+
'.otf',
|
|
22
|
+
'.pdf',
|
|
23
|
+
'.png',
|
|
24
|
+
'.svg',
|
|
25
|
+
'.ttf',
|
|
26
|
+
'.wav',
|
|
27
|
+
'.webm',
|
|
28
|
+
'.webp',
|
|
29
|
+
'.woff',
|
|
30
|
+
'.woff2',
|
|
31
|
+
]);
|
|
32
|
+
export async function deploy(options) {
|
|
33
|
+
const project = await loadProject(options.root);
|
|
34
|
+
const name = options.name?.trim() || project.title;
|
|
35
|
+
const slug = options.slug?.trim() || slugify(project.title);
|
|
36
|
+
process.stdout.write(`Documentation project:\n ${options.root}\nProduct sources excluded from deployment: ${project.sources.length}\n\n`);
|
|
37
|
+
if (project.generator !== 'doxbrix') {
|
|
38
|
+
return deployGeneratedSite({ ...options, name, slug });
|
|
39
|
+
}
|
|
40
|
+
const steps = createStepList();
|
|
41
|
+
process.stdout.write(`Deploying "${name}" → ${apiUrl(options.apiUrl)}\n\n`);
|
|
42
|
+
try {
|
|
43
|
+
const validating = steps.start('Validating documentation');
|
|
44
|
+
const result = await validateProject(options.root);
|
|
45
|
+
if (result.errors > 0) {
|
|
46
|
+
throw new DoxloopError(`Deployment stopped because documentation has ${result.errors} validation error${result.errors === 1 ? '' : 's'}. Run \`doxloop test\`.`);
|
|
47
|
+
}
|
|
48
|
+
validating.done('Validated documentation');
|
|
49
|
+
const building = steps.start('Building bundle');
|
|
50
|
+
const bundle = await buildDeploymentBundle(options.root, project.contentDir);
|
|
51
|
+
const bytes = Buffer.byteLength(JSON.stringify(bundle));
|
|
52
|
+
building.done('Built bundle', `${count(bundle.pages.length, 'page')}${bundle.media.length > 0 ? `, ${count(bundle.media.length, 'media file')}` : ''}, ${formatBytes(bytes)}`);
|
|
53
|
+
if (options.dryRun) {
|
|
54
|
+
process.stdout.write(`\nDeployment is valid.\nProject: ${name}\nSlug: ${slug}\nPages: ${bundle.pages.length}\nMedia files: ${bundle.media.length}\nPayload: ${formatBytes(bytes)}\nNo data was uploaded.\n`);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
const locating = steps.start('Locating project');
|
|
58
|
+
const existing = await authenticatedRequestOptional(`/api/v1/projects/${encodeURIComponent(slug)}`, { method: 'GET' }, options.apiUrl);
|
|
59
|
+
let target = existing?.project;
|
|
60
|
+
if (target) {
|
|
61
|
+
locating.done(`Found project "${target.name}" (${target.slug})`);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
const created = await authenticatedRequest('/api/v1/projects', {
|
|
65
|
+
method: 'POST',
|
|
66
|
+
headers: { 'Content-Type': 'application/json' },
|
|
67
|
+
// The bundle below is the source of truth. Do not let Doxbrix seed its
|
|
68
|
+
// web starter template (Guides / API Reference / FAQ) first.
|
|
69
|
+
body: JSON.stringify({ name, slug, seedTemplate: false }),
|
|
70
|
+
}, options.apiUrl);
|
|
71
|
+
target = created.project;
|
|
72
|
+
locating.done(`Created project "${target.name}" (${target.slug})`);
|
|
73
|
+
}
|
|
74
|
+
const publishing = steps.start('Publishing to Doxbrix');
|
|
75
|
+
const pushed = await authenticatedRequest(`/api/v1/projects/${encodeURIComponent(target.slug)}/bundle`, {
|
|
76
|
+
method: 'POST',
|
|
77
|
+
headers: { 'Content-Type': 'application/json' },
|
|
78
|
+
body: JSON.stringify({ ...bundle, publish: true }),
|
|
79
|
+
}, options.apiUrl);
|
|
80
|
+
const report = pushed.result;
|
|
81
|
+
publishing.done('Published', `${count(bundle.pages.length, 'page')} (${report.pagesCreated} created, ${report.pagesUpdated} updated), ${count(report.spaces, 'space')}${bundle.media.length > 0 ? `, ${count(bundle.media.length, 'media file')}` : ''} · ${formatDuration(publishing.durationMs)}`);
|
|
82
|
+
for (const warning of report.warnings ?? []) {
|
|
83
|
+
process.stdout.write(`warning: ${warning}\n`);
|
|
84
|
+
}
|
|
85
|
+
process.stdout.write(`\n${apiUrl(options.apiUrl)}/editor?project=${encodeURIComponent(target.slug)}\n`);
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
steps.failActive();
|
|
89
|
+
throw error;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
export async function buildDeploymentBundle(root, contentDir) {
|
|
93
|
+
const project = await loadProject(root);
|
|
94
|
+
if (contentDir !== project.contentDir) {
|
|
95
|
+
throw new DoxloopError('Deployment content directory must match .doxloop/project.json.');
|
|
96
|
+
}
|
|
97
|
+
const contentRoot = await resolveContainedDirectory(root, project.contentDir, 'Deployment content directory');
|
|
98
|
+
const pages = [];
|
|
99
|
+
for (const path of await loadPages(root, project)) {
|
|
100
|
+
pages.push({
|
|
101
|
+
path: relativePath(contentRoot, path),
|
|
102
|
+
markdown: await readFile(path, 'utf8'),
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
const media = [];
|
|
106
|
+
for (const path of await listFiles(contentRoot, MEDIA_EXTENSIONS)) {
|
|
107
|
+
media.push({
|
|
108
|
+
path: relativePath(contentRoot, path),
|
|
109
|
+
base64: (await readFile(path)).toString('base64'),
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
const manifest = await loadSiteConfig(root, project);
|
|
113
|
+
return { manifest, basePath: contentDir, pages, media };
|
|
114
|
+
}
|
|
115
|
+
function slugify(value) {
|
|
116
|
+
const slug = value
|
|
117
|
+
.toLowerCase()
|
|
118
|
+
.normalize('NFKD')
|
|
119
|
+
.replace(/[\u0300-\u036f]/g, '')
|
|
120
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
121
|
+
.replace(/^-+|-+$/g, '');
|
|
122
|
+
if (!slug)
|
|
123
|
+
throw new DoxloopError('Cannot derive a project slug. Pass --slug.');
|
|
124
|
+
return slug;
|
|
125
|
+
}
|
|
126
|
+
function count(value, noun) {
|
|
127
|
+
return `${value} ${noun}${value === 1 ? '' : 's'}`;
|
|
128
|
+
}
|
|
129
|
+
function formatBytes(bytes) {
|
|
130
|
+
if (bytes < 1024)
|
|
131
|
+
return `${bytes} B`;
|
|
132
|
+
if (bytes < 1024 * 1024)
|
|
133
|
+
return `${(bytes / 1024).toFixed(1)} KiB`;
|
|
134
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MiB`;
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=deploy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../src/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EACL,MAAM,EACN,oBAAoB,EACpB,4BAA4B,GAC7B,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,SAAS,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAA;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,EACL,SAAS,EACT,WAAW,EACX,cAAc,EACd,YAAY,GACb,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEjD,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,QAAQ;CACT,CAAC,CAAA;AAuBF,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAM5B;IACC,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,OAAO,CAAC,KAAK,CAAA;IAClD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAC3D,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,6BAA6B,OAAO,CAAC,IAAI,+CAA+C,OAAO,CAAC,OAAO,CAAC,MAAM,MAAM,CACrH,CAAA;IACD,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACpC,OAAO,mBAAmB,CAAC,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IACxD,CAAC;IACD,MAAM,KAAK,GAAG,cAAc,EAAE,CAAA;IAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,IAAI,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAE3E,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAA;QAC1D,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QAClD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,YAAY,CACpB,gDAAgD,MAAM,CAAC,MAAM,oBAAoB,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,yBAAyB,CACzI,CAAA;QACH,CAAC;QACD,UAAU,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAA;QAE1C,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAA;QAC/C,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,CAAA;QAC5E,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;QACvD,QAAQ,CAAC,IAAI,CACX,cAAc,EACd,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,KAAK,CAAC,EAAE,CAChJ,CAAA;QAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,oCAAoC,IAAI,WAAW,IAAI,YAAY,MAAM,CAAC,KAAK,CAAC,MAAM,kBAAkB,MAAM,CAAC,KAAK,CAAC,MAAM,cAAc,WAAW,CAAC,KAAK,CAAC,2BAA2B,CACvL,CAAA;YACD,OAAM;QACR,CAAC;QAED,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAA;QAChD,MAAM,QAAQ,GAAG,MAAM,4BAA4B,CACjD,oBAAoB,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAC9C,EAAE,MAAM,EAAE,KAAK,EAAE,EACjB,OAAO,CAAC,MAAM,CACf,CAAA;QACD,IAAI,MAAM,GAAG,QAAQ,EAAE,OAAO,CAAA;QAC9B,IAAI,MAAM,EAAE,CAAC;YACX,QAAQ,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,IAAI,GAAG,CAAC,CAAA;QAClE,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,MAAM,oBAAoB,CACxC,kBAAkB,EAClB;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,uEAAuE;gBACvE,6DAA6D;gBAC7D,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;aAC1D,EACD,OAAO,CAAC,MAAM,CACf,CAAA;YACD,MAAM,GAAG,OAAO,CAAC,OAAO,CAAA;YACxB,QAAQ,CAAC,IAAI,CAAC,oBAAoB,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,IAAI,GAAG,CAAC,CAAA;QACpE,CAAC;QAED,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAA;QACvD,MAAM,MAAM,GAAG,MAAM,oBAAoB,CACvC,oBAAoB,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAC5D;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;SACnD,EACD,OAAO,CAAC,MAAM,CACf,CAAA;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;QAC5B,UAAU,CAAC,IAAI,CACb,WAAW,EACX,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,MAAM,CAAC,YAAY,aAAa,MAAM,CAAC,YAAY,cAAc,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,cAAc,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CACvQ,CAAA;QACD,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;YAC5C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,OAAO,IAAI,CAAC,CAAA;QAC/C,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,mBAAmB,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAClF,CAAA;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,KAAK,CAAC,UAAU,EAAE,CAAA;QAClB,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,IAAY,EACZ,UAAkB;IAElB,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAA;IACvC,IAAI,UAAU,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC;QACtC,MAAM,IAAI,YAAY,CACpB,gEAAgE,CACjE,CAAA;IACH,CAAC;IACD,MAAM,WAAW,GAAG,MAAM,yBAAyB,CACjD,IAAI,EACJ,OAAO,CAAC,UAAU,EAClB,8BAA8B,CAC/B,CAAA;IACD,MAAM,KAAK,GAA8B,EAAE,CAAA;IAC3C,KAAK,MAAM,IAAI,IAAI,MAAM,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;QAClD,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC;YACrC,QAAQ,EAAE,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;SACvC,CAAC,CAAA;IACJ,CAAC;IACD,MAAM,KAAK,GAA8B,EAAE,CAAA;IAC3C,KAAK,MAAM,IAAI,IAAI,MAAM,SAAS,CAAC,WAAW,EAAE,gBAAgB,CAAC,EAAE,CAAC;QAClE,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC;YACrC,MAAM,EAAE,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;SAClD,CAAC,CAAA;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACpD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;AACzD,CAAC;AAED,SAAS,OAAO,CAAC,KAAa;IAC5B,MAAM,IAAI,GAAG,KAAK;SACf,WAAW,EAAE;SACb,SAAS,CAAC,MAAM,CAAC;SACjB,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;IAC1B,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,YAAY,CAAC,4CAA4C,CAAC,CAAA;IAC/E,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,KAAK,CAAC,KAAa,EAAE,IAAY;IACxC,OAAO,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;AACpD,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,KAAK,IAAI,CAAA;IACrC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAA;IAClE,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAA;AACpD,CAAC"}
|
package/dist/doctor.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { AgentName } from './types.js';
|
|
2
|
+
export interface DoctorCheck {
|
|
3
|
+
status: 'pass' | 'warning' | 'fail';
|
|
4
|
+
label: string;
|
|
5
|
+
detail?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface DoctorReport {
|
|
8
|
+
ready: boolean;
|
|
9
|
+
checks: DoctorCheck[];
|
|
10
|
+
}
|
|
11
|
+
export declare function runDoctor(options: {
|
|
12
|
+
cwd: string;
|
|
13
|
+
source?: string;
|
|
14
|
+
output?: string;
|
|
15
|
+
agent?: AgentName;
|
|
16
|
+
}): Promise<DoctorReport>;
|
|
17
|
+
export declare function formatDoctorReport(report: DoctorReport): string;
|
|
18
|
+
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAgB3C,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAA;IACnC,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,WAAW,EAAE,CAAA;CACtB;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE;IACvC,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB,GAAG,OAAO,CAAC,YAAY,CAAC,CA8CxB;AAqBD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAY/D"}
|
package/dist/doctor.js
ADDED
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
import { createServer } from 'node:net';
|
|
2
|
+
import { agentAuthenticationStatus, chooseAgent, skillStatus, } from './agents.js';
|
|
3
|
+
import { DoxloopError } from './errors.js';
|
|
4
|
+
import { diagnoseGenerator } from './generator-manager.js';
|
|
5
|
+
import { findProjectRoot, loadProject, resolveSeparateProjectLayout, validateProjectSourceBoundaries, } from './project.js';
|
|
6
|
+
import { validateProject } from './validation.js';
|
|
7
|
+
export async function runDoctor(options) {
|
|
8
|
+
const checks = [nodeCheck()];
|
|
9
|
+
const preflight = options.source !== undefined || options.output !== undefined;
|
|
10
|
+
if (preflight) {
|
|
11
|
+
if (!options.source || !options.output) {
|
|
12
|
+
checks.push({
|
|
13
|
+
status: 'fail',
|
|
14
|
+
label: 'New project paths',
|
|
15
|
+
detail: 'Pass both `--source <product-directory>` and `--output <documentation-directory>`.',
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
try {
|
|
20
|
+
const layout = await resolveSeparateProjectLayout({
|
|
21
|
+
cwd: options.cwd,
|
|
22
|
+
source: options.source,
|
|
23
|
+
output: options.output,
|
|
24
|
+
});
|
|
25
|
+
checks.push({
|
|
26
|
+
status: 'pass',
|
|
27
|
+
label: 'Product source found',
|
|
28
|
+
detail: layout.sourceRoot,
|
|
29
|
+
});
|
|
30
|
+
checks.push({
|
|
31
|
+
status: 'pass',
|
|
32
|
+
label: 'Documentation output is separate and available',
|
|
33
|
+
detail: layout.projectRoot,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
checks.push({
|
|
38
|
+
status: 'fail',
|
|
39
|
+
label: 'Product and documentation directories',
|
|
40
|
+
detail: errorMessage(error),
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
await inspectExistingProject(options.cwd, checks);
|
|
47
|
+
}
|
|
48
|
+
await inspectAgent(options.agent, checks, preflight ? undefined : options.cwd);
|
|
49
|
+
checks.push(await previewPortCheck());
|
|
50
|
+
return {
|
|
51
|
+
ready: checks.every((check) => check.status !== 'fail'),
|
|
52
|
+
checks,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
async function previewPortCheck() {
|
|
56
|
+
return new Promise((resolveCheck) => {
|
|
57
|
+
const server = createServer();
|
|
58
|
+
server.unref();
|
|
59
|
+
server.once('error', () => {
|
|
60
|
+
resolveCheck({
|
|
61
|
+
status: 'warning',
|
|
62
|
+
label: 'Preview port 4321 is occupied',
|
|
63
|
+
detail: 'Use `doxloop preview --port 4400 --open` or stop the process using port 4321.',
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
server.listen(4321, '127.0.0.1', () => {
|
|
67
|
+
server.close(() => {
|
|
68
|
+
resolveCheck({ status: 'pass', label: 'Preview port 4321 is available' });
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
export function formatDoctorReport(report) {
|
|
74
|
+
const lines = ['Checking Doxloop…', ''];
|
|
75
|
+
for (const check of report.checks) {
|
|
76
|
+
const symbol = check.status === 'pass' ? '✓' : check.status === 'warning' ? '!' : '✗';
|
|
77
|
+
lines.push(`${symbol} ${check.label}`);
|
|
78
|
+
if (check.detail) {
|
|
79
|
+
for (const line of check.detail.split('\n'))
|
|
80
|
+
lines.push(` ${line}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
lines.push('', report.ready ? 'Doxloop is ready.' : 'Doxloop needs attention before you continue.');
|
|
84
|
+
return lines.join('\n');
|
|
85
|
+
}
|
|
86
|
+
async function inspectExistingProject(cwd, checks) {
|
|
87
|
+
let root;
|
|
88
|
+
try {
|
|
89
|
+
root = await findProjectRoot(cwd);
|
|
90
|
+
checks.push({
|
|
91
|
+
status: 'pass',
|
|
92
|
+
label: 'Documentation project found',
|
|
93
|
+
detail: root,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
checks.push({
|
|
98
|
+
status: 'fail',
|
|
99
|
+
label: 'Documentation project',
|
|
100
|
+
detail: `${errorMessage(error)}\nFor a new project, run: doxloop doctor --source ./my-product --output ./my-docs`,
|
|
101
|
+
});
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
const project = await loadProject(root);
|
|
106
|
+
await validateProjectSourceBoundaries(root, project.sources);
|
|
107
|
+
checks.push({
|
|
108
|
+
status: 'pass',
|
|
109
|
+
label: `${project.sources.length} product source${project.sources.length === 1 ? '' : 's'} found and separate`,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
checks.push({
|
|
114
|
+
status: 'fail',
|
|
115
|
+
label: 'Product source boundary',
|
|
116
|
+
detail: errorMessage(error),
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
try {
|
|
120
|
+
const generator = await diagnoseGenerator(root);
|
|
121
|
+
const name = generator.split('\n')[0]?.replace(/^Generator:\s*/, '') ?? 'Generator';
|
|
122
|
+
checks.push({ status: 'pass', label: `${name} generator is ready` });
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
checks.push({
|
|
126
|
+
status: 'fail',
|
|
127
|
+
label: 'Documentation generator',
|
|
128
|
+
detail: errorMessage(error),
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
const validation = await validateProject(root);
|
|
132
|
+
checks.push({
|
|
133
|
+
status: validation.errors > 0
|
|
134
|
+
? 'fail'
|
|
135
|
+
: validation.warnings > 0
|
|
136
|
+
? 'warning'
|
|
137
|
+
: 'pass',
|
|
138
|
+
label: `${validation.pages.length} documentation page${validation.pages.length === 1 ? '' : 's'} checked`,
|
|
139
|
+
detail: `${validation.errors} errors, ${validation.warnings} warnings`,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
async function inspectAgent(preferredAgent, checks, projectCwd) {
|
|
143
|
+
try {
|
|
144
|
+
const agent = await chooseAgent(preferredAgent);
|
|
145
|
+
const label = agent.name === 'claude' ? 'Claude Code' : capitalize(agent.name);
|
|
146
|
+
checks.push({ status: 'pass', label: `${label} is installed` });
|
|
147
|
+
const authentication = await agentAuthenticationStatus(agent);
|
|
148
|
+
checks.push({
|
|
149
|
+
status: authentication.status === 'authenticated'
|
|
150
|
+
? 'pass'
|
|
151
|
+
: authentication.status === 'unknown'
|
|
152
|
+
? 'warning'
|
|
153
|
+
: 'fail',
|
|
154
|
+
label: authentication.status === 'authenticated'
|
|
155
|
+
? `${label} is signed in`
|
|
156
|
+
: `${label} authentication`,
|
|
157
|
+
...(authentication.status === 'authenticated'
|
|
158
|
+
? {}
|
|
159
|
+
: { detail: authentication.detail }),
|
|
160
|
+
});
|
|
161
|
+
if (projectCwd) {
|
|
162
|
+
let root;
|
|
163
|
+
try {
|
|
164
|
+
root = await findProjectRoot(projectCwd);
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
await inspectSkills(root, agent.name, checks);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
checks.push({
|
|
174
|
+
status: 'fail',
|
|
175
|
+
label: 'Coding agent',
|
|
176
|
+
detail: errorMessage(error),
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
async function inspectSkills(root, agent, checks) {
|
|
181
|
+
const skills = await skillStatus(root, agent);
|
|
182
|
+
const missing = skills.filter((skill) => skill.status === 'missing');
|
|
183
|
+
const modified = skills.filter((skill) => skill.status === 'modified');
|
|
184
|
+
const label = agent === 'claude' ? 'Claude Code' : capitalize(agent);
|
|
185
|
+
if (missing.length > 0) {
|
|
186
|
+
checks.push({
|
|
187
|
+
status: 'fail',
|
|
188
|
+
label: `${label} project skills`,
|
|
189
|
+
detail: `Missing ${missing.length} skill${missing.length === 1 ? '' : 's'}. Run \`doxloop agent setup --agent ${agent}\`.`,
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
else if (modified.length > 0) {
|
|
193
|
+
checks.push({
|
|
194
|
+
status: 'fail',
|
|
195
|
+
label: `${label} project skills`,
|
|
196
|
+
detail: `Modified ${modified.length} skill${modified.length === 1 ? '' : 's'}. Review them, then run \`doxloop agent update --agent ${agent}\` if they should be replaced.`,
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
checks.push({ status: 'pass', label: `${label} project skills are ready` });
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
function nodeCheck() {
|
|
204
|
+
const [major = 0, minor = 0] = process.versions.node
|
|
205
|
+
.split('.')
|
|
206
|
+
.map((value) => Number(value));
|
|
207
|
+
const supported = major > 20 || (major === 20 && minor >= 12);
|
|
208
|
+
return {
|
|
209
|
+
status: supported ? 'pass' : 'fail',
|
|
210
|
+
label: `Node.js ${process.versions.node} ${supported ? 'is supported' : 'is not supported'}`,
|
|
211
|
+
...(supported ? {} : { detail: 'Install Node.js 20.12 or later.' }),
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
function capitalize(value) {
|
|
215
|
+
return `${value.slice(0, 1).toUpperCase()}${value.slice(1)}`;
|
|
216
|
+
}
|
|
217
|
+
function errorMessage(error) {
|
|
218
|
+
if (error instanceof DoxloopError || error instanceof Error)
|
|
219
|
+
return error.message;
|
|
220
|
+
return String(error);
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MDX -> HTML renderer for `dxb dev`. Emits the same `dp-`/`df-` class structure
|
|
3
|
+
* the published reader site uses (see apps/web BlockRenderer + DocumentationSite),
|
|
4
|
+
* so that — paired with the bundled reader stylesheet (preview.css) — the local
|
|
5
|
+
* preview renders the way the cloud site does. Plain Markdown and the Doxbrix
|
|
6
|
+
* component blocks (callouts, Steps, Tabs, Accordion, Card/CardGroup, Columns,
|
|
7
|
+
* CodeGroup, Terminal, Frame, Video, Embed, File, ApiEndpoint, Badge, Icon,
|
|
8
|
+
* Update, Mermaid, Math, ...) are all supported.
|
|
9
|
+
*/
|
|
10
|
+
export interface TocEntry {
|
|
11
|
+
id: string;
|
|
12
|
+
level: 2 | 3 | 4;
|
|
13
|
+
title: string;
|
|
14
|
+
}
|
|
15
|
+
export interface RenderResult {
|
|
16
|
+
html: string;
|
|
17
|
+
toc: TocEntry[];
|
|
18
|
+
}
|
|
19
|
+
export declare function renderMarkdown(md: string): RenderResult;
|
|
20
|
+
//# sourceMappingURL=doxbrix-markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doxbrix-markdown.d.ts","sourceRoot":"","sources":["../src/doxbrix-markdown.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAkBH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,QAAQ,EAAE,CAAA;CAChB;AAeD,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,CAUvD"}
|