@maplab/hyperdoc 0.2.0 → 0.2.1

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/index.d.ts CHANGED
@@ -1 +1,2 @@
1
- #!/usr/bin/env node
1
+
2
+ export { }
package/dist/index.js CHANGED
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env node
2
- #!/usr/bin/env node
3
2
  "use strict";
4
3
  var __create = Object.create;
5
4
  var __defProp = Object.defineProperty;
@@ -114,6 +113,61 @@ var require_project = __commonJS({
114
113
  }
115
114
  });
116
115
 
116
+ // ../../packages/core/dist/doc-types.js
117
+ var require_doc_types = __commonJS({
118
+ "../../packages/core/dist/doc-types.js"(exports2) {
119
+ "use strict";
120
+ Object.defineProperty(exports2, "__esModule", { value: true });
121
+ exports2.stripDocExtension = exports2.normalizeDocName = exports2.getDocTypeFromName = exports2.getDocExtension = exports2.DOC_TYPE_CONFIG = void 0;
122
+ exports2.DOC_TYPE_CONFIG = [
123
+ { type: "markdown", extension: ".md" },
124
+ { type: "json", extension: ".json" },
125
+ { type: "app", extension: ".app.json" }
126
+ ];
127
+ var DOC_TYPE_CONFIG_MAP = exports2.DOC_TYPE_CONFIG.reduce((acc, config) => {
128
+ acc[config.type] = config;
129
+ return acc;
130
+ }, {});
131
+ var EXTENSION_ORDER = [...exports2.DOC_TYPE_CONFIG].sort((a, b) => b.extension.length - a.extension.length);
132
+ var getDocExtension = (type) => DOC_TYPE_CONFIG_MAP[type].extension;
133
+ exports2.getDocExtension = getDocExtension;
134
+ var getDocTypeFromName = (name) => {
135
+ const lower = name.toLowerCase();
136
+ for (const config of EXTENSION_ORDER) {
137
+ if (lower.endsWith(config.extension.toLowerCase())) {
138
+ return config.type;
139
+ }
140
+ }
141
+ return null;
142
+ };
143
+ exports2.getDocTypeFromName = getDocTypeFromName;
144
+ var normalizeDocName = (name, type) => {
145
+ const trimmed = name.trim();
146
+ if (!trimmed)
147
+ return "";
148
+ const targetExtension = (0, exports2.getDocExtension)(type);
149
+ const lower = trimmed.toLowerCase();
150
+ for (const config of EXTENSION_ORDER) {
151
+ if (lower.endsWith(config.extension.toLowerCase())) {
152
+ return trimmed.slice(0, trimmed.length - config.extension.length) + targetExtension;
153
+ }
154
+ }
155
+ return `${trimmed}${targetExtension}`;
156
+ };
157
+ exports2.normalizeDocName = normalizeDocName;
158
+ var stripDocExtension = (name) => {
159
+ const lower = name.toLowerCase();
160
+ for (const config of EXTENSION_ORDER) {
161
+ if (lower.endsWith(config.extension.toLowerCase())) {
162
+ return name.slice(0, name.length - config.extension.length);
163
+ }
164
+ }
165
+ return name;
166
+ };
167
+ exports2.stripDocExtension = stripDocExtension;
168
+ }
169
+ });
170
+
117
171
  // ../../packages/core/dist/index.js
