@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/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-BY2caZ_v.mjs";
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
- dev [options] Start a docs dev server
53
- build [options] Build a docs site
54
- preview [options] Preview the built docs site
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
- Options:
57
- --port <number> Server port (dev: 3000, preview: 4173)
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;
@@ -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":"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"}
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 absolute path to favicon file, or false if disabled. */
78
- favicon: string | false;
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
@@ -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":";;;;;KAMK,UAAA;EACH,KAAA;EACA,IAAA;AAAA;AAAA,KAGU,cAAA;EACV,IAAA;EACA,KAAA;EACA,WAAA;EACA,MAAA;EACA,QAAA;EACA,UAAA;EACA,MAAA;EACA,SAAA,WAsBY;EApBZ,QAAA,WAgCW;EA9BX,QAAA;EACA,WAAA,GAAc,UAAA;EACd,OAAA;IAZA,iEAcE,WAAA;EAAA;EAEF,MAAA;IACE,OAAA,YAZF;IAcE,UAAA,YAXF;IAaE,cAAA,YAVF;IAYE,aAAA;EAAA;EAEF,KAAA;IACE,UAAA;IACA,SAAA;IACA,OAAA,GAAU,MAAA;EAAA;EAEZ,SAAA;IACE,eAAA;EAAA,GAJA;EAOF,OAAA;EACA,QAAA,GAAW,cAAA;EACX,IAAA;IACE,UAAA;EAAA,GAFF;EAKA,QAAA,GAAW,MAAA;IAAiB,KAAA;EAAA;AAAA;AAAA,KAGlB,kBAAA;EACV,OAAA;EACA,UAAA;EACA,MAAA;EACA,SAAA;EACA,QAAA;EACA,QAAA;EACA,IAAA;EACA,KAAA;EACA,WAAA;EACA,MAAA;EACA,QAAA;EACA,WAAA,EAAa,UAAA;EACb,OAAA;IACE,WAAA;EAAA;EAEF,MAAA;IACE,OAAA;IACA,UAAA;IACA,cAAA;IACA,aAAA;EAAA;EAEF,KAAA;IACE,UAAA;IACA,SAAA;IACA,OAAA,GAAU,MAAA;EAAA;EAEZ,SAAA;IACE,eAAA;EAAA,GAVA;EAaF,OAAA;EACA,QAAA,GAAW,cAAA;EACX,cAAA;EACA,QAAA,GAAW,MAAA;IAAiB,KAAA;EAAA;AAAA;AAAA,KAGlB,gBAAA;EACV,UAAA,WAPA;EASA,MAAA,WARW;EAUX,QAAA;AAAA;AAAA,KAGU,cAAA,GAAiB,gBAAA;EAC3B,IAAA;EACA,IAAA;AAAA;AAAA,iBAGc,gBAAA,CAAiB,MAAA,EAAQ,cAAA,GAAiB,cAAA;AAAA,iBAI1C,cAAA,CAAe,UAAA,YAAsB,cAAA;AAAA,iBASrC,iBAAA,CACd,UAAA,WACA,SAAA;EAAc,MAAA;EAAiB,QAAA;AAAA,IAC9B,kBAAA;;;iBC7CmB,KAAA,CAAM,OAAA,GAAS,gBAAA,GAAwB,OAAA;;;iBCTvC,QAAA,CAAS,OAAA,GAAS,cAAA,GAAsB,OAAA;AAAA,iBA0HxC,OAAA,CAAQ,OAAA,GAAS,cAAA,GAAsB,OAAA;;;KC5LxD,KAAA;EACH,KAAA;EACA,WAAA;EACA,GAAA;EACA,IAAA;IACE,MAAA;IACA,QAAA;IACA,IAAA;IACA,QAAA;IACA,GAAA;MAAQ,MAAA;MAAiB,aAAA;MAAwB,aAAA;IAAA;IACjD,KAAA;MAAU,UAAA;MAAqB,SAAA;IAAA;IAC/B,SAAA;MAAc,eAAA;IAAA;IACd,WAAA,GAAc,KAAA;MAAQ,KAAA;MAAe,IAAA;IAAA;IACrC,MAAA;MAAW,OAAA;MAAmB,UAAA;MAAsB,cAAA;IAAA;IACpD,OAAA;EAAA;EAEF,QAAA;AAAA;AAAA,iBAGc,IAAA,CAAA;EAAO,KAAA;EAAO,WAAA;EAAa,GAAA;EAAK,IAAA;EAAM;AAAA,GAAY,KAAA,GAAK,4BAAA,CAAA,UAAA"}
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, n as startDev, o as loadDocsConfig, r as build, s as resolveDocsConfig, t as preview } from "./site-BY2caZ_v.mjs";
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
@@ -1,4 +1,4 @@
1
- import { n as startDev, r as build, t as preview } from "./site-BY2caZ_v.mjs";
1
+ import { n as startDev, r as build, t as preview } from "./site-dJ3MiiW3.mjs";
2
2
  //#region src/preset.ts
3
3
  function docsPreset() {
4
4
  return {