@pagesmith/docs 0.2.0 → 0.3.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/README.md +34 -31
- package/REFERENCE.md +494 -0
- package/dist/cli/bin.mjs +186 -11
- package/dist/cli/bin.mjs.map +1 -1
- package/dist/index.d.mts +70 -6
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/preset.mjs +1 -1
- package/dist/site-dJ3MiiW3.mjs +1756 -0
- package/dist/site-dJ3MiiW3.mjs.map +1 -0
- package/package.json +14 -11
- package/theme/components/Html.tsx +58 -1
- package/theme/layouts/DocHome.tsx +8 -1
- package/theme/layouts/DocPage.tsx +80 -2
- package/theme/styles/content/page-meta.css +65 -0
- package/theme/styles/main.css +1 -0
- package/dist/site-BY2caZ_v.mjs +0 -11834
- package/dist/site-BY2caZ_v.mjs.map +0 -1
package/dist/cli/bin.mjs
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { n as startDev, r as build, t as preview } from "../site-
|
|
3
|
-
import { readFileSync } from "fs";
|
|
4
|
-
import { resolve } from "path";
|
|
2
|
+
import { n as startDev, o as detectGitOrigin, r as build, t as preview } from "../site-dJ3MiiW3.mjs";
|
|
3
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
|
|
4
|
+
import { basename, resolve } from "path";
|
|
5
|
+
import { createInterface } from "readline/promises";
|
|
5
6
|
//#region src/cli/bin.ts
|
|
6
7
|
function parseServerArgs(argv) {
|
|
7
8
|
const args = {};
|
|
8
9
|
for (let index = 0; index < argv.length; index += 1) {
|
|
9
10
|
const arg = argv[index];
|
|
10
|
-
if (arg === "--port") {
|
|
11
|
+
if (arg === "--port" || arg === "-p") {
|
|
11
12
|
const value = argv[++index];
|
|
12
13
|
if (!value) throw new Error("--port requires a number");
|
|
13
14
|
args.port = parseInt(value, 10);
|
|
@@ -40,6 +41,28 @@ function parseServerArgs(argv) {
|
|
|
40
41
|
}
|
|
41
42
|
return args;
|
|
42
43
|
}
|
|
44
|
+
function parseInitArgs(argv) {
|
|
45
|
+
const args = {};
|
|
46
|
+
for (let index = 0; index < argv.length; index += 1) {
|
|
47
|
+
const arg = argv[index];
|
|
48
|
+
if (arg === "--ai") {
|
|
49
|
+
args.ai = true;
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (arg === "--yes" || arg === "-y") {
|
|
53
|
+
args.yes = true;
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (arg === "--config") {
|
|
57
|
+
const value = argv[++index];
|
|
58
|
+
if (!value) throw new Error("--config requires a path");
|
|
59
|
+
args.config = value;
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (arg.startsWith("-")) throw new Error(`Unknown option: ${arg}`);
|
|
63
|
+
}
|
|
64
|
+
return args;
|
|
65
|
+
}
|
|
43
66
|
function getVersion() {
|
|
44
67
|
const pkgPath = resolve(import.meta.dirname, "..", "..", "package.json");
|
|
45
68
|
return JSON.parse(readFileSync(pkgPath, "utf-8")).version ?? "0.0.0";
|
|
@@ -49,26 +72,174 @@ function printHelp() {
|
|
|
49
72
|
pagesmith
|
|
50
73
|
|
|
51
74
|
Commands:
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
75
|
+
init [options] Initialize a docs project (interactive)
|
|
76
|
+
dev [options] Start a docs dev server
|
|
77
|
+
build [options] Build a docs site
|
|
78
|
+
preview [options] Preview the built docs site
|
|
79
|
+
|
|
80
|
+
Init options:
|
|
81
|
+
-y, --yes Skip prompts, use defaults
|
|
82
|
+
--ai Install AI integrations (skills, guidelines)
|
|
83
|
+
--config <path> Config file path
|
|
55
84
|
|
|
56
|
-
|
|
57
|
-
--port <number>
|
|
85
|
+
Server options:
|
|
86
|
+
-p, --port <number> Server port (dev: 3000, preview: 4000)
|
|
58
87
|
--open Open browser on server start
|
|
59
88
|
--out-dir <path> Output directory (overrides config)
|
|
60
89
|
--base-path <path> Base URL path prefix (overrides config)
|
|
61
90
|
--config <path> Config file path
|
|
91
|
+
|
|
92
|
+
General:
|
|
62
93
|
-v, --version Print version
|
|
94
|
+
-h, --help Print help
|
|
63
95
|
`.trim());
|
|
64
96
|
}
|
|
65
97
|
async function ensureDocsConfig(configPath) {
|
|
66
|
-
const { existsSync } = await import("fs");
|
|
67
|
-
const { resolve } = await import("path");
|
|
68
98
|
const resolved = resolve(configPath ?? "pagesmith.config.json5");
|
|
69
99
|
if (!existsSync(resolved)) throw new Error(`No pagesmith.config.json5 file found at ${resolved}`);
|
|
70
100
|
return resolved;
|
|
71
101
|
}
|
|
102
|
+
function titleize(name) {
|
|
103
|
+
return name.replace(/[-_]/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
|
|
104
|
+
}
|
|
105
|
+
function readPackageName(projectDir) {
|
|
106
|
+
try {
|
|
107
|
+
return JSON.parse(readFileSync(resolve(projectDir, "package.json"), "utf-8")).name?.replace(/^@[^/]+\//, "");
|
|
108
|
+
} catch {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
function detectDefaults(projectDir) {
|
|
113
|
+
const gitInfo = detectGitOrigin(projectDir);
|
|
114
|
+
const pkgName = readPackageName(projectDir);
|
|
115
|
+
const name = gitInfo?.repoName ?? pkgName ?? basename(projectDir);
|
|
116
|
+
return {
|
|
117
|
+
name,
|
|
118
|
+
title: titleize(name),
|
|
119
|
+
basePath: gitInfo?.basePath ?? "/",
|
|
120
|
+
contentDir: "docs",
|
|
121
|
+
search: true,
|
|
122
|
+
ai: false,
|
|
123
|
+
starterContent: true
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
async function promptInteractive(defaults) {
|
|
127
|
+
const rl = createInterface({
|
|
128
|
+
input: process.stdin,
|
|
129
|
+
output: process.stdout
|
|
130
|
+
});
|
|
131
|
+
const ask = async (label, fallback) => {
|
|
132
|
+
return (await rl.question(` ${label} (${fallback}): `)).trim() || fallback;
|
|
133
|
+
};
|
|
134
|
+
const confirm = async (label, defaultYes) => {
|
|
135
|
+
const hint = defaultYes ? "Y/n" : "y/N";
|
|
136
|
+
const trimmed = (await rl.question(` ${label} (${hint}): `)).trim().toLowerCase();
|
|
137
|
+
if (!trimmed) return defaultYes;
|
|
138
|
+
return trimmed.startsWith("y");
|
|
139
|
+
};
|
|
140
|
+
console.log(`\n Pagesmith v${getVersion()}\n`);
|
|
141
|
+
const name = await ask("Project name", defaults.name);
|
|
142
|
+
const title = await ask("Site title", titleize(name));
|
|
143
|
+
const basePath = await ask("Base path", defaults.basePath);
|
|
144
|
+
const contentDir = await ask("Content directory", defaults.contentDir);
|
|
145
|
+
const search = await confirm("Enable search?", defaults.search);
|
|
146
|
+
const ai = await confirm("Install AI integrations?", defaults.ai);
|
|
147
|
+
const starterContent = await confirm("Create starter content?", defaults.starterContent);
|
|
148
|
+
rl.close();
|
|
149
|
+
console.log();
|
|
150
|
+
return {
|
|
151
|
+
name,
|
|
152
|
+
title,
|
|
153
|
+
basePath,
|
|
154
|
+
contentDir,
|
|
155
|
+
search,
|
|
156
|
+
ai,
|
|
157
|
+
starterContent
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
function buildConfigContent(answers, gitOrigin) {
|
|
161
|
+
const lines = ["{"];
|
|
162
|
+
lines.push(` name: "${answers.name}",`);
|
|
163
|
+
lines.push(` title: "${answers.title}",`);
|
|
164
|
+
lines.push(` basePath: "${answers.basePath}",`);
|
|
165
|
+
if (gitOrigin) lines.push(` origin: "${gitOrigin}",`);
|
|
166
|
+
if (answers.search) lines.push(" search: { enabled: true },");
|
|
167
|
+
lines.push("}", "");
|
|
168
|
+
return lines.join("\n");
|
|
169
|
+
}
|
|
170
|
+
async function runInit(argv) {
|
|
171
|
+
const args = parseInitArgs(argv);
|
|
172
|
+
const projectDir = resolve(".");
|
|
173
|
+
const configPath = resolve(args.config ?? "pagesmith.config.json5");
|
|
174
|
+
const defaults = detectDefaults(projectDir);
|
|
175
|
+
if (args.ai) defaults.ai = true;
|
|
176
|
+
const answers = args.yes ? defaults : await promptInteractive(defaults);
|
|
177
|
+
const created = [];
|
|
178
|
+
if (!existsSync(configPath)) {
|
|
179
|
+
writeFileSync(configPath, buildConfigContent(answers, detectGitOrigin(projectDir)?.origin));
|
|
180
|
+
created.push(args.config ?? "pagesmith.config.json5");
|
|
181
|
+
} else console.log(` Config already exists: ${configPath}`);
|
|
182
|
+
const contentDir = resolve(answers.contentDir);
|
|
183
|
+
const dirs = [
|
|
184
|
+
contentDir,
|
|
185
|
+
resolve(contentDir, "guide"),
|
|
186
|
+
resolve(contentDir, "guide", "getting-started")
|
|
187
|
+
];
|
|
188
|
+
for (const dir of dirs) if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
|
|
189
|
+
if (answers.starterContent) {
|
|
190
|
+
const homePath = resolve(contentDir, "README.md");
|
|
191
|
+
if (!existsSync(homePath)) {
|
|
192
|
+
writeFileSync(homePath, [
|
|
193
|
+
"---",
|
|
194
|
+
`title: ${answers.title}`,
|
|
195
|
+
`tagline: Welcome to ${answers.title}`,
|
|
196
|
+
`description: ${answers.title} documentation`,
|
|
197
|
+
"actions:",
|
|
198
|
+
" - text: Get Started",
|
|
199
|
+
" link: /guide/getting-started",
|
|
200
|
+
" theme: brand",
|
|
201
|
+
"---",
|
|
202
|
+
""
|
|
203
|
+
].join("\n"));
|
|
204
|
+
created.push(`${answers.contentDir}/README.md`);
|
|
205
|
+
}
|
|
206
|
+
const gettingStartedPath = resolve(contentDir, "guide", "getting-started", "README.md");
|
|
207
|
+
if (!existsSync(gettingStartedPath)) {
|
|
208
|
+
writeFileSync(gettingStartedPath, [
|
|
209
|
+
"---",
|
|
210
|
+
"title: Getting Started",
|
|
211
|
+
"description: Learn the basics.",
|
|
212
|
+
"---",
|
|
213
|
+
"",
|
|
214
|
+
"# Getting Started",
|
|
215
|
+
"",
|
|
216
|
+
"Start here.",
|
|
217
|
+
""
|
|
218
|
+
].join("\n"));
|
|
219
|
+
created.push(`${answers.contentDir}/guide/getting-started/README.md`);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
if (answers.ai) {
|
|
223
|
+
const { installAiArtifacts } = await import("@pagesmith/core/ai");
|
|
224
|
+
const results = installAiArtifacts({
|
|
225
|
+
assistants: "all",
|
|
226
|
+
scope: "project",
|
|
227
|
+
profile: "docs"
|
|
228
|
+
});
|
|
229
|
+
for (const result of results) {
|
|
230
|
+
created.push(result.path);
|
|
231
|
+
console.log(` ${result.status}: ${result.label} → ${result.path}`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
if (created.length > 0) {
|
|
235
|
+
console.log(" Created:");
|
|
236
|
+
for (const file of created) console.log(` ${file}`);
|
|
237
|
+
}
|
|
238
|
+
console.log("\n Done! Next steps:");
|
|
239
|
+
console.log(` npx pagesmith dev`);
|
|
240
|
+
if (!answers.ai) console.log(" npx pagesmith init --ai # Optional: install AI integrations");
|
|
241
|
+
console.log();
|
|
242
|
+
}
|
|
72
243
|
async function runDev(argv) {
|
|
73
244
|
const args = parseServerArgs(argv);
|
|
74
245
|
await startDev({
|
|
@@ -103,6 +274,10 @@ async function main() {
|
|
|
103
274
|
console.log(getVersion());
|
|
104
275
|
return;
|
|
105
276
|
}
|
|
277
|
+
if (command === "init") {
|
|
278
|
+
await runInit(rest);
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
106
281
|
if (command === "dev") {
|
|
107
282
|
await runDev(rest);
|
|
108
283
|
return;
|
package/dist/cli/bin.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.mjs","names":[],"sources":["../../src/cli/bin.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { readFileSync } from 'fs'\nimport { resolve } from 'path'\nimport { build, preview, startDev } from '../site'\n\ntype ServerCliArgs = {\n port?: number\n config?: string\n open?: boolean\n outDir?: string\n basePath?: string\n}\n\nfunction parseServerArgs(argv: string[]): ServerCliArgs {\n const args: ServerCliArgs = {}\n\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index]!\n\n if (arg === '--port') {\n const value = argv[++index]\n if (!value) throw new Error('--port requires a number')\n args.port = parseInt(value, 10)\n if (Number.isNaN(args.port)) throw new Error('--port must be a valid number')\n continue\n }\n\n if (arg === '--config') {\n const value = argv[++index]\n if (!value) throw new Error('--config requires a path')\n args.config = value\n continue\n }\n\n if (arg === '--open') {\n args.open = true\n continue\n }\n\n if (arg === '--out-dir') {\n const value = argv[++index]\n if (!value) throw new Error('--out-dir requires a path')\n args.outDir = value\n continue\n }\n\n if (arg === '--base-path') {\n const value = argv[++index]\n if (!value) throw new Error('--base-path requires a value')\n args.basePath = value\n continue\n }\n\n if (arg.startsWith('-')) {\n throw new Error(`Unknown option: ${arg}`)\n }\n }\n\n return args\n}\n\nfunction getVersion(): string {\n const pkgPath = resolve(import.meta.dirname, '..', '..', 'package.json')\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'))\n return pkg.version ?? '0.0.0'\n}\n\nfunction printHelp(): void {\n console.log(\n `\npagesmith\n\nCommands:\n dev [options] Start a docs dev server\n build [options] Build a docs site\n preview [options] Preview the built docs site\n\nOptions:\n --port <number> Server port (dev: 3000, preview: 4173)\n --open Open browser on server start\n --out-dir <path> Output directory (overrides config)\n --base-path <path> Base URL path prefix (overrides config)\n --config <path> Config file path\n -v, --version Print version\n`.trim(),\n )\n}\n\nasync function ensureDocsConfig(configPath?: string): Promise<string> {\n const { existsSync } = await import('fs')\n const { resolve } = await import('path')\n\n const resolved = resolve(configPath ?? 'pagesmith.config.json5')\n if (!existsSync(resolved)) {\n throw new Error(`No pagesmith.config.json5 file found at ${resolved}`)\n }\n\n return resolved\n}\n\nasync function runDev(argv: string[]): Promise<void> {\n const args = parseServerArgs(argv)\n await startDev({\n configPath: await ensureDocsConfig(args.config),\n port: args.port,\n open: args.open,\n })\n}\n\nasync function runBuild(argv: string[]): Promise<void> {\n const args = parseServerArgs(argv)\n await build({\n configPath: await ensureDocsConfig(args.config),\n outDir: args.outDir,\n basePath: args.basePath,\n })\n}\n\nasync function runPreview(argv: string[]): Promise<void> {\n const args = parseServerArgs(argv)\n await preview({\n configPath: await ensureDocsConfig(args.config),\n port: args.port,\n open: args.open,\n })\n}\n\nasync function main(): Promise<void> {\n const [command, ...rest] = process.argv.slice(2)\n\n if (!command || command === '--help' || command === '-h') {\n printHelp()\n return\n }\n\n if (command === '--version' || command === '-v') {\n console.log(getVersion())\n return\n }\n\n if (command === 'dev') {\n await runDev(rest)\n return\n }\n\n if (command === 'build') {\n await runBuild(rest)\n return\n }\n\n if (command === 'preview') {\n await runPreview(rest)\n return\n }\n\n throw new Error(`Unknown command: ${command}`)\n}\n\nmain().catch((error) => {\n console.error(error instanceof Error ? error.message : String(error))\n process.exit(1)\n})\n"],"mappings":";;;;;AAcA,SAAS,gBAAgB,MAA+B;CACtD,MAAM,OAAsB,EAAE;AAE9B,MAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,GAAG;EACnD,MAAM,MAAM,KAAK;AAEjB,MAAI,QAAQ,UAAU;GACpB,MAAM,QAAQ,KAAK,EAAE;AACrB,OAAI,CAAC,MAAO,OAAM,IAAI,MAAM,2BAA2B;AACvD,QAAK,OAAO,SAAS,OAAO,GAAG;AAC/B,OAAI,OAAO,MAAM,KAAK,KAAK,CAAE,OAAM,IAAI,MAAM,gCAAgC;AAC7E;;AAGF,MAAI,QAAQ,YAAY;GACtB,MAAM,QAAQ,KAAK,EAAE;AACrB,OAAI,CAAC,MAAO,OAAM,IAAI,MAAM,2BAA2B;AACvD,QAAK,SAAS;AACd;;AAGF,MAAI,QAAQ,UAAU;AACpB,QAAK,OAAO;AACZ;;AAGF,MAAI,QAAQ,aAAa;GACvB,MAAM,QAAQ,KAAK,EAAE;AACrB,OAAI,CAAC,MAAO,OAAM,IAAI,MAAM,4BAA4B;AACxD,QAAK,SAAS;AACd;;AAGF,MAAI,QAAQ,eAAe;GACzB,MAAM,QAAQ,KAAK,EAAE;AACrB,OAAI,CAAC,MAAO,OAAM,IAAI,MAAM,+BAA+B;AAC3D,QAAK,WAAW;AAChB;;AAGF,MAAI,IAAI,WAAW,IAAI,CACrB,OAAM,IAAI,MAAM,mBAAmB,MAAM;;AAI7C,QAAO;;AAGT,SAAS,aAAqB;CAC5B,MAAM,UAAU,QAAQ,OAAO,KAAK,SAAS,MAAM,MAAM,eAAe;AAExE,QADY,KAAK,MAAM,aAAa,SAAS,QAAQ,CAAC,CAC3C,WAAW;;AAGxB,SAAS,YAAkB;AACzB,SAAQ,IACN;;;;;;;;;;;;;;;EAeF,MAAM,CACL;;AAGH,eAAe,iBAAiB,YAAsC;CACpE,MAAM,EAAE,eAAe,MAAM,OAAO;CACpC,MAAM,EAAE,YAAY,MAAM,OAAO;CAEjC,MAAM,WAAW,QAAQ,cAAc,yBAAyB;AAChE,KAAI,CAAC,WAAW,SAAS,CACvB,OAAM,IAAI,MAAM,2CAA2C,WAAW;AAGxE,QAAO;;AAGT,eAAe,OAAO,MAA+B;CACnD,MAAM,OAAO,gBAAgB,KAAK;AAClC,OAAM,SAAS;EACb,YAAY,MAAM,iBAAiB,KAAK,OAAO;EAC/C,MAAM,KAAK;EACX,MAAM,KAAK;EACZ,CAAC;;AAGJ,eAAe,SAAS,MAA+B;CACrD,MAAM,OAAO,gBAAgB,KAAK;AAClC,OAAM,MAAM;EACV,YAAY,MAAM,iBAAiB,KAAK,OAAO;EAC/C,QAAQ,KAAK;EACb,UAAU,KAAK;EAChB,CAAC;;AAGJ,eAAe,WAAW,MAA+B;CACvD,MAAM,OAAO,gBAAgB,KAAK;AAClC,OAAM,QAAQ;EACZ,YAAY,MAAM,iBAAiB,KAAK,OAAO;EAC/C,MAAM,KAAK;EACX,MAAM,KAAK;EACZ,CAAC;;AAGJ,eAAe,OAAsB;CACnC,MAAM,CAAC,SAAS,GAAG,QAAQ,QAAQ,KAAK,MAAM,EAAE;AAEhD,KAAI,CAAC,WAAW,YAAY,YAAY,YAAY,MAAM;AACxD,aAAW;AACX;;AAGF,KAAI,YAAY,eAAe,YAAY,MAAM;AAC/C,UAAQ,IAAI,YAAY,CAAC;AACzB;;AAGF,KAAI,YAAY,OAAO;AACrB,QAAM,OAAO,KAAK;AAClB;;AAGF,KAAI,YAAY,SAAS;AACvB,QAAM,SAAS,KAAK;AACpB;;AAGF,KAAI,YAAY,WAAW;AACzB,QAAM,WAAW,KAAK;AACtB;;AAGF,OAAM,IAAI,MAAM,oBAAoB,UAAU;;AAGhD,MAAM,CAAC,OAAO,UAAU;AACtB,SAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,CAAC;AACrE,SAAQ,KAAK,EAAE;EACf"}
|
|
1
|
+
{"version":3,"file":"bin.mjs","names":[],"sources":["../../src/cli/bin.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs'\nimport { basename, resolve } from 'path'\nimport { createInterface } from 'readline/promises'\nimport { detectGitOrigin } from '../config'\nimport { build, preview, startDev } from '../site'\n\ntype ServerCliArgs = {\n port?: number\n config?: string\n open?: boolean\n outDir?: string\n basePath?: string\n}\n\ntype InitCliArgs = {\n ai?: boolean\n config?: string\n yes?: boolean\n}\n\nfunction parseServerArgs(argv: string[]): ServerCliArgs {\n const args: ServerCliArgs = {}\n\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index]!\n\n if (arg === '--port' || arg === '-p') {\n const value = argv[++index]\n if (!value) throw new Error('--port requires a number')\n args.port = parseInt(value, 10)\n if (Number.isNaN(args.port)) throw new Error('--port must be a valid number')\n continue\n }\n\n if (arg === '--config') {\n const value = argv[++index]\n if (!value) throw new Error('--config requires a path')\n args.config = value\n continue\n }\n\n if (arg === '--open') {\n args.open = true\n continue\n }\n\n if (arg === '--out-dir') {\n const value = argv[++index]\n if (!value) throw new Error('--out-dir requires a path')\n args.outDir = value\n continue\n }\n\n if (arg === '--base-path') {\n const value = argv[++index]\n if (!value) throw new Error('--base-path requires a value')\n args.basePath = value\n continue\n }\n\n if (arg.startsWith('-')) {\n throw new Error(`Unknown option: ${arg}`)\n }\n }\n\n return args\n}\n\nfunction parseInitArgs(argv: string[]): InitCliArgs {\n const args: InitCliArgs = {}\n\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index]!\n\n if (arg === '--ai') {\n args.ai = true\n continue\n }\n\n if (arg === '--yes' || arg === '-y') {\n args.yes = true\n continue\n }\n\n if (arg === '--config') {\n const value = argv[++index]\n if (!value) throw new Error('--config requires a path')\n args.config = value\n continue\n }\n\n if (arg.startsWith('-')) {\n throw new Error(`Unknown option: ${arg}`)\n }\n }\n\n return args\n}\n\nfunction getVersion(): string {\n const pkgPath = resolve(import.meta.dirname, '..', '..', 'package.json')\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'))\n return pkg.version ?? '0.0.0'\n}\n\nfunction printHelp(): void {\n console.log(\n `\npagesmith\n\nCommands:\n init [options] Initialize a docs project (interactive)\n dev [options] Start a docs dev server\n build [options] Build a docs site\n preview [options] Preview the built docs site\n\nInit options:\n -y, --yes Skip prompts, use defaults\n --ai Install AI integrations (skills, guidelines)\n --config <path> Config file path\n\nServer options:\n -p, --port <number> Server port (dev: 3000, preview: 4000)\n --open Open browser on server start\n --out-dir <path> Output directory (overrides config)\n --base-path <path> Base URL path prefix (overrides config)\n --config <path> Config file path\n\nGeneral:\n -v, --version Print version\n -h, --help Print help\n`.trim(),\n )\n}\n\nasync function ensureDocsConfig(configPath?: string): Promise<string> {\n const resolved = resolve(configPath ?? 'pagesmith.config.json5')\n if (!existsSync(resolved)) {\n throw new Error(`No pagesmith.config.json5 file found at ${resolved}`)\n }\n\n return resolved\n}\n\n// ---------------------------------------------------------------------------\n// Interactive prompts (Node built-in readline/promises)\n// ---------------------------------------------------------------------------\n\ntype InitAnswers = {\n name: string\n title: string\n basePath: string\n contentDir: string\n search: boolean\n ai: boolean\n starterContent: boolean\n}\n\nfunction titleize(name: string): string {\n return name.replace(/[-_]/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase())\n}\n\nfunction readPackageName(projectDir: string): string | undefined {\n try {\n const pkg = JSON.parse(readFileSync(resolve(projectDir, 'package.json'), 'utf-8'))\n const raw: string | undefined = pkg.name\n return raw?.replace(/^@[^/]+\\//, '') // strip npm scope\n } catch {\n return undefined\n }\n}\n\nfunction detectDefaults(projectDir: string): InitAnswers {\n const gitInfo = detectGitOrigin(projectDir)\n const pkgName = readPackageName(projectDir)\n const name = gitInfo?.repoName ?? pkgName ?? basename(projectDir)\n\n return {\n name,\n title: titleize(name),\n basePath: gitInfo?.basePath ?? '/',\n contentDir: 'docs',\n search: true,\n ai: false,\n starterContent: true,\n }\n}\n\nasync function promptInteractive(defaults: InitAnswers): Promise<InitAnswers> {\n const rl = createInterface({ input: process.stdin, output: process.stdout })\n\n const ask = async (label: string, fallback: string): Promise<string> => {\n const answer = await rl.question(` ${label} (${fallback}): `)\n return answer.trim() || fallback\n }\n\n const confirm = async (label: string, defaultYes: boolean): Promise<boolean> => {\n const hint = defaultYes ? 'Y/n' : 'y/N'\n const answer = await rl.question(` ${label} (${hint}): `)\n const trimmed = answer.trim().toLowerCase()\n if (!trimmed) return defaultYes\n return trimmed.startsWith('y')\n }\n\n console.log(`\\n Pagesmith v${getVersion()}\\n`)\n\n const name = await ask('Project name', defaults.name)\n const title = await ask('Site title', titleize(name))\n const basePath = await ask('Base path', defaults.basePath)\n const contentDir = await ask('Content directory', defaults.contentDir)\n const search = await confirm('Enable search?', defaults.search)\n const ai = await confirm('Install AI integrations?', defaults.ai)\n const starterContent = await confirm('Create starter content?', defaults.starterContent)\n\n rl.close()\n console.log()\n\n return { name, title, basePath, contentDir, search, ai, starterContent }\n}\n\n// ---------------------------------------------------------------------------\n// Init logic\n// ---------------------------------------------------------------------------\n\nfunction buildConfigContent(answers: InitAnswers, gitOrigin?: string): string {\n const lines: string[] = ['{']\n lines.push(` name: \"${answers.name}\",`)\n lines.push(` title: \"${answers.title}\",`)\n lines.push(` basePath: \"${answers.basePath}\",`)\n if (gitOrigin) lines.push(` origin: \"${gitOrigin}\",`)\n if (answers.search) lines.push(' search: { enabled: true },')\n lines.push('}', '')\n return lines.join('\\n')\n}\n\nasync function runInit(argv: string[]): Promise<void> {\n const args = parseInitArgs(argv)\n const projectDir = resolve('.')\n const configPath = resolve(args.config ?? 'pagesmith.config.json5')\n\n const defaults = detectDefaults(projectDir)\n\n // --ai flag pre-selects AI integrations even in interactive mode\n if (args.ai) defaults.ai = true\n\n // Resolve answers: interactive or accept defaults\n const answers = args.yes ? defaults : await promptInteractive(defaults)\n\n const created: string[] = []\n\n // 1. Create config file\n if (!existsSync(configPath)) {\n const gitInfo = detectGitOrigin(projectDir)\n const configContent = buildConfigContent(answers, gitInfo?.origin)\n writeFileSync(configPath, configContent)\n created.push(args.config ?? 'pagesmith.config.json5')\n } else {\n console.log(` Config already exists: ${configPath}`)\n }\n\n // 2. Create content directory structure\n const contentDir = resolve(answers.contentDir)\n const dirs = [\n contentDir,\n resolve(contentDir, 'guide'),\n resolve(contentDir, 'guide', 'getting-started'),\n ]\n\n for (const dir of dirs) {\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true })\n }\n\n // 3. Starter content\n if (answers.starterContent) {\n const homePath = resolve(contentDir, 'README.md')\n if (!existsSync(homePath)) {\n writeFileSync(\n homePath,\n [\n '---',\n `title: ${answers.title}`,\n `tagline: Welcome to ${answers.title}`,\n `description: ${answers.title} documentation`,\n 'actions:',\n ' - text: Get Started',\n ' link: /guide/getting-started',\n ' theme: brand',\n '---',\n '',\n ].join('\\n'),\n )\n created.push(`${answers.contentDir}/README.md`)\n }\n\n const gettingStartedPath = resolve(contentDir, 'guide', 'getting-started', 'README.md')\n if (!existsSync(gettingStartedPath)) {\n writeFileSync(\n gettingStartedPath,\n [\n '---',\n 'title: Getting Started',\n 'description: Learn the basics.',\n '---',\n '',\n '# Getting Started',\n '',\n 'Start here.',\n '',\n ].join('\\n'),\n )\n created.push(`${answers.contentDir}/guide/getting-started/README.md`)\n }\n }\n\n // 4. AI integrations\n if (answers.ai) {\n const { installAiArtifacts } = await import('@pagesmith/core/ai')\n const results = installAiArtifacts({\n assistants: 'all',\n scope: 'project',\n profile: 'docs',\n })\n for (const result of results) {\n created.push(result.path)\n console.log(` ${result.status}: ${result.label} → ${result.path}`)\n }\n }\n\n // 5. Summary\n if (created.length > 0) {\n console.log(' Created:')\n for (const file of created) {\n console.log(` ${file}`)\n }\n }\n\n console.log('\\n Done! Next steps:')\n console.log(` npx pagesmith dev`)\n if (!answers.ai) {\n console.log(' npx pagesmith init --ai # Optional: install AI integrations')\n }\n console.log()\n}\n\nasync function runDev(argv: string[]): Promise<void> {\n const args = parseServerArgs(argv)\n await startDev({\n configPath: await ensureDocsConfig(args.config),\n port: args.port,\n open: args.open,\n })\n}\n\nasync function runBuild(argv: string[]): Promise<void> {\n const args = parseServerArgs(argv)\n await build({\n configPath: await ensureDocsConfig(args.config),\n outDir: args.outDir,\n basePath: args.basePath,\n })\n}\n\nasync function runPreview(argv: string[]): Promise<void> {\n const args = parseServerArgs(argv)\n await preview({\n configPath: await ensureDocsConfig(args.config),\n port: args.port,\n open: args.open,\n })\n}\n\nasync function main(): Promise<void> {\n const [command, ...rest] = process.argv.slice(2)\n\n if (!command || command === '--help' || command === '-h') {\n printHelp()\n return\n }\n\n if (command === '--version' || command === '-v') {\n console.log(getVersion())\n return\n }\n\n if (command === 'init') {\n await runInit(rest)\n return\n }\n\n if (command === 'dev') {\n await runDev(rest)\n return\n }\n\n if (command === 'build') {\n await runBuild(rest)\n return\n }\n\n if (command === 'preview') {\n await runPreview(rest)\n return\n }\n\n throw new Error(`Unknown command: ${command}`)\n}\n\nmain().catch((error) => {\n console.error(error instanceof Error ? error.message : String(error))\n process.exit(1)\n})\n"],"mappings":"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"}
|
package/dist/index.d.mts
CHANGED
|
@@ -31,12 +31,20 @@ type DocsUserConfig = {
|
|
|
31
31
|
theme?: {
|
|
32
32
|
lightColor?: string;
|
|
33
33
|
darkColor?: string;
|
|
34
|
-
layouts?: Record<string, string>;
|
|
34
|
+
layouts?: Record<string, string>; /** Path to default social sharing image, relative to publicDir or an absolute URL */
|
|
35
|
+
socialImage?: string;
|
|
35
36
|
};
|
|
36
37
|
analytics?: {
|
|
37
38
|
googleAnalytics?: string;
|
|
38
39
|
}; /** Path to favicon file relative to project root. Defaults to 'public/favicon.svg'. Set to false to disable. */
|
|
39
|
-
favicon?: string | false;
|
|
40
|
+
favicon?: string | false; /** Show "Edit this page" link on each page. */
|
|
41
|
+
editLink?: {
|
|
42
|
+
/** GitHub/GitLab repo URL (e.g. 'https://github.com/user/repo') */repo: string; /** Branch name (default: 'main') */
|
|
43
|
+
branch?: string; /** Label for the link (default: 'Edit this page') */
|
|
44
|
+
label?: string;
|
|
45
|
+
}; /** Show git-based "last updated" timestamp on pages (default: false) */
|
|
46
|
+
lastUpdated?: boolean; /** Generate sitemap.xml during build (default: true when origin is set). Set false to disable. */
|
|
47
|
+
sitemap?: boolean;
|
|
40
48
|
markdown?: MarkdownConfig;
|
|
41
49
|
home?: {
|
|
42
50
|
configFile?: string;
|
|
@@ -44,6 +52,23 @@ type DocsUserConfig = {
|
|
|
44
52
|
packages?: Record<string, {
|
|
45
53
|
label: string;
|
|
46
54
|
}>;
|
|
55
|
+
/**
|
|
56
|
+
* Map output paths to source files/folders that should be copied to the build output.
|
|
57
|
+
* Keys are output directory paths (e.g. "/" for root, "/api" for api/).
|
|
58
|
+
* Values are arrays of file or folder names resolved relative to the project root.
|
|
59
|
+
* Folders are copied recursively.
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* ```json5
|
|
63
|
+
* { assets: { "/": ["llms.txt", "robots.txt"], "/api": ["openapi.json"] } }
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
assets?: Record<string, string[]>; /** Server port and behavior settings for dev and preview commands. */
|
|
67
|
+
server?: {
|
|
68
|
+
/** Default port for the dev server (default: 3000). */devPort?: number; /** Default port for the preview server (default: 4000). */
|
|
69
|
+
previewPort?: number; /** When true, fail if the configured port is in use instead of finding the next available port (default: false). */
|
|
70
|
+
strictPort?: boolean;
|
|
71
|
+
};
|
|
47
72
|
};
|
|
48
73
|
type ResolvedDocsConfig = {
|
|
49
74
|
rootDir: string;
|
|
@@ -74,13 +99,31 @@ type ResolvedDocsConfig = {
|
|
|
74
99
|
};
|
|
75
100
|
analytics?: {
|
|
76
101
|
googleAnalytics?: string;
|
|
77
|
-
}; /** Resolved
|
|
78
|
-
|
|
102
|
+
}; /** Resolved path to default social sharing image, or undefined if not set. */
|
|
103
|
+
socialImage?: string; /** Resolved absolute path to favicon file, or false if disabled. */
|
|
104
|
+
favicon: string | false; /** Resolved absolute path to apple-touch-icon, or false if not found. */
|
|
105
|
+
appleTouchIcon: string | false; /** Resolved absolute path to ICO fallback (when primary favicon is SVG), or false. */
|
|
106
|
+
faviconFallback: string | false;
|
|
107
|
+
editLink?: {
|
|
108
|
+
repo: string;
|
|
109
|
+
branch: string;
|
|
110
|
+
label: string; /** Pre-computed edit URL pattern (includes host-specific path structure). */
|
|
111
|
+
editPattern: string;
|
|
112
|
+
};
|
|
113
|
+
lastUpdated: boolean;
|
|
114
|
+
sitemap: boolean;
|
|
79
115
|
markdown?: MarkdownConfig;
|
|
80
116
|
homeConfigFile?: string;
|
|
81
117
|
packages?: Record<string, {
|
|
82
118
|
label: string;
|
|
83
|
-
}>;
|
|
119
|
+
}>; /** Resolved asset mappings: output path → array of resolved absolute source paths. */
|
|
120
|
+
assets: Map<string, string[]>; /** Resolved server settings. */
|
|
121
|
+
server: {
|
|
122
|
+
devPort: number;
|
|
123
|
+
previewPort: number;
|
|
124
|
+
strictPort: boolean;
|
|
125
|
+
}; /** @internal Raw user config — used by validateConfig to distinguish explicit values from fallbacks. */
|
|
126
|
+
_userConfig?: DocsUserConfig;
|
|
84
127
|
};
|
|
85
128
|
type DocsBuildOptions = {
|
|
86
129
|
configPath?: string; /** Override output directory from CLI (takes precedence over config). */
|
|
@@ -93,10 +136,26 @@ type DocsDevOptions = DocsBuildOptions & {
|
|
|
93
136
|
};
|
|
94
137
|
declare function defineDocsConfig(config: DocsUserConfig): DocsUserConfig;
|
|
95
138
|
declare function loadDocsConfig(configPath?: string): DocsUserConfig;
|
|
139
|
+
/** Prefix a path with a base path, avoiding double slashes. */
|
|
140
|
+
declare function withBase(basePath: string, path: string): string;
|
|
96
141
|
declare function resolveDocsConfig(configPath?: string, overrides?: {
|
|
97
142
|
outDir?: string;
|
|
98
143
|
basePath?: string;
|
|
99
144
|
}): ResolvedDocsConfig;
|
|
145
|
+
type ConfigValidationIssue = {
|
|
146
|
+
field: string;
|
|
147
|
+
message: string;
|
|
148
|
+
severity: 'error' | 'warn';
|
|
149
|
+
};
|
|
150
|
+
/**
|
|
151
|
+
* Validate a resolved docs config. Returns issues found.
|
|
152
|
+
* Checks required fields, verifies referenced directories and asset files exist.
|
|
153
|
+
*/
|
|
154
|
+
declare function validateConfig(config: ResolvedDocsConfig): ConfigValidationIssue[];
|
|
155
|
+
/**
|
|
156
|
+
* Log validation issues to console. Returns true if there are any errors (severity: 'error').
|
|
157
|
+
*/
|
|
158
|
+
declare function reportConfigIssues(issues: ConfigValidationIssue[]): boolean;
|
|
100
159
|
//#endregion
|
|
101
160
|
//#region src/build.d.ts
|
|
102
161
|
declare function build(options?: DocsBuildOptions): Promise<void>;
|
|
@@ -110,6 +169,7 @@ type Props = {
|
|
|
110
169
|
title: string;
|
|
111
170
|
description?: string;
|
|
112
171
|
url?: string;
|
|
172
|
+
socialImage?: string;
|
|
113
173
|
site: {
|
|
114
174
|
origin: string;
|
|
115
175
|
basePath?: string;
|
|
@@ -136,7 +196,10 @@ type Props = {
|
|
|
136
196
|
showImages?: boolean;
|
|
137
197
|
showSubResults?: boolean;
|
|
138
198
|
};
|
|
199
|
+
socialImage?: string;
|
|
139
200
|
favicon?: string | false;
|
|
201
|
+
faviconFallback?: string | false;
|
|
202
|
+
appleTouchIcon?: string | false;
|
|
140
203
|
};
|
|
141
204
|
children?: any;
|
|
142
205
|
};
|
|
@@ -144,9 +207,10 @@ declare function Html({
|
|
|
144
207
|
title,
|
|
145
208
|
description,
|
|
146
209
|
url,
|
|
210
|
+
socialImage,
|
|
147
211
|
site,
|
|
148
212
|
children
|
|
149
213
|
}: Props): _pagesmith_core_jsx_runtime0.HtmlString;
|
|
150
214
|
//#endregion
|
|
151
|
-
export { type DocsBuildOptions, type DocsDevOptions, type DocsPreset, type DocsUserConfig, Html, type ResolvedDocsConfig, build, defineDocsConfig, docsPreset, loadDocsConfig, preview, resolveDocsConfig, startDev };
|
|
215
|
+
export { type ConfigValidationIssue, type DocsBuildOptions, type DocsDevOptions, type DocsPreset, type DocsUserConfig, Html, type ResolvedDocsConfig, build, defineDocsConfig, docsPreset, loadDocsConfig, preview, reportConfigIssues, resolveDocsConfig, startDev, validateConfig, withBase };
|
|
152
216
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/config.ts","../src/build.ts","../src/server.ts","../theme/components/Html.tsx"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/config.ts","../src/build.ts","../src/server.ts","../theme/components/Html.tsx"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { a as defineDocsConfig, i as Html,
|
|
1
|
+
import { a as defineDocsConfig, c as reportConfigIssues, d as withBase, i as Html, l as resolveDocsConfig, n as startDev, r as build, s as loadDocsConfig, t as preview, u as validateConfig } from "./site-dJ3MiiW3.mjs";
|
|
2
2
|
import { docsPreset } from "./preset.mjs";
|
|
3
|
-
export { Html, build, defineDocsConfig, docsPreset, loadDocsConfig, preview, resolveDocsConfig, startDev };
|
|
3
|
+
export { Html, build, defineDocsConfig, docsPreset, loadDocsConfig, preview, reportConfigIssues, resolveDocsConfig, startDev, validateConfig, withBase };
|
package/dist/preset.mjs
CHANGED