@dooc-dev/dooc 0.0.0-stage → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -2
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +311 -0
- package/dist/code.global.js +285 -0
- package/dist/compiler/bundle-urls.d.ts +3 -0
- package/dist/compiler/bundle-urls.js +294 -0
- package/dist/compiler/bundle.d.ts +2 -0
- package/dist/compiler/bundle.js +100 -0
- package/dist/compiler/check-prose.d.ts +11 -0
- package/dist/compiler/check-prose.js +138 -0
- package/dist/compiler/check-types.d.ts +44 -0
- package/dist/compiler/check-types.js +1 -0
- package/dist/compiler/check.d.ts +5 -0
- package/dist/compiler/check.js +450 -0
- package/dist/compiler/code-blocks.d.ts +17 -0
- package/dist/compiler/code-blocks.js +198 -0
- package/dist/compiler/code-languages.d.ts +10 -0
- package/dist/compiler/code-languages.js +109 -0
- package/dist/compiler/compile.d.ts +95 -0
- package/dist/compiler/compile.js +410 -0
- package/dist/compiler/config.d.ts +7 -0
- package/dist/compiler/config.js +52 -0
- package/dist/compiler/dialect.d.ts +24 -0
- package/dist/compiler/dialect.js +198 -0
- package/dist/compiler/drawio.d.ts +26 -0
- package/dist/compiler/drawio.js +176 -0
- package/dist/compiler/figures.d.ts +14 -0
- package/dist/compiler/figures.js +221 -0
- package/dist/compiler/file-cache.d.ts +14 -0
- package/dist/compiler/file-cache.js +61 -0
- package/dist/compiler/files.d.ts +29 -0
- package/dist/compiler/files.js +431 -0
- package/dist/compiler/fonts.d.ts +10 -0
- package/dist/compiler/fonts.js +54 -0
- package/dist/compiler/format.d.ts +1 -0
- package/dist/compiler/format.js +42 -0
- package/dist/compiler/from-mdast.d.ts +16 -0
- package/dist/compiler/from-mdast.js +142 -0
- package/dist/compiler/icons.d.ts +14 -0
- package/dist/compiler/icons.js +85 -0
- package/dist/compiler/language-codes.d.ts +7 -0
- package/dist/compiler/language-codes.js +17 -0
- package/dist/compiler/locales.d.ts +7 -0
- package/dist/compiler/locales.js +67 -0
- package/dist/compiler/manifest.d.ts +6 -0
- package/dist/compiler/manifest.js +30 -0
- package/dist/compiler/ops.d.ts +44 -0
- package/dist/compiler/ops.js +362 -0
- package/dist/compiler/public-file.d.ts +2 -0
- package/dist/compiler/public-file.js +93 -0
- package/dist/compiler/serialize.d.ts +3 -0
- package/dist/compiler/serialize.js +16 -0
- package/dist/compiler/terms.d.ts +9 -0
- package/dist/compiler/terms.js +44 -0
- package/dist/compiler/textfile-remote.d.ts +12 -0
- package/dist/compiler/textfile-remote.js +124 -0
- package/dist/compiler/textfile.d.ts +9 -0
- package/dist/compiler/textfile.js +113 -0
- package/dist/compiler/theme-variants.d.ts +4 -0
- package/dist/compiler/theme-variants.js +22 -0
- package/dist/compiler/zip.d.ts +6 -0
- package/dist/compiler/zip.js +48 -0
- package/dist/core/blocks.d.ts +99 -0
- package/dist/core/blocks.js +29 -0
- package/dist/core/code-file.d.ts +12 -0
- package/dist/core/code-file.js +68 -0
- package/dist/core/content-metadata.d.ts +48 -0
- package/dist/core/content-metadata.js +264 -0
- package/dist/core/content-types.d.ts +45 -0
- package/dist/core/content-types.js +1 -0
- package/dist/core/extension-package.d.ts +34 -0
- package/dist/core/extension-package.js +147 -0
- package/dist/core/figure-frame.d.ts +12 -0
- package/dist/core/figure-frame.js +108 -0
- package/dist/core/file-embed.d.ts +13 -0
- package/dist/core/file-embed.js +43 -0
- package/dist/core/files.d.ts +15 -0
- package/dist/core/files.js +59 -0
- package/dist/core/flow-base-css.generated.d.ts +1 -0
- package/dist/core/flow-base-css.generated.js +4 -0
- package/dist/core/flow-css.d.ts +9 -0
- package/dist/core/flow-css.js +54 -0
- package/dist/core/graph-common.d.ts +32 -0
- package/dist/core/graph-common.js +113 -0
- package/dist/core/graph.d.ts +117 -0
- package/dist/core/graph.js +480 -0
- package/dist/core/html.d.ts +29 -0
- package/dist/core/html.js +444 -0
- package/dist/core/icons.d.ts +2 -0
- package/dist/core/icons.js +2 -0
- package/dist/core/inline.d.ts +27 -0
- package/dist/core/inline.js +42 -0
- package/dist/core/language.d.ts +41 -0
- package/dist/core/language.js +44 -0
- package/dist/core/languages/ja.d.ts +2 -0
- package/dist/core/languages/ja.js +5 -0
- package/dist/core/markdown.d.ts +27 -0
- package/dist/core/markdown.js +154 -0
- package/dist/core/previewers.d.ts +37 -0
- package/dist/core/previewers.js +103 -0
- package/dist/core/routing.d.ts +20 -0
- package/dist/core/routing.js +64 -0
- package/dist/core/schema-comments.d.ts +14 -0
- package/dist/core/schema-comments.js +52 -0
- package/dist/core/schema-graph-flow.d.ts +9 -0
- package/dist/core/schema-graph-flow.js +379 -0
- package/dist/core/schema-graph-mount.d.ts +9 -0
- package/dist/core/schema-graph-mount.js +105 -0
- package/dist/core/schema-graph.d.ts +254 -0
- package/dist/core/schema-graph.js +981 -0
- package/dist/core/table-ui.d.ts +2 -0
- package/dist/core/table-ui.js +180 -0
- package/dist/core/taxonomy.d.ts +12 -0
- package/dist/core/taxonomy.js +49 -0
- package/dist/core/term-reference.d.ts +5 -0
- package/dist/core/term-reference.js +19 -0
- package/dist/core/terms-ui.d.ts +6 -0
- package/dist/core/terms-ui.js +22 -0
- package/dist/core/textfile.d.ts +10 -0
- package/dist/core/textfile.js +39 -0
- package/dist/core/theme-variants.d.ts +3 -0
- package/dist/core/theme-variants.js +37 -0
- package/dist/core/toc-ui.d.ts +2 -0
- package/dist/core/toc-ui.js +161 -0
- package/dist/core/video-ui.d.ts +2 -0
- package/dist/core/video-ui.js +253 -0
- package/dist/core/workspace.d.ts +15 -0
- package/dist/core/workspace.js +28 -0
- package/dist/edit.global.js +306 -0
- package/dist/flow.global.js +4959 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +31 -0
- package/dist/mcp.d.ts +24 -0
- package/dist/mcp.js +467 -0
- package/dist/plugins/actions.d.ts +45 -0
- package/dist/plugins/actions.js +125 -0
- package/dist/plugins/blocks.d.ts +93 -0
- package/dist/plugins/blocks.js +100 -0
- package/dist/plugins/index.d.ts +4 -0
- package/dist/plugins/index.js +1 -0
- package/dist/plugins/local-storage.d.ts +18 -0
- package/dist/plugins/local-storage.js +115 -0
- package/dist/plugins/oauth.d.ts +14 -0
- package/dist/plugins/oauth.js +170 -0
- package/dist/plugins/runtime.d.ts +26 -0
- package/dist/plugins/runtime.js +395 -0
- package/dist/plugins/types.d.ts +59 -0
- package/dist/plugins/types.js +1 -0
- package/dist/plugins/view.d.ts +7 -0
- package/dist/plugins/view.js +21 -0
- package/dist/ui.global.js +78 -0
- package/dist/viewer/assets.d.ts +2 -0
- package/dist/viewer/assets.js +3 -0
- package/dist/viewer/build.d.ts +12 -0
- package/dist/viewer/build.js +55 -0
- package/dist/viewer/bundle-network.d.ts +2 -0
- package/dist/viewer/bundle-network.js +88 -0
- package/dist/viewer/code-file.d.ts +20 -0
- package/dist/viewer/code-file.js +42 -0
- package/dist/viewer/editor-tools.d.ts +38 -0
- package/dist/viewer/editor-tools.js +211 -0
- package/dist/viewer/extension-pack.d.ts +2 -0
- package/dist/viewer/extension-pack.js +36 -0
- package/dist/viewer/extensions.d.ts +10 -0
- package/dist/viewer/extensions.js +302 -0
- package/dist/viewer/file-references.d.ts +14 -0
- package/dist/viewer/file-references.js +38 -0
- package/dist/viewer/font-picker.d.ts +4 -0
- package/dist/viewer/font-picker.js +145 -0
- package/dist/viewer/font-settings.d.ts +11 -0
- package/dist/viewer/font-settings.js +50 -0
- package/dist/viewer/fonts/LICENSE.txt +119 -0
- package/dist/viewer/fonts/udev-gothic-regular.woff2 +0 -0
- package/dist/viewer/fonts.d.ts +2 -0
- package/dist/viewer/fonts.js +13 -0
- package/dist/viewer/git-diff.d.ts +3 -0
- package/dist/viewer/git-diff.js +33 -0
- package/dist/viewer/git-types.d.ts +73 -0
- package/dist/viewer/git-types.js +1 -0
- package/dist/viewer/git.d.ts +5 -0
- package/dist/viewer/git.js +337 -0
- package/dist/viewer/hmr.d.ts +53 -0
- package/dist/viewer/hmr.js +337 -0
- package/dist/viewer/i18n.d.ts +6 -0
- package/dist/viewer/i18n.js +65 -0
- package/dist/viewer/ja-lint.d.ts +3 -0
- package/dist/viewer/ja-lint.js +44 -0
- package/dist/viewer/language-picker.d.ts +2 -0
- package/dist/viewer/language-picker.js +233 -0
- package/dist/viewer/languages.d.ts +11 -0
- package/dist/viewer/languages.js +20 -0
- package/dist/viewer/locales/eng.json +317 -0
- package/dist/viewer/locales/jpn.json +317 -0
- package/dist/viewer/locales/zho.json +317 -0
- package/dist/viewer/nav-focus.d.ts +2 -0
- package/dist/viewer/nav-focus.js +64 -0
- package/dist/viewer/plugin-blocks.d.ts +3 -0
- package/dist/viewer/plugin-blocks.js +115 -0
- package/dist/viewer/plugin-config.d.ts +35 -0
- package/dist/viewer/plugin-config.js +57 -0
- package/dist/viewer/plugin-view.d.ts +2 -0
- package/dist/viewer/plugin-view.js +6 -0
- package/dist/viewer/plugins.d.ts +12 -0
- package/dist/viewer/plugins.js +267 -0
- package/dist/viewer/resize.d.ts +4 -0
- package/dist/viewer/resize.js +238 -0
- package/dist/viewer/resource-library.d.ts +29 -0
- package/dist/viewer/resource-library.js +104 -0
- package/dist/viewer/search.d.ts +16 -0
- package/dist/viewer/search.js +358 -0
- package/dist/viewer/serve.d.ts +210 -0
- package/dist/viewer/serve.js +3312 -0
- package/dist/viewer/site-icon.d.ts +8 -0
- package/dist/viewer/site-icon.js +56 -0
- package/dist/viewer/textfile.d.ts +9 -0
- package/dist/viewer/textfile.js +50 -0
- package/dist/viewer/theme-picker.d.ts +2 -0
- package/dist/viewer/theme-picker.js +135 -0
- package/dist/viewer/workspace.d.ts +4 -0
- package/dist/viewer/workspace.js +47 -0
- package/package.json +128 -5
package/README.md
CHANGED
|
@@ -1,3 +1,27 @@
|
|
|
1
|
-
#
|
|
1
|
+
# dooc
|
|
2
|
+
dooc is an orchestration tool for documentation.
|
|
3
|
+
|
|
4
|
+
1. Create documentation resources.
|
|
5
|
+
2. Build an interface for those resources.
|
|
6
|
+
3. Distribute documentation everywhere.
|
|
7
|
+
|
|
8
|
+
# Usage
|
|
9
|
+
```sh
|
|
10
|
+
pnpm exec dooc edit [root] [port] # open dooc in edit mode
|
|
11
|
+
pnpm exec dooc view [root] [port] # open dooc in view mode
|
|
12
|
+
pnpm exec dooc export zip [root] [out] # zip of the content (<root>/dist/<root name>.zip)
|
|
13
|
+
pnpm exec dooc export html [root] [out] # single HTML file with everything embedded (<root>/dist/index.html)
|
|
14
|
+
pnpm exec dooc mcp [root] # stdio MCP server (all read / write operations)
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Registering the MCP server (Claude Code):
|
|
18
|
+
|
|
19
|
+
```sh
|
|
20
|
+
claude mcp add docs -- pnpm exec dooc mcp /path/to/root
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
tool: `list_docs` `search_docs` `read_doc` `read_figure` `check` `add_doc` `write_doc` `move_doc` `rename_doc` `delete_doc` `add_figure` `delete_figure`
|
|
24
|
+
|
|
25
|
+
# Folder structure
|
|
26
|
+
|
|
2
27
|
|
|
3
|
-
This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
|
package/dist/cli.d.ts
ADDED
package/dist/cli.js
ADDED
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// CLI entry shared by npx and mise. Root defaults to cwd; relative paths resolve against cwd.
|
|
3
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
4
|
+
import { basename, dirname, join, resolve } from "node:path";
|
|
5
|
+
import { parseArgs } from "node:util";
|
|
6
|
+
import { prebuilt } from "./viewer/assets.js";
|
|
7
|
+
process.env.NODE_ENV = prebuilt ? "production" : "development";
|
|
8
|
+
const USAGE = `usage: dooc <command>
|
|
9
|
+
|
|
10
|
+
edit [root] [port] open dooc in edit mode
|
|
11
|
+
view [root] [port] open dooc in view mode
|
|
12
|
+
--viewer-plugins <module> inject an external viewer plugin module
|
|
13
|
+
build html [root] [out-dir] build bundle.html (default <root>/dist)
|
|
14
|
+
build zip [root] [out-dir] build bundle.zip (default <root>/dist)
|
|
15
|
+
--url_preview embed|network URL handling for either format (default: embed)
|
|
16
|
+
check [root] [options] JSON consistency report (check --help for options)
|
|
17
|
+
plugin pack <built-dir> [zip] package bundled JS and assets as a plugin ZIP
|
|
18
|
+
plugin add <zip> [root] [port] install a local plugin and print login links
|
|
19
|
+
plugin login <id> [root] [port] open a local login flow for an installed plugin
|
|
20
|
+
font add <file> [root] register a font in the project (.dooc/fonts/)
|
|
21
|
+
font list [root] list registered project fonts
|
|
22
|
+
font remove <name> [root] remove a registered project font
|
|
23
|
+
mcp [root] stdio MCP server (all read / write operations)
|
|
24
|
+
--git-origin <module> inject gitOrigin from an external viewer plugin module
|
|
25
|
+
help, --help, -h show this help`;
|
|
26
|
+
const fail = (message) => {
|
|
27
|
+
console.error(message);
|
|
28
|
+
process.exit(1);
|
|
29
|
+
};
|
|
30
|
+
const docsRoot = (arg) => {
|
|
31
|
+
const root = resolve(arg ?? ".");
|
|
32
|
+
return existsSync(root) ? root : fail(`${root} does not exist`);
|
|
33
|
+
};
|
|
34
|
+
const writeOut = (out, data) => {
|
|
35
|
+
mkdirSync(dirname(out), { recursive: true });
|
|
36
|
+
writeFileSync(out, data);
|
|
37
|
+
};
|
|
38
|
+
const [command, ...args] = process.argv.slice(2);
|
|
39
|
+
switch (command) {
|
|
40
|
+
case "plugin": {
|
|
41
|
+
try {
|
|
42
|
+
const { positionals, values } = parseArgs({
|
|
43
|
+
args,
|
|
44
|
+
allowPositionals: true,
|
|
45
|
+
options: { help: { type: "boolean", short: "h" } },
|
|
46
|
+
});
|
|
47
|
+
const [action, value, rootArg, portArg] = positionals;
|
|
48
|
+
if (values.help) {
|
|
49
|
+
console.log(`usage: dooc plugin pack <built-dir> [output.zip]
|
|
50
|
+
dooc plugin add <zip> [root] [port]
|
|
51
|
+
dooc plugin login <plugin-id> [root] [port]
|
|
52
|
+
|
|
53
|
+
ZIP root: package.json with name, version, type: module and main pointing to bundled .js/.mjs.
|
|
54
|
+
Optional icon: path to a bundled SVG asset up to 64 KiB.
|
|
55
|
+
Include relative assets (SVG, JSON, etc.); dependencies must already be bundled. Limit: 16 MiB / 256 files.
|
|
56
|
+
Default output: <built-dir>.zip. Installed ZIPs: <root>/.dooc/plugins/.
|
|
57
|
+
Personal logins and plugin approvals: ~/.dooc/plugins/ (override with DOOC_USER_DIR).
|
|
58
|
+
Add/login starts a local editor and prints browser login links. Keep it running while signing in.
|
|
59
|
+
Tokens stay on this computer and never enter exported documents.`);
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
if (action === "pack" && value && positionals.length <= 3) {
|
|
63
|
+
const { packExtension } = await import("./viewer/extension-pack.js");
|
|
64
|
+
const { extensionFile } = await import("./core/extension-package.js");
|
|
65
|
+
const output = resolve(rootArg ?? `${resolve(value)}.zip`);
|
|
66
|
+
extensionFile(basename(output));
|
|
67
|
+
writeOut(output, await packExtension(resolve(value), output));
|
|
68
|
+
console.log(output);
|
|
69
|
+
}
|
|
70
|
+
else if ((action === "add" || action === "login") &&
|
|
71
|
+
value &&
|
|
72
|
+
positionals.length <= 4) {
|
|
73
|
+
const { extensionFile, MAX_EXTENSION_BYTES } = await import("./core/extension-package.js");
|
|
74
|
+
const port = Number(portArg ?? 5179);
|
|
75
|
+
if (!Number.isInteger(port) || port < 1024 || port > 65535)
|
|
76
|
+
throw new Error("Choose a local port between 1024 and 65535");
|
|
77
|
+
process.env.DOCS_ROOT = docsRoot(rootArg);
|
|
78
|
+
process.env.DOCS_HMR = "1";
|
|
79
|
+
const { startServer } = await import("./viewer/serve.js");
|
|
80
|
+
if (action === "add") {
|
|
81
|
+
const file = extensionFile(basename(value));
|
|
82
|
+
const data = readFileSync(resolve(value));
|
|
83
|
+
if (data.length > MAX_EXTENSION_BYTES)
|
|
84
|
+
throw new Error("Choose a ZIP smaller than 16 MiB");
|
|
85
|
+
await startServer("edit", port, undefined, {
|
|
86
|
+
file,
|
|
87
|
+
data: data.toString("base64"),
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
if (!/^[a-z][a-z0-9-]{0,63}$/.test(value))
|
|
92
|
+
throw new Error("Invalid plugin ID");
|
|
93
|
+
await startServer("edit", port, undefined, { login: value });
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
else
|
|
97
|
+
throw new Error("usage: dooc plugin pack <built-dir> [zip] | add <zip> [root] [port] | login <id> [root] [port]");
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
fail(error instanceof Error ? error.message : String(error));
|
|
101
|
+
}
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
case "font": {
|
|
105
|
+
const { addProjectFont, listProjectFonts, removeProjectFont } = await import("./compiler/fonts.js");
|
|
106
|
+
try {
|
|
107
|
+
const { positionals, values } = parseArgs({
|
|
108
|
+
args,
|
|
109
|
+
allowPositionals: true,
|
|
110
|
+
options: { help: { type: "boolean", short: "h" } },
|
|
111
|
+
});
|
|
112
|
+
if (values.help) {
|
|
113
|
+
console.log("usage: dooc font add <file> [root] | list [root] | remove <name> [root]\n\nFonts are copied to <root>/.dooc/fonts/ and included in ZIP and HTML bundles.\nSupported formats: TTF, OTF, WOFF, WOFF2. Existing names are never overwritten.\nReload the viewer after changing registered fonts. Default root: current directory.");
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
const [action, value, rootArg] = positionals;
|
|
117
|
+
if (action === "list" && positionals.length <= 2) {
|
|
118
|
+
console.log(JSON.stringify(listProjectFonts(docsRoot(value)), null, 2));
|
|
119
|
+
}
|
|
120
|
+
else if (action === "add" && value && positionals.length <= 3) {
|
|
121
|
+
console.log(addProjectFont(docsRoot(rootArg), resolve(value)));
|
|
122
|
+
}
|
|
123
|
+
else if (action === "remove" && value && positionals.length <= 3) {
|
|
124
|
+
removeProjectFont(docsRoot(rootArg), value);
|
|
125
|
+
console.log(`Removed font: ${value}`);
|
|
126
|
+
}
|
|
127
|
+
else
|
|
128
|
+
throw new Error("usage: dooc font add <file> [root] | list [root] | remove <name> [root]");
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
fail(error instanceof Error ? error.message : String(error));
|
|
132
|
+
}
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
case "check": {
|
|
136
|
+
const { checkSite } = await import("./compiler/check.js");
|
|
137
|
+
let report;
|
|
138
|
+
try {
|
|
139
|
+
const { positionals, values } = parseArgs({
|
|
140
|
+
args,
|
|
141
|
+
allowPositionals: true,
|
|
142
|
+
options: {
|
|
143
|
+
only: { type: "string", multiple: true },
|
|
144
|
+
"allow-shared-svg": { type: "boolean" },
|
|
145
|
+
"warnings-as-errors": { type: "boolean" },
|
|
146
|
+
help: { type: "boolean", short: "h" },
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
if (values.help) {
|
|
150
|
+
console.log(`usage: dooc check [root] [options]
|
|
151
|
+
|
|
152
|
+
--only render,languages,themes select checks (default: all three)
|
|
153
|
+
manifest validity is always checked
|
|
154
|
+
--allow-shared-svg allow identical SVG bytes across themes (missing variants still fail)
|
|
155
|
+
--warnings-as-errors fail on warnings as well as errors
|
|
156
|
+
--help, -h show this help
|
|
157
|
+
|
|
158
|
+
dooc.yaml example:
|
|
159
|
+
defaultLang: jpn
|
|
160
|
+
languages: [jpn, eng]
|
|
161
|
+
themes: [light, dark]
|
|
162
|
+
|
|
163
|
+
Translations: locales/<ISO 639-3>/<source path>.
|
|
164
|
+
Theme variants: themes/<theme>/<asset path>.
|
|
165
|
+
stdout: one JSON CheckReport with schemaVersion=1, checks, diagnostics, summary and exitCode.
|
|
166
|
+
render uses the viewer compiler; languages checks availability and prose; themes checks variants.
|
|
167
|
+
Site declarations determine the expected languages and themes, never CLI overrides.
|
|
168
|
+
Diagnostic codes, relative file paths, sourceFile, language, theme and one-based lines are
|
|
169
|
+
machine-readable; message text is for humans. Prose detection is heuristic and offline.
|
|
170
|
+
Short text, unsupported formats and remote content are reported as unchecked/inconclusive.
|
|
171
|
+
Exit codes: 0 passed; 1 errors (or warnings with --warnings-as-errors); 2 invocation/execution failure.
|
|
172
|
+
Node API: import { checkSite } from "@dooc-dev/dooc/check".`);
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
if (positionals.length > 1)
|
|
176
|
+
throw new Error("check accepts at most one root path");
|
|
177
|
+
report = checkSite(resolve(positionals[0] ?? "."), {
|
|
178
|
+
...(values.only
|
|
179
|
+
? {
|
|
180
|
+
only: values.only.flatMap((value) => value.split(",")),
|
|
181
|
+
}
|
|
182
|
+
: {}),
|
|
183
|
+
allowSharedSvg: values["allow-shared-svg"],
|
|
184
|
+
warningsAsErrors: values["warnings-as-errors"],
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
report = {
|
|
189
|
+
schemaVersion: 1,
|
|
190
|
+
root: resolve("."),
|
|
191
|
+
checks: [],
|
|
192
|
+
languages: [],
|
|
193
|
+
themes: [],
|
|
194
|
+
diagnostics: [
|
|
195
|
+
{
|
|
196
|
+
check: "config",
|
|
197
|
+
code: "INVOCATION_INVALID",
|
|
198
|
+
severity: "error",
|
|
199
|
+
file: ".",
|
|
200
|
+
message: error instanceof Error ? error.message : String(error),
|
|
201
|
+
},
|
|
202
|
+
],
|
|
203
|
+
summary: { errors: 1, warnings: 0, info: 0 },
|
|
204
|
+
exitCode: 2,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
console.log(JSON.stringify(report, null, 2));
|
|
208
|
+
process.exitCode = report.exitCode;
|
|
209
|
+
break;
|
|
210
|
+
}
|
|
211
|
+
case "view":
|
|
212
|
+
case "edit": {
|
|
213
|
+
const { positionals, values } = parseArgs({
|
|
214
|
+
args,
|
|
215
|
+
allowPositionals: true,
|
|
216
|
+
options: { "viewer-plugins": { type: "string" } },
|
|
217
|
+
});
|
|
218
|
+
process.env.DOCS_ROOT = docsRoot(positionals[0]);
|
|
219
|
+
process.env.DOCS_HMR = "1";
|
|
220
|
+
// serve.ts reads DOCS_ROOT at import time, so import it after the env is set.
|
|
221
|
+
const { startServer } = await import("./viewer/serve.js");
|
|
222
|
+
await startServer(command === "view" ? "preview" : "edit", Number(positionals[1] ?? 5179), values["viewer-plugins"] ?? process.env.DOOC_VIEWER_PLUGINS);
|
|
223
|
+
break;
|
|
224
|
+
}
|
|
225
|
+
case "build": {
|
|
226
|
+
try {
|
|
227
|
+
const { positionals, values } = parseArgs({
|
|
228
|
+
args,
|
|
229
|
+
allowPositionals: true,
|
|
230
|
+
options: {
|
|
231
|
+
url_preview: { type: "string", default: "embed" },
|
|
232
|
+
help: { type: "boolean", short: "h" },
|
|
233
|
+
},
|
|
234
|
+
});
|
|
235
|
+
if (values.help) {
|
|
236
|
+
console.log(`usage: dooc build html [root] [out-dir] [--url_preview embed|network]
|
|
237
|
+
dooc build zip [root] [out-dir] [--url_preview embed|network]
|
|
238
|
+
|
|
239
|
+
A bundle is dooc.yaml and its managed content. Builds only the selected format.
|
|
240
|
+
Default output directory: <root>/dist. Source files are never rewritten.
|
|
241
|
+
--url_preview embed snapshot URL content and assets into the selected artifact (default)
|
|
242
|
+
--url_preview network preserve URL references without downloading them at build time
|
|
243
|
+
|
|
244
|
+
HTML embed: no network when opened. HTML network: fetch URLs when opened (text requires CORS).
|
|
245
|
+
ZIP embed: save URL content and rewrite references. ZIP network: keep the original URLs.
|
|
246
|
+
|
|
247
|
+
Only embedded references such as  are downloaded; ordinary hyperlinks remain links.
|
|
248
|
+
Snapshots use public HTTPS without credentials or redirects. Static HTML captures the server's
|
|
249
|
+
HTML and declarative assets; it does not execute the source site's JavaScript or perform login.
|
|
250
|
+
Remote files are limited to 2 MiB each and 64 MiB / 256 assets total.
|
|
251
|
+
A failed download or invalid source stops the build before replacing the selected artifact.
|
|
252
|
+
Use --url_preview network with either format to build without downloading URL content.`);
|
|
253
|
+
break;
|
|
254
|
+
}
|
|
255
|
+
const [format, rootArg, outArg] = positionals;
|
|
256
|
+
if (format !== "html" && format !== "zip")
|
|
257
|
+
throw new Error("build format must be html | zip");
|
|
258
|
+
if (positionals.length > 3)
|
|
259
|
+
throw new Error(`build ${format} accepts a root and an output directory`);
|
|
260
|
+
const urlPreview = values.url_preview;
|
|
261
|
+
if (urlPreview !== "embed" && urlPreview !== "network")
|
|
262
|
+
throw new Error("--url_preview must be embed | network");
|
|
263
|
+
const root = docsRoot(rootArg);
|
|
264
|
+
const out = join(resolve(outArg ?? join(root, "dist")), `bundle.${format}`);
|
|
265
|
+
const { buildBundle } = await import("./viewer/build.js");
|
|
266
|
+
const bundle = await buildBundle(root, { format, urlPreview });
|
|
267
|
+
writeOut(out, bundle.data);
|
|
268
|
+
console.log(`${out} — ${bundle.docs} docs (url_preview=${urlPreview})`);
|
|
269
|
+
}
|
|
270
|
+
catch (error) {
|
|
271
|
+
fail(error instanceof Error ? error.message : String(error));
|
|
272
|
+
}
|
|
273
|
+
break;
|
|
274
|
+
}
|
|
275
|
+
case "mcp": {
|
|
276
|
+
try {
|
|
277
|
+
const { positionals, values } = parseArgs({
|
|
278
|
+
args,
|
|
279
|
+
allowPositionals: true,
|
|
280
|
+
options: {
|
|
281
|
+
"git-origin": { type: "string" },
|
|
282
|
+
help: { type: "boolean", short: "h" },
|
|
283
|
+
},
|
|
284
|
+
});
|
|
285
|
+
if (values.help) {
|
|
286
|
+
console.log("usage: dooc mcp [root] [--git-origin <module>]\n\nExposes docs, files, Statics, fonts, check, build and Git over stdio.\nBuild accepts format=html|zip and url_preview=embed|network (default embed).\nThe external module's default export must contain gitOrigin (the same provider used by edit/view).\nOnly gitOrigin is used; viewer setup and data plugins are not started. Authentication stays in the provider.");
|
|
287
|
+
break;
|
|
288
|
+
}
|
|
289
|
+
if (positionals.length > 1)
|
|
290
|
+
throw new Error("mcp accepts at most one root path");
|
|
291
|
+
const { startMcp } = await import("./mcp.js");
|
|
292
|
+
const { loadViewerPlugins } = await import("./viewer/plugin-config.js");
|
|
293
|
+
const { gitOrigin } = await loadViewerPlugins(values["git-origin"]);
|
|
294
|
+
if (values["git-origin"] && !gitOrigin)
|
|
295
|
+
throw new Error("Module must provide gitOrigin");
|
|
296
|
+
await startMcp(docsRoot(positionals[0]), { gitOrigin });
|
|
297
|
+
}
|
|
298
|
+
catch (error) {
|
|
299
|
+
fail(error instanceof Error ? error.message : String(error));
|
|
300
|
+
}
|
|
301
|
+
break;
|
|
302
|
+
}
|
|
303
|
+
case undefined:
|
|
304
|
+
case "help":
|
|
305
|
+
case "--help":
|
|
306
|
+
case "-h":
|
|
307
|
+
console.log(USAGE);
|
|
308
|
+
break;
|
|
309
|
+
default:
|
|
310
|
+
fail(`unknown command: ${command}\n\n${USAGE}`);
|
|
311
|
+
}
|