118
172
  var require_dist = __commonJS({
119
173
  "../../packages/core/dist/index.js"(exports2) {
@@ -138,6 +192,7 @@ var require_dist = __commonJS({
138
192
  __exportStar(require_errors(), exports2);
139
193
  __exportStar(require_logger(), exports2);
140
194
  __exportStar(require_project(), exports2);
195
+ __exportStar(require_doc_types(), exports2);
141
196
  }
142
197
  });
143
198
 
@@ -220,6 +275,7 @@ var require_createApp = __commonJS({
220
275
  const archiveDirName = "archive";
221
276
  const trashDirName = "trash";
222
277
  const projectFileName = "project.json";
278
+ const docExtensions = core_1.DOC_TYPE_CONFIG.map((config) => config.extension);
223
279
  const resolveDocPath = (name) => path_1.default.resolve(rootDir, name);
224
280
  const isDocPathSafe = (filePath) => filePath.startsWith(rootDirPrefix);
225
281
  const isMetadataName = (name) => name === metadataFileName;
@@ -277,11 +333,11 @@ var require_createApp = __commonJS({
277
333
  return Array.from(new Set(cleaned)).sort();
278
334
  };
279
335
  const tagsFromContent = (name, content) => {
280
- const ext = path_1.default.extname(name).toLowerCase();
281
- if (ext === ".md") {
336
+ const type = (0, core_1.getDocTypeFromName)(name);
337
+ if (type === "markdown") {
282
338
  return (0, adapter_markdown_1.getMarkdownMetadata)(content)?.tags ?? [];
283
339
  }
284
- if (ext === ".json") {
340
+ if (type === "json" || type === "app") {
285
341
  return decodeJsonMetadata(content)?.tags ?? [];
286
342
  }
287
343
  return [];
@@ -309,7 +365,7 @@ var require_createApp = __commonJS({
309
365
  };
310
366
  const refreshTagsFromDisk = () => {
311
367
  fileTags.clear();
312
- const entries = fs_1.default.readdirSync(rootDir, { withFileTypes: true }).filter((entry) => entry.isFile()).filter((entry) => entry.name.endsWith(".md") || entry.name.endsWith(".json")).filter((entry) => !isMetadataName(entry.name));
368
+ const entries = fs_1.default.readdirSync(rootDir, { withFileTypes: true }).filter((entry) => entry.isFile()).filter((entry) => docExtensions.some((extension) => entry.name.endsWith(extension))).filter((entry) => !isMetadataName(entry.name));
313
369
  for (const entry of entries) {
314
370
  indexFileTags(entry.name);
315
371
  }
@@ -325,7 +381,7 @@ var require_createApp = __commonJS({
325
381
  return null;
326
382
  };
327
383
  const displayNameFromFileName = (name) => {
328
- const base = name.replace(/\.(md|json)$/i, "");
384
+ const base = (0, core_1.stripDocExtension)(name);
329
385
  const spaced = base.replace(/-+/g, " ").trim();
330
386
  if (!spaced)
331
387
  return base;
@@ -335,6 +391,10 @@ var require_createApp = __commonJS({
335
391
  if (options.staticDir && fs_1.default.existsSync(options.staticDir)) {
336
392
  app.use(express_1.default.static(options.staticDir));
337
393
  }
394
+ const bundlesDir = path_1.default.join(rootDir, "bundles");
395
+ if (fs_1.default.existsSync(bundlesDir)) {
396
+ app.use("/bundles", express_1.default.static(bundlesDir));
397
+ }
338
398
  app.get("/api/project", (req, res) => {
339
399
  const { config, error } = readProjectConfig();
340
400
  if (error) {
@@ -368,50 +428,59 @@ var require_createApp = __commonJS({
368
428
  res.json({ name: result.data.name ?? null });
369
429
  });
370
430
  app.get("/api/docs", (req, res) => {
371
- const entries = fs_1.default.readdirSync(rootDir, { withFileTypes: true }).filter((entry) => entry.isFile()).filter((entry) => entry.name.endsWith(".md") || entry.name.endsWith(".json")).filter((entry) => !isMetadataName(entry.name)).map((entry) => ({
372
- name: entry.name,
373
- type: entry.name.endsWith(".md") ? "markdown" : "json"
374
- })).map((entry) => {
431
+ const entries = fs_1.default.readdirSync(rootDir, { withFileTypes: true }).filter((entry) => entry.isFile()).filter((entry) => entry.name.endsWith(".md") || entry.name.endsWith(".json")).filter((entry) => !isMetadataName(entry.name)).map((entry) => {
432
+ const type = (0, core_1.getDocTypeFromName)(entry.name);
433
+ return type ? { name: entry.name, type } : null;
434
+ }).filter((entry) => entry !== null).map((entry) => {
375
435
  const filePath = resolveDocPath(entry.name);
376
436
  if (entry.type === "markdown") {
377
437
  let title = null;
378
- let tags2 = [];
379
- let pinned2 = false;
438
+ let tags = [];
439
+ let pinned = false;
380
440
  try {
381
441
  const content = fs_1.default.readFileSync(filePath, "utf-8");
382
442
  title = (0, adapter_markdown_1.extractMarkdownTitle)(content);
383
443
  const metadata = (0, adapter_markdown_1.getMarkdownMetadata)(content);
384
- tags2 = normalizeTags(metadata?.tags ?? []);
385
- pinned2 = metadata?.pinned ?? false;
444
+ tags = normalizeTags(metadata?.tags ?? []);
445
+ pinned = metadata?.pinned ?? false;
386
446
  } catch {
387
447
  title = null;
388
- tags2 = [];
389
- pinned2 = false;
448
+ tags = [];
449
+ pinned = false;
390
450
  }
391
451
  return {
392
452
  ...entry,
393
453
  title,
394
- tags: tags2,
395
- pinned: pinned2,
454
+ tags,
455
+ pinned,
396
456
  displayName: title && title.length > 0 ? title : displayNameFromFileName(entry.name)
397
457
  };
398
458
  }
399
- let tags = [];
400
- let pinned = false;
401
- try {
402
- const content = fs_1.default.readFileSync(filePath, "utf-8");
403
- const metadata = decodeJsonMetadata(content);
404
- tags = normalizeTags(metadata?.tags ?? []);
405
- pinned = metadata?.pinned ?? false;
406
- } catch {
407
- tags = [];
408
- pinned = false;
459
+ if (entry.type === "json" || entry.type === "app") {
460
+ let tags = [];
461
+ let pinned = false;
462
+ try {
463
+ const content = fs_1.default.readFileSync(filePath, "utf-8");
464
+ const metadata = decodeJsonMetadata(content);
465
+ tags = normalizeTags(metadata?.tags ?? []);
466
+ pinned = metadata?.pinned ?? false;
467
+ } catch {
468
+ tags = [];
469
+ pinned = false;
470
+ }
471
+ return {
472
+ ...entry,
473
+ title: null,
474
+ tags,
475
+ pinned,
476
+ displayName: displayNameFromFileName(entry.name)
477
+ };
409
478
  }
410
479
  return {
411
480
  ...entry,
412
481
  title: null,
413
- tags,
414
- pinned,
482
+ tags: [],
483
+ pinned: false,
415
484
  displayName: displayNameFromFileName(entry.name)
416
485
  };
417
486
  });
@@ -445,29 +514,19 @@ var require_createApp = __commonJS({
445
514
  } else if (req.body && typeof req.body === "object") {
446
515
  payload = req.body;
447
516
  }
448
- const rawName = String(payload?.name ?? "").trim();
517
+ const rawName = String(payload?.name ?? "");
449
518
  const rawType = payload?.type ?? null;
450
519
  if (!rawType) {
451
520
  res.status(400).send("Missing type");
452
521
  return;
453
522
  }
454
- const name = rawName;
523
+ const name = (0, core_1.normalizeDocName)(rawName, rawType);
455
524
  const nameError = validateDocName(name);
456
525
  if (nameError) {
457
526
  res.status(400).send(nameError);
458
527
  return;
459
528
  }
460
- const hasMarkdownExt = name.endsWith(".md");
461
- const hasJsonExt = name.endsWith(".json");
462
- if (hasMarkdownExt && rawType !== "markdown") {
463
- res.status(400).send("Name extension does not match type");
464
- return;
465
- }
466
- if (hasJsonExt && rawType !== "json") {
467
- res.status(400).send("Name extension does not match type");
468
- return;
469
- }
470
- const fileName = hasMarkdownExt || hasJsonExt ? name : `${name}.${rawType === "json" ? "json" : "md"}`;
529
+ const fileName = name;
471
530
  const filePath = resolveDocPath(fileName);
472
531
  if (!isDocPathSafe(filePath)) {
473
532
  res.status(400).send("Invalid path");
@@ -536,21 +595,21 @@ var require_createApp = __commonJS({
536
595
  res.status(409).send("Name already exists");
537
596
  return;
538
597
  }
539
- const fromExt = path_1.default.extname(from).toLowerCase();
540
- const toExt = path_1.default.extname(to).toLowerCase();
541
- if (fromExt !== toExt || fromExt !== ".md" && fromExt !== ".json") {
542
- res.status(400).send("Name extension does not match type");
598
+ const fromType = (0, core_1.getDocTypeFromName)(from);
599
+ const toType = (0, core_1.getDocTypeFromName)(to);
600
+ if (!fromType || !toType || fromType !== toType) {
601
+ res.status(400).send(`Name extension does not match type`);
543
602
  return;
544
603
  }
545
604
  fs_1.default.renameSync(fromPath, toPath);
546
- if (fromExt === ".md" || fromExt === ".json") {
605
+ if (fromType) {
547
606
  fileTags.delete(from);
548
607
  indexFileTags(to);
549
608
  rebuildTagIndex();
550
609
  }
551
610
  res.json({
552
611
  name: to,
553
- type: fromExt === ".json" ? "json" : "markdown",
612
+ type: fromType,
554
613
  title: null,
555
614
  displayName: displayNameFromFileName(to)
556
615
  });
@@ -827,16 +886,23 @@ var ServerCommand = class {
827
886
  const port = Number(
828
887
  context.options.port ?? process.env.HYPERDOC_PORT ?? DEFAULT_PORT
829
888
  );
830
- const webDir = import_path2.default.join(__dirname, "..", "web");
831
- if (!import_fs2.default.existsSync(webDir)) {
889
+ const webDirCandidates = [
890
+ import_path2.default.join(__dirname, "web"),
891
+ import_path2.default.join(__dirname, "..", "web"),
892
+ import_path2.default.join(__dirname, "..", "..", "..", "web", "dist")
893
+ ];
894
+ const webDir = webDirCandidates.find(
895
+ (candidate) => import_fs2.default.existsSync(candidate)
896
+ );
897
+ if (!webDir) {
832
898
  import_core.logger.warn(
833
- `Web bundle not found at ${webDir}. Run pnpm --filter hyperdoc-web build.`
899
+ `Web bundle not found at ${webDirCandidates.join(", ")}. Run pnpm --filter hyperdoc-web build.`
834
900
  );
835
901
  }
836
- const app = (0, import_server.createApp)({ rootDir, staticDir: webDir });
902
+ const app = (0, import_server.createApp)({ rootDir, staticDir: webDir ?? "" });
837
903
  app.get("*", (req, res) => {
838
- const indexPath = import_path2.default.join(webDir, "index.html");
839
- if (import_fs2.default.existsSync(indexPath)) {
904
+ const indexPath = webDir ? import_path2.default.join(webDir, "index.html") : "";
905
+ if (indexPath && import_fs2.default.existsSync(indexPath)) {
840
906
  res.sendFile(indexPath);
841
907
  } else {
842
908
  res.status(500).send("Web bundle missing. Run pnpm build:web.");
@@ -858,7 +924,7 @@ var import_core2 = __toESM(require_dist());
858
924
  // package.json
859
925
  var package_default = {
860
926
  name: "@maplab/hyperdoc",
861
- version: "0.2.0",
927
+ version: "0.2.1",
862
928
  description: "Hyperdoc CLI and local server",
863
929
  type: "commonjs",
864
930
  main: "dist/index.js",
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../packages/core/src/errors.ts","../../../packages/core/src/utils/logger.ts","../../../packages/core/src/schemas/project.ts","../../../packages/core/src/index.ts","../../../packages/adapter-markdown/src/index.ts","../../../packages/server/src/createApp.ts","../../../packages/server/src/index.ts","../src/cli/CommanderCli.ts","../src/commands/PromptCommand.ts","../src/commands/ServerCommand.ts","../package.json","../src/index.ts"],"sourcesContent":["export class HyperdocError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"HyperdocError\";\n }\n}\n\nexport function formatError(error: unknown, includeStack: boolean): string {\n if (error instanceof Error) {\n if (includeStack && error.stack) {\n return error.stack;\n }\n return error.message;\n }\n\n if (typeof error === \"string\") {\n return error;\n }\n\n return \"Unknown error\";\n}\n","type LogFn = (message: string) => void;\n\nexport enum LogLevel {\n DEBUG = 10,\n INFO = 20,\n WARN = 30,\n ERROR = 40,\n}\n\nclass Logger {\n private level: LogLevel = LogLevel.INFO;\n\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n getLevel(): LogLevel {\n return this.level;\n }\n\n private logIf(level: LogLevel, fn: LogFn, message: string): void {\n if (this.level <= level) {\n fn(message);\n }\n }\n\n debug(message: string): void {\n this.logIf(LogLevel.DEBUG, console.log, message);\n }\n\n info(message: string): void {\n this.logIf(LogLevel.INFO, console.log, message);\n }\n\n warn(message: string): void {\n this.logIf(LogLevel.WARN, console.warn, message);\n }\n\n error(message: string): void {\n this.logIf(LogLevel.ERROR, console.error, message);\n }\n}\n\nexport const logger = new Logger();\n","import { z } from \"zod\";\n\nexport const projectConfigSchema = z\n .object({\n name: z.string().trim().min(1).max(200).optional(),\n })\n .strict();\n\nexport type ProjectConfig = z.infer<typeof projectConfigSchema>;\n","export * from \"./errors\";\nexport * from \"./utils/logger\";\nexport * from \"./schemas/project\";\n","export type MarkdownMetadata = {\n tags: string[];\n pinned: boolean;\n title: string | null;\n};\n\nexport const getMarkdownMetadata = (\n content: string,\n): MarkdownMetadata | null => {\n const match = content.match(\n /^\\uFEFF?\\s*<!--\\s*hyperdoc:([A-Za-z0-9+/=]+)\\s*-->\\s*(?:\\r?\\n|$)/i,\n );\n if (!match) return null;\n try {\n const json = Buffer.from(match[1], \"base64\").toString(\"utf-8\");\n const parsed = JSON.parse(json);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return null;\n }\n const tagsRaw = (parsed as { tags?: unknown; pinned?: unknown }).tags;\n const tags = Array.isArray(tagsRaw)\n ? tagsRaw.filter((tag) => typeof tag === \"string\")\n : [];\n const pinned = (parsed as { pinned?: unknown }).pinned === true;\n const title =\n typeof (parsed as { title?: unknown }).title === \"string\"\n ? (parsed as { title?: string }).title ?? null\n : null;\n return { tags, pinned, title };\n } catch {\n return null;\n }\n};\n\nconst metadataHeaderStrip =\n /^\\uFEFF?\\s*<!--\\s*hyperdoc:[A-Za-z0-9+/=]+\\s*-->\\s*(?:\\r?\\n|$)/i;\n\nconst stripMetadataSpacer = (value: string) => {\n if (!value) return value;\n const match = value.match(/^\\s*(?:\\r?\\n)/);\n if (match) {\n return value.slice(match[0].length);\n }\n return value;\n};\n\nexport const stripMarkdownMetadataHeader = (content: string) => {\n let output = content.replace(/^\\uFEFF/, \"\");\n let previous = \"\";\n while (output !== previous) {\n previous = output;\n output = output.replace(metadataHeaderStrip, \"\");\n }\n return stripMetadataSpacer(output);\n};\n\nconst parseLegacyTitle = (content: string) => {\n const match = content.match(/^\\s*<!--\\s*title:\\s*(.+?)\\s*-->\\s*(?:\\r?\\n|$)/i);\n return match ? match[1].trim() : null;\n};\n\nexport const extractMarkdownTitle = (content: string) =>\n parseLegacyTitle(content);\n","import express, { Request, Response } from \"express\";\nimport chokidar from \"chokidar\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport {\n extractMarkdownTitle,\n getMarkdownMetadata,\n stripMarkdownMetadataHeader,\n} from \"@hyperdoc/adapter-markdown\";\nimport { projectConfigSchema, type ProjectConfig } from \"@hyperdoc/core\";\n\nexport type ServerOptions = {\n rootDir: string;\n staticDir?: string;\n};\n\nexport function createApp(options: ServerOptions): express.Express {\n const app = express();\n const rootDir = path.resolve(options.rootDir);\n const rootDirPrefix = rootDir.endsWith(path.sep)\n ? rootDir\n : `${rootDir}${path.sep}`;\n const metadataFileName = \"metadata.json\";\n const hyperdocDirName = \".hyperdoc\";\n const archiveDirName = \"archive\";\n const trashDirName = \"trash\";\n const projectFileName = \"project.json\";\n\n const resolveDocPath = (name: string) => path.resolve(rootDir, name);\n const isDocPathSafe = (filePath: string) => filePath.startsWith(rootDirPrefix);\n const isMetadataName = (name: string) => name === metadataFileName;\n const hyperdocDir = path.join(rootDir, hyperdocDirName);\n const projectFilePath = path.join(hyperdocDir, projectFileName);\n const ensureHyperdocDir = () => {\n if (!fs.existsSync(hyperdocDir)) {\n fs.mkdirSync(hyperdocDir, { recursive: true });\n }\n };\n const readProjectConfig = () => {\n if (!fs.existsSync(projectFilePath)) {\n return { config: null as ProjectConfig | null, error: null };\n }\n try {\n const raw = fs.readFileSync(projectFilePath, \"utf-8\");\n const parsed = JSON.parse(raw);\n const result = projectConfigSchema.safeParse(parsed);\n if (!result.success) {\n return { config: null as ProjectConfig | null, error: result.error };\n }\n return { config: result.data, error: null };\n } catch (error) {\n return { config: null as ProjectConfig | null, error };\n }\n };\n const writeProjectConfig = (config: ProjectConfig) => {\n ensureHyperdocDir();\n const payload = JSON.stringify(config, null, 2);\n fs.writeFileSync(projectFilePath, `${payload}\\n`, \"utf-8\");\n };\n const decodeJsonMetadata = (content: string) => {\n try {\n const parsed = JSON.parse(content);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return null;\n }\n const metadataRaw = (parsed as { metadata?: unknown }).metadata;\n if (!metadataRaw || typeof metadataRaw !== \"object\" || Array.isArray(metadataRaw)) {\n return { tags: [] as string[] };\n }\n const metadata = metadataRaw as { tags?: unknown; pinned?: unknown };\n const tags = Array.isArray(metadata.tags)\n ? metadata.tags.filter((tag) => typeof tag === \"string\")\n : [];\n const pinned = metadata.pinned === true;\n return { tags, pinned };\n } catch {\n return null;\n }\n };\n const normalizeTags = (value: unknown) => {\n if (!Array.isArray(value)) return [];\n const cleaned = value\n .map((tag) => (typeof tag === \"string\" ? tag.trim() : \"\"))\n .filter((tag) => tag.length > 0 && /^[a-z]+$/.test(tag));\n return Array.from(new Set(cleaned)).sort();\n };\n const tagsFromContent = (name: string, content: string) => {\n const ext = path.extname(name).toLowerCase();\n if (ext === \".md\") {\n return getMarkdownMetadata(content)?.tags ?? [];\n }\n if (ext === \".json\") {\n return decodeJsonMetadata(content)?.tags ?? [];\n }\n return [];\n };\n\n const fileTags = new Map<string, string[]>();\n const tagIndex = new Set<string>();\n\n const indexFileTags = (name: string) => {\n const filePath = resolveDocPath(name);\n if (!fs.existsSync(filePath)) return;\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n const tags = normalizeTags(tagsFromContent(name, content));\n fileTags.set(name, tags);\n } catch {\n fileTags.set(name, []);\n }\n };\n\n const rebuildTagIndex = () => {\n tagIndex.clear();\n for (const tags of fileTags.values()) {\n for (const tag of tags) tagIndex.add(tag);\n }\n };\n\n const refreshTagsFromDisk = () => {\n fileTags.clear();\n const entries = fs\n .readdirSync(rootDir, { withFileTypes: true })\n .filter((entry) => entry.isFile())\n .filter((entry) => entry.name.endsWith(\".md\") || entry.name.endsWith(\".json\"))\n .filter((entry) => !isMetadataName(entry.name));\n for (const entry of entries) {\n indexFileTags(entry.name);\n }\n rebuildTagIndex();\n };\n\n refreshTagsFromDisk();\n const validateDocName = (name: string) => {\n if (!name) return \"Missing name\";\n if (name.includes(\"/\") || name.includes(\"\\\\\") || name.includes(\"..\")) {\n return \"Invalid name\";\n }\n return null;\n };\n const displayNameFromFileName = (name: string) => {\n const base = name.replace(/\\.(md|json)$/i, \"\");\n const spaced = base.replace(/-+/g, \" \").trim();\n if (!spaced) return base;\n return `${spaced.charAt(0).toUpperCase()}${spaced.slice(1)}`;\n };\n\n app.use(express.text({ type: \"*/*\", limit: \"5mb\" }));\n\n if (options.staticDir && fs.existsSync(options.staticDir)) {\n app.use(express.static(options.staticDir));\n }\n\n app.get(\"/api/project\", (req: Request, res: Response) => {\n const { config, error } = readProjectConfig();\n if (error) {\n res.status(400).json({ error: \"Invalid project config\" });\n return;\n }\n res.json({\n name: config?.name ?? null,\n exists: config !== null,\n });\n });\n\n app.put(\"/api/project\", (req: Request, res: Response) => {\n const raw = typeof req.body === \"string\" ? req.body : \"\";\n if (!raw.trim()) {\n res.status(400).send(\"Missing body\");\n return;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n res.status(400).send(\"Invalid JSON\");\n return;\n }\n const result = projectConfigSchema.safeParse(parsed);\n if (!result.success) {\n res.status(400).json({ error: \"Invalid project config\" });\n return;\n }\n writeProjectConfig(result.data);\n res.json({ name: result.data.name ?? null });\n });\n\n app.get(\"/api/docs\", (req: Request, res: Response) => {\n const entries = fs\n .readdirSync(rootDir, { withFileTypes: true })\n .filter((entry) => entry.isFile())\n .filter((entry) => entry.name.endsWith(\".md\") || entry.name.endsWith(\".json\"))\n .filter((entry) => !isMetadataName(entry.name))\n .map((entry) => ({\n name: entry.name,\n type: entry.name.endsWith(\".md\") ? \"markdown\" : \"json\",\n }))\n .map((entry) => {\n const filePath = resolveDocPath(entry.name);\n if (entry.type === \"markdown\") {\n let title: string | null = null;\n let tags: string[] = [];\n let pinned = false;\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n title = extractMarkdownTitle(content);\n const metadata = getMarkdownMetadata(content);\n tags = normalizeTags(metadata?.tags ?? []);\n pinned = metadata?.pinned ?? false;\n } catch {\n title = null;\n tags = [];\n pinned = false;\n }\n return {\n ...entry,\n title,\n tags,\n pinned,\n displayName: title && title.length > 0 ? title : displayNameFromFileName(entry.name),\n };\n }\n let tags: string[] = [];\n let pinned = false;\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n const metadata = decodeJsonMetadata(content);\n tags = normalizeTags(metadata?.tags ?? []);\n pinned = metadata?.pinned ?? false;\n } catch {\n tags = [];\n pinned = false;\n }\n return {\n ...entry,\n title: null,\n tags,\n pinned,\n displayName: displayNameFromFileName(entry.name),\n };\n });\n res.json(entries);\n });\n\n app.get(\"/api/docs/exists\", (req: Request, res: Response) => {\n const name = String(req.query.name ?? \"\");\n if (!name) {\n res.status(400).send(\"Missing name\");\n return;\n }\n if (name.includes(\"/\") || name.includes(\"\\\\\") || name.includes(\"..\")) {\n res.status(400).send(\"Invalid name\");\n return;\n }\n const filePath = resolveDocPath(name);\n if (!isDocPathSafe(filePath)) {\n res.status(400).send(\"Invalid path\");\n return;\n }\n res.json({ exists: fs.existsSync(filePath) });\n });\n\n app.post(\"/api/docs\", (req: Request, res: Response) => {\n let payload:\n | {\n name?: string;\n type?: \"markdown\" | \"json\";\n content?: string;\n title?: string;\n }\n | null = null;\n if (typeof req.body === \"string\") {\n try {\n payload = JSON.parse(req.body);\n } catch {\n payload = null;\n }\n } else if (req.body && typeof req.body === \"object\") {\n payload = req.body as {\n name?: string;\n type?: \"markdown\" | \"json\";\n content?: string;\n title?: string;\n };\n }\n\n const rawName = String(payload?.name ?? \"\").trim();\n const rawType = payload?.type ?? null;\n\n if (!rawType) {\n res.status(400).send(\"Missing type\");\n return;\n }\n\n const name = rawName;\n const nameError = validateDocName(name);\n if (nameError) {\n res.status(400).send(nameError);\n return;\n }\n const hasMarkdownExt = name.endsWith(\".md\");\n const hasJsonExt = name.endsWith(\".json\");\n if (hasMarkdownExt && rawType !== \"markdown\") {\n res.status(400).send(\"Name extension does not match type\");\n return;\n }\n if (hasJsonExt && rawType !== \"json\") {\n res.status(400).send(\"Name extension does not match type\");\n return;\n }\n\n const fileName = hasMarkdownExt || hasJsonExt\n ? name\n : `${name}.${rawType === \"json\" ? \"json\" : \"md\"}`;\n const filePath = resolveDocPath(fileName);\n if (!isDocPathSafe(filePath)) {\n res.status(400).send(\"Invalid path\");\n return;\n }\n if (fs.existsSync(filePath)) {\n res.status(409).send(\"Name already exists\");\n return;\n }\n const content =\n payload?.content ??\n (rawType === \"json\" ? JSON.stringify({ data: [] }, null, 2) : \"\");\n fs.writeFileSync(filePath, content, \"utf-8\");\n indexFileTags(fileName);\n rebuildTagIndex();\n const createdTags = normalizeTags(tagsFromContent(fileName, content));\n const createdTitle =\n rawType === \"markdown\" ? extractMarkdownTitle(content) : null;\n res.status(201).json({\n name: fileName,\n type: rawType,\n title: createdTitle,\n tags: createdTags,\n displayName:\n createdTitle && createdTitle.length > 0\n ? createdTitle\n : displayNameFromFileName(fileName),\n });\n });\n\n app.post(\"/api/doc/rename\", (req: Request, res: Response) => {\n let payload:\n | {\n from?: string;\n to?: string;\n }\n | null = null;\n if (typeof req.body === \"string\") {\n try {\n payload = JSON.parse(req.body);\n } catch {\n payload = null;\n }\n } else if (req.body && typeof req.body === \"object\") {\n payload = req.body as { from?: string; to?: string };\n }\n\n const from = String(payload?.from ?? \"\").trim();\n const to = String(payload?.to ?? \"\").trim();\n if (!from || !to) {\n res.status(400).send(\"Missing rename target\");\n return;\n }\n const fromError = validateDocName(from);\n if (fromError) {\n res.status(400).send(fromError);\n return;\n }\n const toError = validateDocName(to);\n if (toError) {\n res.status(400).send(toError);\n return;\n }\n if (isMetadataName(from) || isMetadataName(to)) {\n res.status(400).send(\"Reserved name\");\n return;\n }\n const fromPath = resolveDocPath(from);\n const toPath = resolveDocPath(to);\n if (!isDocPathSafe(fromPath) || !isDocPathSafe(toPath)) {\n res.status(400).send(\"Invalid path\");\n return;\n }\n if (!fs.existsSync(fromPath)) {\n res.status(404).send(\"Not found\");\n return;\n }\n if (fs.existsSync(toPath)) {\n res.status(409).send(\"Name already exists\");\n return;\n }\n const fromExt = path.extname(from).toLowerCase();\n const toExt = path.extname(to).toLowerCase();\n if (fromExt !== toExt || (fromExt !== \".md\" && fromExt !== \".json\")) {\n res.status(400).send(\"Name extension does not match type\");\n return;\n }\n fs.renameSync(fromPath, toPath);\n if (fromExt === \".md\" || fromExt === \".json\") {\n fileTags.delete(from);\n indexFileTags(to);\n rebuildTagIndex();\n }\n res.json({\n name: to,\n type: fromExt === \".json\" ? \"json\" : \"markdown\",\n title: null,\n displayName: displayNameFromFileName(to),\n });\n });\n\n app.post(\"/api/doc/:name/archive\", (req: Request, res: Response) => {\n const name = String(req.params.name);\n if (isMetadataName(name)) {\n res.status(400).send(\"Reserved name\");\n return;\n }\n if (name.includes(\"/\") || name.includes(\"\\\\\") || name.includes(\"..\")) {\n res.status(400).send(\"Invalid name\");\n return;\n }\n const filePath = resolveDocPath(name);\n if (!isDocPathSafe(filePath)) {\n res.status(400).send(\"Invalid path\");\n return;\n }\n if (!fs.existsSync(filePath)) {\n res.status(404).send(\"Not found\");\n return;\n }\n const archiveDir = path.join(hyperdocDir, archiveDirName);\n ensureHyperdocDir();\n if (!fs.existsSync(archiveDir)) {\n fs.mkdirSync(archiveDir, { recursive: true });\n }\n const archivePath = path.join(archiveDir, name);\n if (fs.existsSync(archivePath)) {\n res.status(409).send(\"Archived file already exists with that name\");\n return;\n }\n fs.renameSync(filePath, archivePath);\n fileTags.delete(name);\n rebuildTagIndex();\n res.json({ archived: true, name });\n });\n\n app.get(\"/api/doc/:name\", (req: Request, res: Response) => {\n const name = String(req.params.name);\n if (isMetadataName(name)) {\n res.status(400).send(\"Reserved name\");\n return;\n }\n const filePath = resolveDocPath(name);\n if (!isDocPathSafe(filePath)) {\n res.status(400).send(\"Invalid path\");\n return;\n }\n if (!fs.existsSync(filePath)) {\n res.status(404).send(\"Not found\");\n return;\n }\n const content = fs.readFileSync(filePath, \"utf-8\");\n const stat = fs.statSync(filePath);\n const ext = path.extname(name).toLowerCase();\n if (ext === \".md\") {\n const metadata = getMarkdownMetadata(content);\n res.json({\n content: stripMarkdownMetadataHeader(content),\n mtimeMs: stat.mtimeMs,\n metadata,\n });\n return;\n }\n res.json({ content, mtimeMs: stat.mtimeMs });\n });\n\n app.put(\"/api/doc/:name\", (req: Request, res: Response) => {\n const name = String(req.params.name);\n if (isMetadataName(name)) {\n res.status(400).send(\"Reserved name\");\n return;\n }\n const filePath = resolveDocPath(name);\n if (!isDocPathSafe(filePath)) {\n res.status(400).send(\"Invalid path\");\n return;\n }\n if (!fs.existsSync(filePath)) {\n res.status(404).send(\"Not found\");\n return;\n }\n const baseHeader = req.header(\"x-hyperdoc-base-version\");\n if (baseHeader !== undefined) {\n const baseVersion = Number(baseHeader);\n if (!Number.isFinite(baseVersion)) {\n res.status(400).send(\"Invalid base version\");\n return;\n }\n const currentStat = fs.statSync(filePath);\n if (currentStat.mtimeMs !== baseVersion) {\n res.status(409).json({ mtimeMs: currentStat.mtimeMs });\n return;\n }\n }\n fs.writeFileSync(filePath, req.body ?? \"\", \"utf-8\");\n const stat = fs.statSync(filePath);\n const clientId = req.header(\"x-hyperdoc-client-id\");\n if (clientId) {\n recentWrites.set(name, {\n clientId,\n ts: Date.now(),\n mtimeMs: stat.mtimeMs,\n });\n }\n res.json({ mtimeMs: stat.mtimeMs });\n });\n\n app.delete(\"/api/doc/:name\", (req: Request, res: Response) => {\n const name = String(req.params.name);\n if (isMetadataName(name)) {\n res.status(400).send(\"Reserved name\");\n return;\n }\n if (name.includes(\"/\") || name.includes(\"\\\\\") || name.includes(\"..\")) {\n res.status(400).send(\"Invalid name\");\n return;\n }\n const filePath = resolveDocPath(name);\n if (!isDocPathSafe(filePath)) {\n res.status(400).send(\"Invalid path\");\n return;\n }\n if (!fs.existsSync(filePath)) {\n res.status(404).send(\"Not found\");\n return;\n }\n const trashDir = path.join(hyperdocDir, trashDirName);\n ensureHyperdocDir();\n if (!fs.existsSync(trashDir)) {\n fs.mkdirSync(trashDir, { recursive: true });\n // Create .gitignore to exclude trash contents from git\n fs.writeFileSync(path.join(trashDir, \".gitignore\"), \"*\\n!.gitignore\\n\");\n }\n const trashPath = path.join(trashDir, name);\n if (fs.existsSync(trashPath)) {\n // If file already exists in trash, add timestamp to avoid overwriting\n const ext = path.extname(name);\n const base = name.slice(0, -ext.length);\n const timestamp = Date.now();\n const uniqueName = `${base}-${timestamp}${ext}`;\n fs.renameSync(filePath, path.join(trashDir, uniqueName));\n } else {\n fs.renameSync(filePath, trashPath);\n }\n fileTags.delete(name);\n rebuildTagIndex();\n res.json({ deleted: true });\n });\n\n app.get(\"/api/tags\", (req: Request, res: Response) => {\n res.json({ tags: Array.from(tagIndex).sort() });\n });\n\n const clients = new Set<Response>();\n const recentWrites = new Map<\n string,\n { clientId: string; ts: number; mtimeMs: number }\n >();\n const watcher = chokidar.watch(rootDir, {\n ignoreInitial: true,\n ignored: (target) => {\n const rel = path.relative(rootDir, target);\n if (!rel) return false;\n if (rel.startsWith(\".git\")) return true;\n if (rel.startsWith(hyperdocDirName)) return true;\n if (rel.startsWith(\".trash\")) return true;\n if (rel.startsWith(\".archive\")) return true;\n if (rel.startsWith(\"node_modules\")) return true;\n if (rel.startsWith(\"dist\")) return true;\n return false;\n },\n });\n\n watcher.on(\"all\", (event, filePath) => {\n if (!filePath.endsWith(\".md\") && !filePath.endsWith(\".json\")) return;\n if (path.basename(filePath) === metadataFileName) return;\n const name = path.basename(filePath);\n if (name.endsWith(\".md\") || name.endsWith(\".json\")) {\n if (event === \"unlink\") {\n fileTags.delete(name);\n recentWrites.delete(name);\n } else {\n indexFileTags(name);\n }\n rebuildTagIndex();\n }\n let mtimeMs: number | undefined;\n if (event !== \"unlink\") {\n try {\n const stat = fs.statSync(filePath);\n mtimeMs = stat.mtimeMs;\n } catch {\n mtimeMs = undefined;\n }\n }\n const recent = recentWrites.get(name);\n const sourceId =\n recent && Date.now() - recent.ts < 2000 ? recent.clientId : undefined;\n const payload = JSON.stringify({ type: event, name, mtimeMs, sourceId });\n for (const client of clients) {\n client.write(`data: ${payload}\\n\\n`);\n }\n });\n\n app.get(\"/api/events\", (req: Request, res: Response) => {\n res.setHeader(\"Content-Type\", \"text/event-stream\");\n res.setHeader(\"Cache-Control\", \"no-cache\");\n res.setHeader(\"Connection\", \"keep-alive\");\n res.flushHeaders();\n\n clients.add(res);\n req.on(\"close\", () => {\n clients.delete(res);\n });\n });\n\n return app;\n}\n","export * from \"./createApp\";\n","import { Command } from \"commander\";\nimport { PromptCommand, ServerCommand } from \"../commands\";\nimport { CommandHandler, HyperdocCommand } from \"../types\";\nimport { LogLevel, logger } from \"@hyperdoc/core\";\nimport packageJson from \"../../package.json\";\n\nexport class CommanderCli {\n private program: Command;\n private commandHandlers: Map<HyperdocCommand, CommandHandler> = new Map();\n\n constructor() {\n this.program = new Command();\n this.setupCommandHandlers();\n this.setupProgram();\n }\n\n private setupCommandHandlers(): void {\n this.commandHandlers.set(\"prompt\", new PromptCommand());\n this.commandHandlers.set(\"server\", new ServerCommand());\n }\n\n private setupProgram(): void {\n this.program\n .name(\"hyper\")\n .description(\"Local Hyperdoc server and tooling\")\n .version(packageJson.version);\n\n this.program\n .option(\"--root <dir>\", \"Project root (defaults to cwd)\")\n .option(\"-v, --verbose\", \"Increase logging verbosity\")\n .option(\"-q, --quiet\", \"Reduce logging output\")\n .option(\"-d, --debug\", \"Enable debug logging\");\n\n this.program\n .command(\"prompt\")\n .description(\"Print the agent prompt/spec to stdout\")\n .action(async (options, command) => {\n await this.executeCommand(\"prompt\", command);\n });\n\n this.program\n .command(\"server\")\n .description(\"Start the local Hyperdoc server\")\n .option(\"--port <number>\", \"Port to run the server on\", (value) =>\n Number(value),\n )\n .option(\"-o, --open\", \"Open the UI in the browser\")\n .action(async (options, command) => {\n await this.executeCommand(\"server\", command);\n });\n }\n\n private async executeCommand(\n command: HyperdocCommand,\n commandInstance: Command,\n ): Promise<void> {\n const parent = commandInstance.parent!;\n const globalOpts = parent.opts();\n const commandOpts = commandInstance.opts();\n const allOptions = { ...globalOpts, ...commandOpts };\n\n if (allOptions.debug) {\n logger.setLevel(LogLevel.DEBUG);\n } else if (allOptions.verbose) {\n logger.setLevel(LogLevel.INFO);\n } else if (allOptions.quiet) {\n logger.setLevel(LogLevel.WARN);\n }\n\n const handler = this.commandHandlers.get(command);\n if (!handler) {\n throw new Error(`No handler found for command: ${command}`);\n }\n\n await handler.execute({ options: allOptions });\n }\n\n async parse(args: string[]): Promise<void> {\n await this.program.parseAsync(args);\n }\n\n getHelp(): string {\n return this.program.helpInformation();\n }\n}\n","import fs from \"fs\";\nimport path from \"path\";\nimport { CommandContext, CommandHandler } from \"../types\";\n\nexport class PromptCommand implements CommandHandler {\n async execute(context: CommandContext): Promise<void> {\n void context;\n const promptPath = path.join(__dirname, \"..\", \"prompts\", \"agent.txt\");\n const prompt = fs.readFileSync(promptPath, \"utf-8\");\n process.stdout.write(prompt);\n if (!prompt.endsWith(\"\\n\")) {\n process.stdout.write(\"\\n\");\n }\n }\n}\n","import fs from \"fs\";\nimport path from \"path\";\nimport open from \"open\";\nimport { CommandContext, CommandHandler } from \"../types\";\nimport { logger } from \"@hyperdoc/core\";\nimport { createApp } from \"@hyperdoc/server\";\n\nconst DEFAULT_PORT = 4321;\n\nexport class ServerCommand implements CommandHandler {\n async execute(context: CommandContext): Promise<void> {\n const rootDir = path.resolve(context.options.root ?? process.cwd());\n const port = Number(\n context.options.port ?? process.env.HYPERDOC_PORT ?? DEFAULT_PORT,\n );\n\n const webDir = path.join(__dirname, \"..\", \"web\");\n if (!fs.existsSync(webDir)) {\n logger.warn(\n `Web bundle not found at ${webDir}. Run pnpm --filter hyperdoc-web build.`,\n );\n }\n const app = createApp({ rootDir, staticDir: webDir });\n\n app.get(\"*\", (req, res) => {\n const indexPath = path.join(webDir, \"index.html\");\n if (fs.existsSync(indexPath)) {\n res.sendFile(indexPath);\n } else {\n res.status(500).send(\"Web bundle missing. Run pnpm build:web.\");\n }\n });\n\n app.listen(port, () => {\n const url = `http://localhost:${port}`;\n logger.info(`Hyperdoc server running at ${url}`);\n if (context.options.open) {\n open(url).catch(() => undefined);\n }\n });\n }\n}\n","{\n \"name\": \"@maplab/hyperdoc\",\n \"version\": \"0.2.0\",\n \"description\": \"Hyperdoc CLI and local server\",\n \"type\": \"commonjs\",\n \"main\": \"dist/index.js\",\n \"types\": \"dist/index.d.ts\",\n \"bin\": {\n \"hyper\": \"dist/index.js\"\n },\n \"files\": [\n \"dist\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"build\": \"tsup && node scripts/copy-prompts.js && node scripts/copy-web.js\",\n \"dev\": \"tsx src/index.ts\",\n \"start\": \"node dist/index.js\",\n \"typecheck\": \"tsc -p tsconfig.json --noEmit\"\n },\n \"dependencies\": {\n \"chokidar\": \"^5.0.0\",\n \"commander\": \"^14.0.0\",\n \"markdown-it\": \"^14.1.0\",\n \"open\": \"^9.1.0\",\n \"express\": \"^4.19.2\",\n \"zod\": \"^4.1.5\"\n },\n \"devDependencies\": {\n \"@hyperdoc/core\": \"workspace:*\",\n \"@hyperdoc/server\": \"workspace:*\",\n \"tsup\": \"^8.5.0\"\n }\n}\n","#!/usr/bin/env node\n\nimport { CommanderCli } from \"./cli\";\nimport { LogLevel, formatError, logger } from \"@hyperdoc/core\";\n\ndeclare const process: {\n argv: string[];\n exit: (code: number) => never;\n};\n\nconst cli = new CommanderCli();\n\nasync function main() {\n try {\n await cli.parse(process.argv);\n } catch (error) {\n const showStackTrace = logger.getLevel() === LogLevel.DEBUG;\n const formattedError = formatError(error, showStackTrace);\n console.error(formattedError);\n process.exit(1);\n }\n}\n\nmain();\n"],"mappings":"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","names":["exports","formatError","LogLevel","exports","exports","exports","exports","exports","createApp","tags","pinned","exports","path","fs","import_fs","import_path","path","fs","open","import_core","import_core"]}
1
+ {"version":3,"sources":["../../../packages/core/src/errors.ts","../../../packages/core/src/utils/logger.ts","../../../packages/core/src/schemas/project.ts","../../../packages/core/src/doc-types.ts","../../../packages/core/src/index.ts","../../../packages/adapter-markdown/src/index.ts","../../../packages/server/src/createApp.ts","../../../packages/server/src/index.ts","../src/cli/CommanderCli.ts","../src/commands/PromptCommand.ts","../src/commands/ServerCommand.ts","../package.json","../src/index.ts"],"sourcesContent":["export class HyperdocError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"HyperdocError\";\n }\n}\n\nexport function formatError(error: unknown, includeStack: boolean): string {\n if (error instanceof Error) {\n if (includeStack && error.stack) {\n return error.stack;\n }\n return error.message;\n }\n\n if (typeof error === \"string\") {\n return error;\n }\n\n return \"Unknown error\";\n}\n","type LogFn = (message: string) => void;\n\nexport enum LogLevel {\n DEBUG = 10,\n INFO = 20,\n WARN = 30,\n ERROR = 40,\n}\n\nclass Logger {\n private level: LogLevel = LogLevel.INFO;\n\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n getLevel(): LogLevel {\n return this.level;\n }\n\n private logIf(level: LogLevel, fn: LogFn, message: string): void {\n if (this.level <= level) {\n fn(message);\n }\n }\n\n debug(message: string): void {\n this.logIf(LogLevel.DEBUG, console.log, message);\n }\n\n info(message: string): void {\n this.logIf(LogLevel.INFO, console.log, message);\n }\n\n warn(message: string): void {\n this.logIf(LogLevel.WARN, console.warn, message);\n }\n\n error(message: string): void {\n this.logIf(LogLevel.ERROR, console.error, message);\n }\n}\n\nexport const logger = new Logger();\n","import { z } from \"zod\";\n\nexport const projectConfigSchema = z\n .object({\n name: z.string().trim().min(1).max(200).optional(),\n })\n .strict();\n\nexport type ProjectConfig = z.infer<typeof projectConfigSchema>;\n","export type DocType = \"markdown\" | \"json\" | \"app\";\n\nexport const DOC_TYPE_CONFIG = [\n { type: \"markdown\", extension: \".md\" },\n { type: \"json\", extension: \".json\" },\n { type: \"app\", extension: \".app.json\" },\n] as const;\n\ntype DocTypeConfig = (typeof DOC_TYPE_CONFIG)[number];\n\nconst DOC_TYPE_CONFIG_MAP = DOC_TYPE_CONFIG.reduce<Record<DocType, DocTypeConfig>>(\n (acc, config) => {\n acc[config.type] = config;\n return acc;\n },\n {} as Record<DocType, DocTypeConfig>,\n);\n\nconst EXTENSION_ORDER = [...DOC_TYPE_CONFIG].sort(\n (a, b) => b.extension.length - a.extension.length,\n);\n\nexport const getDocExtension = (type: DocType) =>\n DOC_TYPE_CONFIG_MAP[type].extension;\n\nexport const getDocTypeFromName = (name: string): DocType | null => {\n const lower = name.toLowerCase();\n for (const config of EXTENSION_ORDER) {\n if (lower.endsWith(config.extension.toLowerCase())) {\n return config.type;\n }\n }\n return null;\n};\n\nexport const normalizeDocName = (name: string, type: DocType): string => {\n const trimmed = name.trim();\n if (!trimmed) return \"\";\n const targetExtension = getDocExtension(type);\n const lower = trimmed.toLowerCase();\n for (const config of EXTENSION_ORDER) {\n if (lower.endsWith(config.extension.toLowerCase())) {\n return (\n trimmed.slice(0, trimmed.length - config.extension.length) +\n targetExtension\n );\n }\n }\n return `${trimmed}${targetExtension}`;\n};\n\nexport const stripDocExtension = (name: string): string => {\n const lower = name.toLowerCase();\n for (const config of EXTENSION_ORDER) {\n if (lower.endsWith(config.extension.toLowerCase())) {\n return name.slice(0, name.length - config.extension.length);\n }\n }\n return name;\n};\n","export * from \"./errors\";\nexport * from \"./utils/logger\";\nexport * from \"./schemas/project\";\nexport * from \"./doc-types\";\n","export type MarkdownMetadata = {\n tags: string[];\n pinned: boolean;\n title: string | null;\n};\n\nexport const getMarkdownMetadata = (\n content: string,\n): MarkdownMetadata | null => {\n const match = content.match(\n /^\\uFEFF?\\s*<!--\\s*hyperdoc:([A-Za-z0-9+/=]+)\\s*-->\\s*(?:\\r?\\n|$)/i,\n );\n if (!match) return null;\n try {\n const json = Buffer.from(match[1], \"base64\").toString(\"utf-8\");\n const parsed = JSON.parse(json);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return null;\n }\n const tagsRaw = (parsed as { tags?: unknown; pinned?: unknown }).tags;\n const tags = Array.isArray(tagsRaw)\n ? tagsRaw.filter((tag) => typeof tag === \"string\")\n : [];\n const pinned = (parsed as { pinned?: unknown }).pinned === true;\n const title =\n typeof (parsed as { title?: unknown }).title === \"string\"\n ? (parsed as { title?: string }).title ?? null\n : null;\n return { tags, pinned, title };\n } catch {\n return null;\n }\n};\n\nconst metadataHeaderStrip =\n /^\\uFEFF?\\s*<!--\\s*hyperdoc:[A-Za-z0-9+/=]+\\s*-->\\s*(?:\\r?\\n|$)/i;\n\nconst stripMetadataSpacer = (value: string) => {\n if (!value) return value;\n const match = value.match(/^\\s*(?:\\r?\\n)/);\n if (match) {\n return value.slice(match[0].length);\n }\n return value;\n};\n\nexport const stripMarkdownMetadataHeader = (content: string) => {\n let output = content.replace(/^\\uFEFF/, \"\");\n let previous = \"\";\n while (output !== previous) {\n previous = output;\n output = output.replace(metadataHeaderStrip, \"\");\n }\n return stripMetadataSpacer(output);\n};\n\nconst parseLegacyTitle = (content: string) => {\n const match = content.match(/^\\s*<!--\\s*title:\\s*(.+?)\\s*-->\\s*(?:\\r?\\n|$)/i);\n return match ? match[1].trim() : null;\n};\n\nexport const extractMarkdownTitle = (content: string) =>\n parseLegacyTitle(content);\n","import express, { Request, Response } from \"express\";\nimport chokidar from \"chokidar\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport {\n extractMarkdownTitle,\n getMarkdownMetadata,\n stripMarkdownMetadataHeader,\n} from \"@hyperdoc/adapter-markdown\";\nimport {\n DOC_TYPE_CONFIG,\n type DocType,\n getDocTypeFromName,\n normalizeDocName,\n projectConfigSchema,\n stripDocExtension,\n type ProjectConfig,\n} from \"@hyperdoc/core\";\n\nexport type ServerOptions = {\n rootDir: string;\n staticDir?: string;\n};\n\nexport function createApp(options: ServerOptions): express.Express {\n const app = express();\n const rootDir = path.resolve(options.rootDir);\n const rootDirPrefix = rootDir.endsWith(path.sep)\n ? rootDir\n : `${rootDir}${path.sep}`;\n const metadataFileName = \"metadata.json\";\n const hyperdocDirName = \".hyperdoc\";\n const archiveDirName = \"archive\";\n const trashDirName = \"trash\";\n const projectFileName = \"project.json\";\n const docExtensions = DOC_TYPE_CONFIG.map((config) => config.extension);\n\n const resolveDocPath = (name: string) => path.resolve(rootDir, name);\n const isDocPathSafe = (filePath: string) => filePath.startsWith(rootDirPrefix);\n const isMetadataName = (name: string) => name === metadataFileName;\n const hyperdocDir = path.join(rootDir, hyperdocDirName);\n const projectFilePath = path.join(hyperdocDir, projectFileName);\n const ensureHyperdocDir = () => {\n if (!fs.existsSync(hyperdocDir)) {\n fs.mkdirSync(hyperdocDir, { recursive: true });\n }\n };\n const readProjectConfig = () => {\n if (!fs.existsSync(projectFilePath)) {\n return { config: null as ProjectConfig | null, error: null };\n }\n try {\n const raw = fs.readFileSync(projectFilePath, \"utf-8\");\n const parsed = JSON.parse(raw);\n const result = projectConfigSchema.safeParse(parsed);\n if (!result.success) {\n return { config: null as ProjectConfig | null, error: result.error };\n }\n return { config: result.data, error: null };\n } catch (error) {\n return { config: null as ProjectConfig | null, error };\n }\n };\n const writeProjectConfig = (config: ProjectConfig) => {\n ensureHyperdocDir();\n const payload = JSON.stringify(config, null, 2);\n fs.writeFileSync(projectFilePath, `${payload}\\n`, \"utf-8\");\n };\n const decodeJsonMetadata = (content: string) => {\n try {\n const parsed = JSON.parse(content);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return null;\n }\n const metadataRaw = (parsed as { metadata?: unknown }).metadata;\n if (!metadataRaw || typeof metadataRaw !== \"object\" || Array.isArray(metadataRaw)) {\n return { tags: [] as string[] };\n }\n const metadata = metadataRaw as { tags?: unknown; pinned?: unknown };\n const tags = Array.isArray(metadata.tags)\n ? metadata.tags.filter((tag) => typeof tag === \"string\")\n : [];\n const pinned = metadata.pinned === true;\n return { tags, pinned };\n } catch {\n return null;\n }\n };\n const normalizeTags = (value: unknown) => {\n if (!Array.isArray(value)) return [];\n const cleaned = value\n .map((tag) => (typeof tag === \"string\" ? tag.trim() : \"\"))\n .filter((tag) => tag.length > 0 && /^[a-z]+$/.test(tag));\n return Array.from(new Set(cleaned)).sort();\n };\n const tagsFromContent = (name: string, content: string) => {\n const type = getDocTypeFromName(name);\n if (type === \"markdown\") {\n return getMarkdownMetadata(content)?.tags ?? [];\n }\n if (type === \"json\" || type === \"app\") {\n return decodeJsonMetadata(content)?.tags ?? [];\n }\n return [];\n };\n\n const fileTags = new Map<string, string[]>();\n const tagIndex = new Set<string>();\n\n const indexFileTags = (name: string) => {\n const filePath = resolveDocPath(name);\n if (!fs.existsSync(filePath)) return;\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n const tags = normalizeTags(tagsFromContent(name, content));\n fileTags.set(name, tags);\n } catch {\n fileTags.set(name, []);\n }\n };\n\n const rebuildTagIndex = () => {\n tagIndex.clear();\n for (const tags of fileTags.values()) {\n for (const tag of tags) tagIndex.add(tag);\n }\n };\n\n const refreshTagsFromDisk = () => {\n fileTags.clear();\n const entries = fs\n .readdirSync(rootDir, { withFileTypes: true })\n .filter((entry) => entry.isFile())\n .filter((entry) =>\n docExtensions.some((extension) => entry.name.endsWith(extension)),\n )\n .filter((entry) => !isMetadataName(entry.name));\n for (const entry of entries) {\n indexFileTags(entry.name);\n }\n rebuildTagIndex();\n };\n\n refreshTagsFromDisk();\n const validateDocName = (name: string) => {\n if (!name) return \"Missing name\";\n if (name.includes(\"/\") || name.includes(\"\\\\\") || name.includes(\"..\")) {\n return \"Invalid name\";\n }\n return null;\n };\n const displayNameFromFileName = (name: string) => {\n const base = stripDocExtension(name);\n const spaced = base.replace(/-+/g, \" \").trim();\n if (!spaced) return base;\n return `${spaced.charAt(0).toUpperCase()}${spaced.slice(1)}`;\n };\n\n app.use(express.text({ type: \"*/*\", limit: \"5mb\" }));\n\n if (options.staticDir && fs.existsSync(options.staticDir)) {\n app.use(express.static(options.staticDir));\n }\n\n const bundlesDir = path.join(rootDir, \"bundles\");\n if (fs.existsSync(bundlesDir)) {\n app.use(\"/bundles\", express.static(bundlesDir));\n }\n\n app.get(\"/api/project\", (req: Request, res: Response) => {\n const { config, error } = readProjectConfig();\n if (error) {\n res.status(400).json({ error: \"Invalid project config\" });\n return;\n }\n res.json({\n name: config?.name ?? null,\n exists: config !== null,\n });\n });\n\n app.put(\"/api/project\", (req: Request, res: Response) => {\n const raw = typeof req.body === \"string\" ? req.body : \"\";\n if (!raw.trim()) {\n res.status(400).send(\"Missing body\");\n return;\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n res.status(400).send(\"Invalid JSON\");\n return;\n }\n const result = projectConfigSchema.safeParse(parsed);\n if (!result.success) {\n res.status(400).json({ error: \"Invalid project config\" });\n return;\n }\n writeProjectConfig(result.data);\n res.json({ name: result.data.name ?? null });\n });\n\n app.get(\"/api/docs\", (req: Request, res: Response) => {\n const entries = fs\n .readdirSync(rootDir, { withFileTypes: true })\n .filter((entry) => entry.isFile())\n .filter((entry) => entry.name.endsWith(\".md\") || entry.name.endsWith(\".json\"))\n .filter((entry) => !isMetadataName(entry.name))\n .map((entry) => {\n const type = getDocTypeFromName(entry.name);\n return type ? { name: entry.name, type } : null;\n })\n .filter((entry): entry is { name: string; type: DocType } => entry !== null)\n .map((entry) => {\n const filePath = resolveDocPath(entry.name);\n if (entry.type === \"markdown\") {\n let title: string | null = null;\n let tags: string[] = [];\n let pinned = false;\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n title = extractMarkdownTitle(content);\n const metadata = getMarkdownMetadata(content);\n tags = normalizeTags(metadata?.tags ?? []);\n pinned = metadata?.pinned ?? false;\n } catch {\n title = null;\n tags = [];\n pinned = false;\n }\n return {\n ...entry,\n title,\n tags,\n pinned,\n displayName: title && title.length > 0 ? title : displayNameFromFileName(entry.name),\n };\n }\n if (entry.type === \"json\" || entry.type === \"app\") {\n let tags: string[] = [];\n let pinned = false;\n try {\n const content = fs.readFileSync(filePath, \"utf-8\");\n const metadata = decodeJsonMetadata(content);\n tags = normalizeTags(metadata?.tags ?? []);\n pinned = metadata?.pinned ?? false;\n } catch {\n tags = [];\n pinned = false;\n }\n return {\n ...entry,\n title: null,\n tags,\n pinned,\n displayName: displayNameFromFileName(entry.name),\n };\n }\n return {\n ...entry,\n title: null,\n tags: [],\n pinned: false,\n displayName: displayNameFromFileName(entry.name),\n };\n });\n res.json(entries);\n });\n\n app.get(\"/api/docs/exists\", (req: Request, res: Response) => {\n const name = String(req.query.name ?? \"\");\n if (!name) {\n res.status(400).send(\"Missing name\");\n return;\n }\n if (name.includes(\"/\") || name.includes(\"\\\\\") || name.includes(\"..\")) {\n res.status(400).send(\"Invalid name\");\n return;\n }\n const filePath = resolveDocPath(name);\n if (!isDocPathSafe(filePath)) {\n res.status(400).send(\"Invalid path\");\n return;\n }\n res.json({ exists: fs.existsSync(filePath) });\n });\n\n app.post(\"/api/docs\", (req: Request, res: Response) => {\n let payload:\n | {\n name?: string;\n type?: \"markdown\" | \"json\" | \"app\";\n content?: string;\n title?: string;\n }\n | null = null;\n if (typeof req.body === \"string\") {\n try {\n payload = JSON.parse(req.body);\n } catch {\n payload = null;\n }\n } else if (req.body && typeof req.body === \"object\") {\n payload = req.body as {\n name?: string;\n type?: \"markdown\" | \"json\" | \"app\";\n content?: string;\n title?: string;\n };\n }\n\n const rawName = String(payload?.name ?? \"\");\n const rawType = payload?.type ?? null;\n\n if (!rawType) {\n res.status(400).send(\"Missing type\");\n return;\n }\n\n const name = normalizeDocName(rawName, rawType);\n const nameError = validateDocName(name);\n if (nameError) {\n res.status(400).send(nameError);\n return;\n }\n const fileName = name;\n const filePath = resolveDocPath(fileName);\n if (!isDocPathSafe(filePath)) {\n res.status(400).send(\"Invalid path\");\n return;\n }\n if (fs.existsSync(filePath)) {\n res.status(409).send(\"Name already exists\");\n return;\n }\n const content =\n payload?.content ??\n (rawType === \"json\" ? JSON.stringify({ data: [] }, null, 2) : \"\");\n fs.writeFileSync(filePath, content, \"utf-8\");\n indexFileTags(fileName);\n rebuildTagIndex();\n const createdTags = normalizeTags(tagsFromContent(fileName, content));\n const createdTitle =\n rawType === \"markdown\" ? extractMarkdownTitle(content) : null;\n res.status(201).json({\n name: fileName,\n type: rawType,\n title: createdTitle,\n tags: createdTags,\n displayName:\n createdTitle && createdTitle.length > 0\n ? createdTitle\n : displayNameFromFileName(fileName),\n });\n });\n\n app.post(\"/api/doc/rename\", (req: Request, res: Response) => {\n let payload:\n | {\n from?: string;\n to?: string;\n }\n | null = null;\n if (typeof req.body === \"string\") {\n try {\n payload = JSON.parse(req.body);\n } catch {\n payload = null;\n }\n } else if (req.body && typeof req.body === \"object\") {\n payload = req.body as { from?: string; to?: string };\n }\n\n const from = String(payload?.from ?? \"\").trim();\n const to = String(payload?.to ?? \"\").trim();\n if (!from || !to) {\n res.status(400).send(\"Missing rename target\");\n return;\n }\n const fromError = validateDocName(from);\n if (fromError) {\n res.status(400).send(fromError);\n return;\n }\n const toError = validateDocName(to);\n if (toError) {\n res.status(400).send(toError);\n return;\n }\n if (isMetadataName(from) || isMetadataName(to)) {\n res.status(400).send(\"Reserved name\");\n return;\n }\n const fromPath = resolveDocPath(from);\n const toPath = resolveDocPath(to);\n if (!isDocPathSafe(fromPath) || !isDocPathSafe(toPath)) {\n res.status(400).send(\"Invalid path\");\n return;\n }\n if (!fs.existsSync(fromPath)) {\n res.status(404).send(\"Not found\");\n return;\n }\n if (fs.existsSync(toPath)) {\n res.status(409).send(\"Name already exists\");\n return;\n }\n const fromType = getDocTypeFromName(from);\n const toType = getDocTypeFromName(to);\n if (!fromType || !toType || fromType !== toType) {\n res.status(400).send(`Name extension does not match type`);\n return;\n }\n fs.renameSync(fromPath, toPath);\n if (fromType) {\n fileTags.delete(from);\n indexFileTags(to);\n rebuildTagIndex();\n }\n res.json({\n name: to,\n type: fromType,\n title: null,\n displayName: displayNameFromFileName(to),\n });\n });\n\n app.post(\"/api/doc/:name/archive\", (req: Request, res: Response) => {\n const name = String(req.params.name);\n if (isMetadataName(name)) {\n res.status(400).send(\"Reserved name\");\n return;\n }\n if (name.includes(\"/\") || name.includes(\"\\\\\") || name.includes(\"..\")) {\n res.status(400).send(\"Invalid name\");\n return;\n }\n const filePath = resolveDocPath(name);\n if (!isDocPathSafe(filePath)) {\n res.status(400).send(\"Invalid path\");\n return;\n }\n if (!fs.existsSync(filePath)) {\n res.status(404).send(\"Not found\");\n return;\n }\n const archiveDir = path.join(hyperdocDir, archiveDirName);\n ensureHyperdocDir();\n if (!fs.existsSync(archiveDir)) {\n fs.mkdirSync(archiveDir, { recursive: true });\n }\n const archivePath = path.join(archiveDir, name);\n if (fs.existsSync(archivePath)) {\n res.status(409).send(\"Archived file already exists with that name\");\n return;\n }\n fs.renameSync(filePath, archivePath);\n fileTags.delete(name);\n rebuildTagIndex();\n res.json({ archived: true, name });\n });\n\n app.get(\"/api/doc/:name\", (req: Request, res: Response) => {\n const name = String(req.params.name);\n if (isMetadataName(name)) {\n res.status(400).send(\"Reserved name\");\n return;\n }\n const filePath = resolveDocPath(name);\n if (!isDocPathSafe(filePath)) {\n res.status(400).send(\"Invalid path\");\n return;\n }\n if (!fs.existsSync(filePath)) {\n res.status(404).send(\"Not found\");\n return;\n }\n const content = fs.readFileSync(filePath, \"utf-8\");\n const stat = fs.statSync(filePath);\n const ext = path.extname(name).toLowerCase();\n if (ext === \".md\") {\n const metadata = getMarkdownMetadata(content);\n res.json({\n content: stripMarkdownMetadataHeader(content),\n mtimeMs: stat.mtimeMs,\n metadata,\n });\n return;\n }\n res.json({ content, mtimeMs: stat.mtimeMs });\n });\n\n app.put(\"/api/doc/:name\", (req: Request, res: Response) => {\n const name = String(req.params.name);\n if (isMetadataName(name)) {\n res.status(400).send(\"Reserved name\");\n return;\n }\n const filePath = resolveDocPath(name);\n if (!isDocPathSafe(filePath)) {\n res.status(400).send(\"Invalid path\");\n return;\n }\n if (!fs.existsSync(filePath)) {\n res.status(404).send(\"Not found\");\n return;\n }\n const baseHeader = req.header(\"x-hyperdoc-base-version\");\n if (baseHeader !== undefined) {\n const baseVersion = Number(baseHeader);\n if (!Number.isFinite(baseVersion)) {\n res.status(400).send(\"Invalid base version\");\n return;\n }\n const currentStat = fs.statSync(filePath);\n if (currentStat.mtimeMs !== baseVersion) {\n res.status(409).json({ mtimeMs: currentStat.mtimeMs });\n return;\n }\n }\n fs.writeFileSync(filePath, req.body ?? \"\", \"utf-8\");\n const stat = fs.statSync(filePath);\n const clientId = req.header(\"x-hyperdoc-client-id\");\n if (clientId) {\n recentWrites.set(name, {\n clientId,\n ts: Date.now(),\n mtimeMs: stat.mtimeMs,\n });\n }\n res.json({ mtimeMs: stat.mtimeMs });\n });\n\n app.delete(\"/api/doc/:name\", (req: Request, res: Response) => {\n const name = String(req.params.name);\n if (isMetadataName(name)) {\n res.status(400).send(\"Reserved name\");\n return;\n }\n if (name.includes(\"/\") || name.includes(\"\\\\\") || name.includes(\"..\")) {\n res.status(400).send(\"Invalid name\");\n return;\n }\n const filePath = resolveDocPath(name);\n if (!isDocPathSafe(filePath)) {\n res.status(400).send(\"Invalid path\");\n return;\n }\n if (!fs.existsSync(filePath)) {\n res.status(404).send(\"Not found\");\n return;\n }\n const trashDir = path.join(hyperdocDir, trashDirName);\n ensureHyperdocDir();\n if (!fs.existsSync(trashDir)) {\n fs.mkdirSync(trashDir, { recursive: true });\n // Create .gitignore to exclude trash contents from git\n fs.writeFileSync(path.join(trashDir, \".gitignore\"), \"*\\n!.gitignore\\n\");\n }\n const trashPath = path.join(trashDir, name);\n if (fs.existsSync(trashPath)) {\n // If file already exists in trash, add timestamp to avoid overwriting\n const ext = path.extname(name);\n const base = name.slice(0, -ext.length);\n const timestamp = Date.now();\n const uniqueName = `${base}-${timestamp}${ext}`;\n fs.renameSync(filePath, path.join(trashDir, uniqueName));\n } else {\n fs.renameSync(filePath, trashPath);\n }\n fileTags.delete(name);\n rebuildTagIndex();\n res.json({ deleted: true });\n });\n\n app.get(\"/api/tags\", (req: Request, res: Response) => {\n res.json({ tags: Array.from(tagIndex).sort() });\n });\n\n const clients = new Set<Response>();\n const recentWrites = new Map<\n string,\n { clientId: string; ts: number; mtimeMs: number }\n >();\n const watcher = chokidar.watch(rootDir, {\n ignoreInitial: true,\n ignored: (target) => {\n const rel = path.relative(rootDir, target);\n if (!rel) return false;\n if (rel.startsWith(\".git\")) return true;\n if (rel.startsWith(hyperdocDirName)) return true;\n if (rel.startsWith(\".trash\")) return true;\n if (rel.startsWith(\".archive\")) return true;\n if (rel.startsWith(\"node_modules\")) return true;\n if (rel.startsWith(\"dist\")) return true;\n return false;\n },\n });\n\n watcher.on(\"all\", (event, filePath) => {\n if (!filePath.endsWith(\".md\") && !filePath.endsWith(\".json\")) return;\n if (path.basename(filePath) === metadataFileName) return;\n const name = path.basename(filePath);\n if (name.endsWith(\".md\") || name.endsWith(\".json\")) {\n if (event === \"unlink\") {\n fileTags.delete(name);\n recentWrites.delete(name);\n } else {\n indexFileTags(name);\n }\n rebuildTagIndex();\n }\n let mtimeMs: number | undefined;\n if (event !== \"unlink\") {\n try {\n const stat = fs.statSync(filePath);\n mtimeMs = stat.mtimeMs;\n } catch {\n mtimeMs = undefined;\n }\n }\n const recent = recentWrites.get(name);\n const sourceId =\n recent && Date.now() - recent.ts < 2000 ? recent.clientId : undefined;\n const payload = JSON.stringify({ type: event, name, mtimeMs, sourceId });\n for (const client of clients) {\n client.write(`data: ${payload}\\n\\n`);\n }\n });\n\n app.get(\"/api/events\", (req: Request, res: Response) => {\n res.setHeader(\"Content-Type\", \"text/event-stream\");\n res.setHeader(\"Cache-Control\", \"no-cache\");\n res.setHeader(\"Connection\", \"keep-alive\");\n res.flushHeaders();\n\n clients.add(res);\n req.on(\"close\", () => {\n clients.delete(res);\n });\n });\n\n return app;\n}\n","export * from \"./createApp\";\n","import { Command } from \"commander\";\nimport { PromptCommand, ServerCommand } from \"../commands\";\nimport { CommandHandler, HyperdocCommand } from \"../types\";\nimport { LogLevel, logger } from \"@hyperdoc/core\";\nimport packageJson from \"../../package.json\";\n\nexport class CommanderCli {\n private program: Command;\n private commandHandlers: Map<HyperdocCommand, CommandHandler> = new Map();\n\n constructor() {\n this.program = new Command();\n this.setupCommandHandlers();\n this.setupProgram();\n }\n\n private setupCommandHandlers(): void {\n this.commandHandlers.set(\"prompt\", new PromptCommand());\n this.commandHandlers.set(\"server\", new ServerCommand());\n }\n\n private setupProgram(): void {\n this.program\n .name(\"hyper\")\n .description(\"Local Hyperdoc server and tooling\")\n .version(packageJson.version);\n\n this.program\n .option(\"--root <dir>\", \"Project root (defaults to cwd)\")\n .option(\"-v, --verbose\", \"Increase logging verbosity\")\n .option(\"-q, --quiet\", \"Reduce logging output\")\n .option(\"-d, --debug\", \"Enable debug logging\");\n\n this.program\n .command(\"prompt\")\n .description(\"Print the agent prompt/spec to stdout\")\n .action(async (options, command) => {\n await this.executeCommand(\"prompt\", command);\n });\n\n this.program\n .command(\"server\")\n .description(\"Start the local Hyperdoc server\")\n .option(\"--port <number>\", \"Port to run the server on\", (value) =>\n Number(value),\n )\n .option(\"-o, --open\", \"Open the UI in the browser\")\n .action(async (options, command) => {\n await this.executeCommand(\"server\", command);\n });\n }\n\n private async executeCommand(\n command: HyperdocCommand,\n commandInstance: Command,\n ): Promise<void> {\n const parent = commandInstance.parent!;\n const globalOpts = parent.opts();\n const commandOpts = commandInstance.opts();\n const allOptions = { ...globalOpts, ...commandOpts };\n\n if (allOptions.debug) {\n logger.setLevel(LogLevel.DEBUG);\n } else if (allOptions.verbose) {\n logger.setLevel(LogLevel.INFO);\n } else if (allOptions.quiet) {\n logger.setLevel(LogLevel.WARN);\n }\n\n const handler = this.commandHandlers.get(command);\n if (!handler) {\n throw new Error(`No handler found for command: ${command}`);\n }\n\n await handler.execute({ options: allOptions });\n }\n\n async parse(args: string[]): Promise<void> {\n await this.program.parseAsync(args);\n }\n\n getHelp(): string {\n return this.program.helpInformation();\n }\n}\n","import fs from \"fs\";\nimport path from \"path\";\nimport { CommandContext, CommandHandler } from \"../types\";\n\nexport class PromptCommand implements CommandHandler {\n async execute(context: CommandContext): Promise<void> {\n void context;\n const promptPath = path.join(__dirname, \"..\", \"prompts\", \"agent.txt\");\n const prompt = fs.readFileSync(promptPath, \"utf-8\");\n process.stdout.write(prompt);\n if (!prompt.endsWith(\"\\n\")) {\n process.stdout.write(\"\\n\");\n }\n }\n}\n","import fs from \"fs\";\nimport path from \"path\";\nimport open from \"open\";\nimport { CommandContext, CommandHandler } from \"../types\";\nimport { logger } from \"@hyperdoc/core\";\nimport { createApp } from \"@hyperdoc/server\";\n\nconst DEFAULT_PORT = 4321;\n\nexport class ServerCommand implements CommandHandler {\n async execute(context: CommandContext): Promise<void> {\n const rootDir = path.resolve(context.options.root ?? process.cwd());\n const port = Number(\n context.options.port ?? process.env.HYPERDOC_PORT ?? DEFAULT_PORT,\n );\n\n const webDirCandidates = [\n path.join(__dirname, \"web\"),\n path.join(__dirname, \"..\", \"web\"),\n path.join(__dirname, \"..\", \"..\", \"..\", \"web\", \"dist\"),\n ];\n const webDir = webDirCandidates.find((candidate) =>\n fs.existsSync(candidate),\n );\n if (!webDir) {\n logger.warn(\n `Web bundle not found at ${webDirCandidates.join(\", \")}. Run pnpm --filter hyperdoc-web build.`,\n );\n }\n const app = createApp({ rootDir, staticDir: webDir ?? \"\" });\n\n app.get(\"*\", (req, res) => {\n const indexPath = webDir ? path.join(webDir, \"index.html\") : \"\";\n if (indexPath && fs.existsSync(indexPath)) {\n res.sendFile(indexPath);\n } else {\n res.status(500).send(\"Web bundle missing. Run pnpm build:web.\");\n }\n });\n\n app.listen(port, () => {\n const url = `http://localhost:${port}`;\n logger.info(`Hyperdoc server running at ${url}`);\n if (context.options.open) {\n open(url).catch(() => undefined);\n }\n });\n }\n}\n","{\n \"name\": \"@maplab/hyperdoc\",\n \"version\": \"0.2.1\",\n \"description\": \"Hyperdoc CLI and local server\",\n \"type\": \"commonjs\",\n \"main\": \"dist/index.js\",\n \"types\": \"dist/index.d.ts\",\n \"bin\": {\n \"hyper\": \"dist/index.js\"\n },\n \"files\": [\n \"dist\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"scripts\": {\n \"build\": \"tsup && node scripts/copy-prompts.js && node scripts/copy-web.js\",\n \"dev\": \"tsx src/index.ts\",\n \"start\": \"node dist/index.js\",\n \"typecheck\": \"tsc -p tsconfig.json --noEmit\"\n },\n \"dependencies\": {\n \"chokidar\": \"^5.0.0\",\n \"commander\": \"^14.0.0\",\n \"markdown-it\": \"^14.1.0\",\n \"open\": \"^9.1.0\",\n \"express\": \"^4.19.2\",\n \"zod\": \"^4.1.5\"\n },\n \"devDependencies\": {\n \"@hyperdoc/core\": \"workspace:*\",\n \"@hyperdoc/server\": \"workspace:*\",\n \"tsup\": \"^8.5.0\"\n }\n}\n","import { CommanderCli } from \"./cli\";\nimport { LogLevel, formatError, logger } from \"@hyperdoc/core\";\n\ndeclare const process: {\n argv: string[];\n exit: (code: number) => never;\n};\n\nconst cli = new CommanderCli();\n\nasync function main() {\n try {\n await cli.parse(process.argv);\n } catch (error) {\n const showStackTrace = logger.getLevel() === LogLevel.DEBUG;\n const formattedError = formatError(error, showStackTrace);\n console.error(formattedError);\n process.exit(1);\n }\n}\n\nmain();\n"],"mappings":"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","names":["exports","formatError","LogLevel","exports","exports","exports","exports","exports","exports","createApp","exports","path","fs","import_fs","import_path","path","fs","open","import_core","import_core"]}