@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 +2 -1
- package/dist/index.js +122 -56
- package/dist/index.js.map +1 -1
- package/dist/web/assets/index-DMhiJVmN.js +549 -0
- package/dist/web/assets/index-KIh2MATB.css +1 -0
- package/dist/web/index.html +2 -2
- package/package.json +1 -1
- package/dist/web/assets/index-DXKkNcYu.js +0 -549
- package/dist/web/assets/index-NDUveQC0.css +0 -1
package/dist/index.d.ts
CHANGED
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
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
|
|
281
|
-
if (
|
|
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 (
|
|
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) =>
|
|
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 =
|
|
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
|
-
|
|
373
|
-
type: entry.name
|
|
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
|
|
379
|
-
let
|
|
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
|
-
|
|
385
|
-
|
|
444
|
+
tags = normalizeTags(metadata?.tags ?? []);
|
|
445
|
+
pinned = metadata?.pinned ?? false;
|
|
386
446
|
} catch {
|
|
387
447
|
title = null;
|
|
388
|
-
|
|
389
|
-
|
|
448
|
+
tags = [];
|
|
449
|
+
pinned = false;
|
|
390
450
|
}
|
|
391
451
|
return {
|
|
392
452
|
...entry,
|
|
393
453
|
title,
|
|
394
|
-
tags
|
|
395
|
-
pinned
|
|
454
|
+
tags,
|
|
455
|
+
pinned,
|
|
396
456
|
displayName: title && title.length > 0 ? title : displayNameFromFileName(entry.name)
|
|
397
457
|
};
|
|
398
458
|
}
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
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 ?? "")
|
|
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
|
|
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
|
|
540
|
-
const
|
|
541
|
-
if (
|
|
542
|
-
res.status(400).send(
|
|
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 (
|
|
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:
|
|
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
|
|
831
|
-
|
|
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 ${
|
|
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.
|
|
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"]}
|