@maplab/hyperdoc 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -0
- package/dist/index.js +962 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/agent.txt +36 -0
- package/dist/web/assets/index-DXKkNcYu.js +549 -0
- package/dist/web/assets/index-NDUveQC0.css +1 -0
- package/dist/web/index.html +14 -0
- package/package.json +36 -0
|
@@ -0,0 +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"]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
Hyperdoc Agent Spec
|
|
2
|
+
|
|
3
|
+
Files:
|
|
4
|
+
- Markdown lives in `.md` files.
|
|
5
|
+
- Data tables live in `.json` files.
|
|
6
|
+
- Project metadata lives in `.hyperdoc/project.json` (optional). It can include a `name` field for the project. Update this file if the user asks to rename the project.
|
|
7
|
+
- Archived documents live in `.hyperdoc/archive/`. Ignore archived content unless the user explicitly asks to view or restore archived items.
|
|
8
|
+
- Deleted documents live in `.hyperdoc/trash/`. Ignore trash contents unless the user explicitly asks to view or restore them.
|
|
9
|
+
- The `.hyperdoc/` directory is internal. Ignore its contents unless the user asks for project metadata or archived/trash items.
|
|
10
|
+
|
|
11
|
+
Tables (JSON files):
|
|
12
|
+
- Must be valid JSON: an object with `data`. `metadata` is strictly optional.
|
|
13
|
+
- Values must be strings only (no nested objects/arrays).
|
|
14
|
+
- Rows can link to docs via `@path.md` values.
|
|
15
|
+
|
|
16
|
+
Example table (`projects.json`):
|
|
17
|
+
{
|
|
18
|
+
"data": [
|
|
19
|
+
{ "name": "Project 1", "details": "@project-1.md", "status": "Active", "createdAt": "1970-01-01" },
|
|
20
|
+
{ "name": "Project 2", "details": "@project-2.md", "status": "Draft", "createdAt": "1970-01-01" }
|
|
21
|
+
],
|
|
22
|
+
"metadata": {
|
|
23
|
+
"sortBy": { "id": "createdAt", "desc": true },
|
|
24
|
+
"groupBy": "status"
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
Notes:
|
|
29
|
+
- `metadata` is optional. Omit it unless you explicitly want a default sort/group.
|
|
30
|
+
- `sortBy` and `groupBy` are optional inside `metadata`.
|
|
31
|
+
|
|
32
|
+
Links:
|
|
33
|
+
- Markdown can reference tables or docs via `@path` (e.g., `@projects.json`).
|
|
34
|
+
|
|
35
|
+
Validation:
|
|
36
|
+
- Run `hyper validate --root <docs-root>` to check repo structure and JSON tables.
|