@webhouse/cms 0.1.2 → 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/CLAUDE.md +822 -0
- package/dist/index.cjs +9 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +9 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/schema/define.ts","../src/schema/validate.ts","../src/schema/introspect.ts","../src/storage/filesystem/adapter.ts","../src/utils/id.ts","../src/utils/slug.ts","../src/utils/date.ts","../src/storage/sqlite/adapter.ts","../src/storage/github/adapter.ts","../src/content/field-meta.ts","../src/content/service.ts","../src/api/server.ts","../src/api/routes/content.ts","../src/api/routes/schema.ts","../src/api/routes/manifest.ts","../src/build/pipeline.ts","../src/build/resolve.ts","../src/build/render.ts","../src/template/engine.ts","../src/template/builtins/layout.ts","../src/routing/resolver.ts","../src/build/output.ts","../src/build/sitemap.ts","../src/build/autolink.ts","../src/build/llms.ts","../src/build/ai-plugin.ts"],"sourcesContent":["// Schema\nexport { defineConfig, defineCollection, defineBlock, defineField } from './schema/define.js';\nexport { validateConfig, safeValidateConfig } from './schema/validate.js';\nexport { collectionToJsonSchema, configToManifest } from './schema/introspect.js';\nexport type { CmsConfig, CollectionConfig, FieldConfig, BlockConfig, FieldType, BuildConfig, AutolinkConfig } from './schema/types.js';\n\n// Storage\nexport { FilesystemStorageAdapter } from './storage/filesystem/adapter.js';\nexport { SqliteStorageAdapter } from './storage/sqlite/adapter.js';\nexport { GitHubStorageAdapter } from './storage/github/adapter.js';\nexport type { GitHubAdapterConfig } from './storage/github/adapter.js';\nexport type { StorageAdapter, Document, DocumentInput, QueryOptions, QueryResult, DocumentStatus, FieldMeta, DocumentFieldMeta, WriteContext, SearchOptions, SearchResult } from './storage/types.js';\n\n// Content\nexport { ContentService } from './content/service.js';\nexport type { ContentHooks } from './content/hooks.js';\nexport { isFieldLocked, getLockedFields, filterUnlockedFields, computeFieldMetaChanges, buildInitialFieldMeta } from './content/field-meta.js';\nexport type { FieldMetaChanges } from './content/field-meta.js';\n\n// API\nexport { createApiServer } from './api/server.js';\n\n// Build\nexport { runBuild } from './build/pipeline.js';\nexport type { BuildResult, BuildOptions } from './build/pipeline.js';\n\n// Template\nexport { html, raw } from './template/engine.js';\nexport type { TemplateContext, BlockRenderer, PageTemplate, LayoutTemplate } from './template/types.js';\n\n// Utils\nexport { generateId } from './utils/id.js';\nexport { generateSlug } from './utils/slug.js';\nexport { now, formatDate } from './utils/date.js';\n\n// Main factory\nimport { validateConfig } from './schema/validate.js';\nimport { FilesystemStorageAdapter } from './storage/filesystem/adapter.js';\nimport { SqliteStorageAdapter } from './storage/sqlite/adapter.js';\nimport { GitHubStorageAdapter } from './storage/github/adapter.js';\nimport { ContentService } from './content/service.js';\nimport { createApiServer } from './api/server.js';\nimport { runBuild } from './build/pipeline.js';\nimport type { CmsConfig } from './schema/types.js';\nimport type { StorageAdapter } from './storage/types.js';\nimport type { BuildOptions } from './build/pipeline.js';\n\nexport async function createCms(config: CmsConfig, options?: { storage?: StorageAdapter }) {\n const validated = validateConfig(config);\n\n let storage: StorageAdapter;\n\n if (options?.storage) {\n storage = options.storage;\n } else if (validated.storage?.adapter === 'filesystem') {\n storage = new FilesystemStorageAdapter(validated.storage.filesystem?.contentDir);\n } else if (validated.storage?.adapter === 'github') {\n storage = new GitHubStorageAdapter(validated.storage.github!);\n } else {\n storage = new SqliteStorageAdapter(validated.storage?.sqlite?.path);\n }\n\n await storage.initialize();\n await storage.migrate(validated.collections.map(c => c.name));\n\n const content = new ContentService(storage, validated);\n const api = createApiServer(validated, storage);\n\n return {\n config: validated,\n storage,\n content,\n api,\n build: (opts?: BuildOptions) => runBuild(validated, storage, opts),\n };\n}\n","import type { CmsConfig, CollectionConfig, BlockConfig, FieldConfig } from './types.js';\n\nexport function defineConfig(config: CmsConfig): CmsConfig {\n return config;\n}\n\nexport function defineCollection(config: CollectionConfig): CollectionConfig {\n return config;\n}\n\nexport function defineBlock(config: BlockConfig): BlockConfig {\n return config;\n}\n\nexport function defineField(config: FieldConfig): FieldConfig {\n return config;\n}\n","import { z } from 'zod';\nimport type { CmsConfig } from './types.js';\n\nconst fieldTypeSchema = z.enum([\n 'text', 'textarea', 'richtext', 'number', 'boolean',\n 'date', 'image', 'relation', 'array', 'object', 'blocks', 'select', 'tags',\n 'image-gallery', 'video',\n]);\n\nconst fieldConfigSchema: z.ZodType<any> = z.lazy(() =>\n z.object({\n name: z.string().min(1),\n type: fieldTypeSchema,\n label: z.string().optional(),\n required: z.boolean().optional(),\n defaultValue: z.unknown().optional(),\n maxLength: z.number().optional(),\n minLength: z.number().optional(),\n options: z.array(z.object({ label: z.string(), value: z.string() })).optional(),\n collection: z.string().optional(),\n fields: z.array(fieldConfigSchema).optional(),\n blocks: z.array(z.string()).optional(),\n ai: z.object({\n hint: z.string().optional(),\n maxLength: z.number().optional(),\n tone: z.string().optional(),\n }).optional(),\n aiLock: z.object({\n autoLockOnEdit: z.boolean().optional(),\n lockable: z.boolean().optional(),\n requireApproval: z.boolean().optional(),\n }).optional(),\n })\n);\n\nconst collectionConfigSchema = z.object({\n name: z.string().min(1),\n label: z.string().optional(),\n slug: z.string().optional(),\n urlPrefix: z.string().optional(),\n parentField: z.string().optional(),\n fields: z.array(fieldConfigSchema).min(1),\n hooks: z.object({\n beforeCreate: z.string().optional(),\n afterCreate: z.string().optional(),\n beforeUpdate: z.string().optional(),\n afterUpdate: z.string().optional(),\n beforeDelete: z.string().optional(),\n afterDelete: z.string().optional(),\n }).optional(),\n});\n\nconst cmsConfigSchema = z.object({\n collections: z.array(collectionConfigSchema).min(1),\n blocks: z.array(z.object({\n name: z.string(),\n label: z.string().optional(),\n fields: z.array(fieldConfigSchema),\n })).optional(),\n storage: z.object({\n adapter: z.enum(['sqlite', 'filesystem']).optional(),\n sqlite: z.object({ path: z.string().optional() }).optional(),\n filesystem: z.object({ contentDir: z.string().optional() }).optional(),\n }).optional(),\n build: z.object({\n outDir: z.string().optional(),\n baseUrl: z.string().optional(),\n }).optional(),\n api: z.object({\n port: z.number().optional(),\n prefix: z.string().optional(),\n }).optional(),\n});\n\nexport function validateConfig(config: unknown): CmsConfig {\n return cmsConfigSchema.parse(config) as CmsConfig;\n}\n\nexport function safeValidateConfig(config: unknown): { success: true; data: CmsConfig } | { success: false; error: z.ZodError } {\n const result = cmsConfigSchema.safeParse(config);\n if (result.success) {\n return { success: true, data: result.data as CmsConfig };\n }\n return { success: false, error: result.error };\n}\n","import type { CmsConfig, CollectionConfig, FieldConfig } from './types.js';\n\nexport interface JsonSchemaProperty {\n type?: string | string[];\n description?: string;\n properties?: Record<string, JsonSchemaProperty>;\n items?: JsonSchemaProperty;\n enum?: string[];\n format?: string;\n minLength?: number;\n maxLength?: number;\n required?: string[];\n}\n\nexport interface CollectionJsonSchema {\n $schema: string;\n title: string;\n type: 'object';\n properties: Record<string, JsonSchemaProperty>;\n required: string[];\n}\n\nfunction fieldToJsonSchema(field: FieldConfig): JsonSchemaProperty {\n const base: JsonSchemaProperty = {\n description: field.label ?? field.name,\n };\n\n switch (field.type) {\n case 'text':\n case 'textarea':\n case 'richtext': {\n const prop: JsonSchemaProperty = { ...base, type: 'string' };\n if (field.minLength !== undefined) prop.minLength = field.minLength;\n if (field.maxLength !== undefined) prop.maxLength = field.maxLength;\n return prop;\n }\n case 'number':\n return { ...base, type: 'number' };\n case 'boolean':\n return { ...base, type: 'boolean' };\n case 'date':\n return { ...base, type: 'string', format: 'date-time' };\n case 'image':\n return { ...base, type: 'string', format: 'uri', description: 'Image URL or path' };\n case 'select': {\n const prop: JsonSchemaProperty = { ...base, type: 'string' };\n if (field.options) prop.enum = field.options.map(o => o.value);\n return prop;\n }\n case 'relation':\n return { ...base, type: 'string', description: `Reference to ${field.collection ?? 'unknown'} collection` };\n case 'array':\n return {\n ...base,\n type: 'array',\n items: field.fields?.[0] ? fieldToJsonSchema(field.fields[0]) : { type: 'string' },\n };\n case 'object':\n if (field.fields) {\n const properties: Record<string, JsonSchemaProperty> = {};\n for (const f of field.fields) {\n properties[f.name] = fieldToJsonSchema(f);\n }\n return { ...base, type: 'object', properties };\n }\n return { ...base, type: 'object' };\n case 'blocks':\n return { ...base, type: 'array', items: { type: 'object' } };\n default:\n return { ...base, type: 'string' };\n }\n}\n\nexport function collectionToJsonSchema(collection: CollectionConfig): CollectionJsonSchema {\n const properties: Record<string, JsonSchemaProperty> = {};\n const required: string[] = [];\n\n for (const field of collection.fields) {\n properties[field.name] = fieldToJsonSchema(field);\n if (field.required === true) {\n required.push(field.name);\n }\n }\n\n return {\n $schema: 'http://json-schema.org/draft-07/schema#',\n title: collection.label ?? collection.name,\n type: 'object',\n properties,\n required,\n };\n}\n\nexport function configToManifest(config: CmsConfig) {\n return {\n version: '0.1.0',\n collections: config.collections.map(c => ({\n name: c.name,\n label: c.label ?? c.name,\n slug: c.slug ?? c.name,\n fields: c.fields,\n schema: collectionToJsonSchema(c),\n })),\n blocks: config.blocks ?? [],\n api: {\n rest: {\n prefix: config.api?.prefix ?? '/api',\n endpoints: config.collections.flatMap(c => [\n { method: 'GET', path: `/api/content/${c.name}`, description: `List ${c.name}` },\n { method: 'GET', path: `/api/content/${c.name}/:slug`, description: `Get ${c.name} by slug` },\n { method: 'POST', path: `/api/content/${c.name}`, description: `Create ${c.name}` },\n { method: 'PUT', path: `/api/content/${c.name}/:slug`, description: `Update ${c.name}` },\n { method: 'DELETE', path: `/api/content/${c.name}/:slug`, description: `Delete ${c.name}` },\n ]),\n },\n },\n ai: {\n agents: ['content', 'seo'],\n capabilities: {\n content: ['generate', 'rewrite', 'translate', 'seo-optimize', 'expand'],\n seo: ['meta-tags', 'json-ld', 'sitemap'],\n },\n note: 'Set ANTHROPIC_API_KEY or OPENAI_API_KEY to enable AI features',\n },\n };\n}\n","import { existsSync, mkdirSync, readdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { StorageAdapter, Document, DocumentInput, QueryOptions, QueryResult } from '../types.js';\nimport { generateId } from '../../utils/id.js';\nimport { generateSlug } from '../../utils/slug.js';\nimport { now } from '../../utils/date.js';\n\nexport class FilesystemStorageAdapter implements StorageAdapter {\n private contentDir: string;\n\n constructor(contentDir: string = 'content') {\n this.contentDir = contentDir;\n }\n\n async initialize(): Promise<void> {\n if (!existsSync(this.contentDir)) {\n mkdirSync(this.contentDir, { recursive: true });\n }\n }\n\n private collectionDir(collection: string): string {\n return join(this.contentDir, collection);\n }\n\n private documentPath(collection: string, slug: string): string {\n return join(this.collectionDir(collection), `${slug}.json`);\n }\n\n private readDocument(collection: string, slug: string): Document | null {\n const path = this.documentPath(collection, slug);\n if (!existsSync(path)) return null;\n try {\n const doc = JSON.parse(readFileSync(path, 'utf-8')) as Document;\n // Legacy files may lack an id — assign and persist one immediately\n if (!doc.id) {\n doc.id = generateId();\n writeFileSync(path, JSON.stringify({ ...doc, _fieldMeta: doc._fieldMeta ?? {} }, null, 2), 'utf-8');\n }\n return { ...doc, _fieldMeta: doc._fieldMeta ?? {} };\n } catch {\n return null;\n }\n }\n\n async migrate(collections: string[]): Promise<void> {\n for (const collection of collections) {\n const dir = this.collectionDir(collection);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n }\n\n async create(collection: string, input: DocumentInput): Promise<Document> {\n const dir = this.collectionDir(collection);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n\n const id = generateId();\n const slug = input.slug ?? generateSlug(String(input.data['title'] ?? id));\n const timestamp = now();\n\n const doc: Document = {\n id,\n slug,\n collection,\n status: input.status ?? 'draft',\n data: input.data,\n _fieldMeta: input._fieldMeta ?? {},\n createdAt: timestamp,\n updatedAt: timestamp,\n ...(input.locale !== undefined && { locale: input.locale }),\n ...(input.translationOf !== undefined && { translationOf: input.translationOf }),\n ...(input.publishAt != null && { publishAt: input.publishAt }),\n };\n\n writeFileSync(this.documentPath(collection, slug), JSON.stringify(doc, null, 2), 'utf-8');\n return doc;\n }\n\n async findById(collection: string, id: string): Promise<Document | null> {\n if (!id) return null; // guard: never match documents with missing ids\n const dir = this.collectionDir(collection);\n if (!existsSync(dir)) return null;\n\n const files = readdirSync(dir).filter(f => f.endsWith('.json'));\n for (const file of files) {\n const slug = file.replace('.json', '');\n const doc = this.readDocument(collection, slug);\n if (doc?.id === id) return doc;\n }\n return null;\n }\n\n async findBySlug(collection: string, slug: string): Promise<Document | null> {\n return this.readDocument(collection, slug);\n }\n\n async findMany(collection: string, options: QueryOptions = {}): Promise<QueryResult> {\n const dir = this.collectionDir(collection);\n if (!existsSync(dir)) return { documents: [], total: 0 };\n\n const files = readdirSync(dir).filter(f => f.endsWith('.json'));\n let documents: Document[] = [];\n\n for (const file of files) {\n const slug = file.replace('.json', '');\n const doc = this.readDocument(collection, slug);\n if (doc) documents.push(doc);\n }\n\n if (options.status) {\n documents = documents.filter(d => d.status === options.status);\n }\n\n if (options.locale) {\n documents = documents.filter(d => d.locale === options.locale);\n }\n\n if (options.translationOf) {\n documents = documents.filter(d => d.translationOf === options.translationOf);\n }\n\n if (options.tags && options.tags.length > 0) {\n documents = documents.filter(d => {\n const docTags = d.data['tags'];\n if (!Array.isArray(docTags)) return false;\n return options.tags!.every(tag => docTags.includes(tag));\n });\n }\n\n const orderBy = options.orderBy ?? 'createdAt';\n const order = options.order ?? 'desc';\n const DOC_KEYS = new Set<string>(['id', 'slug', 'collection', 'status', 'createdAt', 'updatedAt']);\n documents.sort((a, b) => {\n const getVal = (doc: Document): string => {\n if (DOC_KEYS.has(orderBy)) return String(doc[orderBy as keyof Document] ?? '');\n return String(doc.data[orderBy] ?? '');\n };\n const aVal = getVal(a);\n const bVal = getVal(b);\n const aNum = Number(aVal);\n const bNum = Number(bVal);\n if (!isNaN(aNum) && !isNaN(bNum)) {\n return order === 'asc' ? aNum - bNum : bNum - aNum;\n }\n return order === 'asc' ? aVal.localeCompare(bVal) : bVal.localeCompare(aVal);\n });\n\n const total = documents.length;\n const offset = options.offset ?? 0;\n const limit = options.limit ?? total;\n documents = documents.slice(offset, offset + limit);\n\n return { documents, total };\n }\n\n async update(collection: string, id: string, input: Partial<DocumentInput>): Promise<Document> {\n const existing = await this.findById(collection, id);\n if (!existing) throw new Error(`Document ${id} not found in collection ${collection}`);\n\n const updated: Document = {\n ...existing,\n status: input.status ?? existing.status,\n data: input.data ? { ...existing.data, ...input.data } : existing.data,\n _fieldMeta: input._fieldMeta ?? existing._fieldMeta ?? {},\n updatedAt: now(),\n ...(((input.locale !== undefined ? input.locale : existing.locale) !== undefined) && { locale: input.locale !== undefined ? input.locale : existing.locale }),\n ...(((input.translationOf !== undefined ? input.translationOf : existing.translationOf) !== undefined) && { translationOf: input.translationOf !== undefined ? input.translationOf : existing.translationOf }),\n ...(() => {\n // null = clear, string = set, undefined = keep existing\n const pa = input.publishAt === null ? undefined : (input.publishAt !== undefined ? input.publishAt : existing.publishAt);\n return pa !== undefined ? { publishAt: pa } : {};\n })(),\n };\n\n if (input.slug && input.slug !== existing.slug) {\n unlinkSync(this.documentPath(collection, existing.slug));\n updated.slug = input.slug;\n }\n\n writeFileSync(this.documentPath(collection, updated.slug), JSON.stringify(updated, null, 2), 'utf-8');\n return updated;\n }\n\n async delete(collection: string, id: string): Promise<void> {\n const doc = await this.findById(collection, id);\n if (!doc) throw new Error(`Document ${id} not found in collection ${collection}`);\n const path = this.documentPath(collection, doc.slug);\n if (existsSync(path)) unlinkSync(path);\n }\n\n async close(): Promise<void> {\n // No-op for filesystem adapter\n }\n}\n","import { nanoid } from 'nanoid';\n\nexport function generateId(): string {\n return nanoid(21);\n}\n","export function generateSlug(input: string): string {\n return input\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 200);\n}\n","export function now(): string {\n return new Date().toISOString();\n}\n\nexport function formatDate(date: string, locale = 'en-US'): string {\n return new Date(date).toLocaleDateString(locale, {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n });\n}\n","import Database from 'better-sqlite3';\nimport { drizzle } from 'drizzle-orm/better-sqlite3';\nimport { eq, and, desc, asc, sql } from 'drizzle-orm';\nimport { sqliteTable, text } from 'drizzle-orm/sqlite-core';\nimport type { StorageAdapter, Document, DocumentInput, QueryOptions, QueryResult, DocumentStatus, DocumentFieldMeta } from '../types.js';\nimport { generateId } from '../../utils/id.js';\nimport { generateSlug } from '../../utils/slug.js';\nimport { now } from '../../utils/date.js';\n\nconst documentsTable = sqliteTable('documents', {\n id: text('id').primaryKey(),\n slug: text('slug').notNull(),\n collection: text('collection').notNull(),\n status: text('status').notNull().default('draft'),\n data: text('data').notNull().default('{}'),\n fieldMeta: text('field_meta').notNull().default('{}'),\n createdAt: text('created_at').notNull(),\n updatedAt: text('updated_at').notNull(),\n});\n\nexport class SqliteStorageAdapter implements StorageAdapter {\n private dbPath: string;\n private sqlite!: ReturnType<typeof Database>;\n private db!: ReturnType<typeof drizzle>;\n\n constructor(dbPath: string = '.cms/content.db') {\n this.dbPath = dbPath;\n }\n\n async initialize(): Promise<void> {\n const { mkdirSync, existsSync } = await import('node:fs');\n const { dirname } = await import('node:path');\n const dir = dirname(this.dbPath);\n if (dir && !existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n this.sqlite = new Database(this.dbPath);\n this.db = drizzle(this.sqlite);\n }\n\n async migrate(_collections: string[]): Promise<void> {\n this.sqlite.exec(`\n CREATE TABLE IF NOT EXISTS documents (\n id TEXT PRIMARY KEY,\n slug TEXT NOT NULL,\n collection TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'draft',\n data TEXT NOT NULL DEFAULT '{}',\n field_meta TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n UNIQUE(collection, slug)\n );\n CREATE INDEX IF NOT EXISTS idx_documents_collection ON documents(collection);\n CREATE INDEX IF NOT EXISTS idx_documents_status ON documents(status);\n CREATE INDEX IF NOT EXISTS idx_documents_collection_slug ON documents(collection, slug);\n `);\n // Add field_meta column to existing databases that pre-date this migration\n try {\n this.sqlite.exec(`ALTER TABLE documents ADD COLUMN field_meta TEXT NOT NULL DEFAULT '{}'`);\n } catch {\n // Column already exists — safe to ignore\n }\n }\n\n private rowToDocument(row: typeof documentsTable.$inferSelect): Document {\n return {\n id: row.id,\n slug: row.slug,\n collection: row.collection,\n status: row.status as DocumentStatus,\n data: JSON.parse(row.data) as Record<string, unknown>,\n _fieldMeta: JSON.parse(row.fieldMeta ?? '{}') as DocumentFieldMeta,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n };\n }\n\n async create(collection: string, input: DocumentInput): Promise<Document> {\n const id = generateId();\n const slug = input.slug ?? generateSlug(String(input.data['title'] ?? id));\n const timestamp = now();\n\n const row = {\n id,\n slug,\n collection,\n status: input.status ?? 'draft',\n data: JSON.stringify(input.data),\n fieldMeta: JSON.stringify(input._fieldMeta ?? {}),\n createdAt: timestamp,\n updatedAt: timestamp,\n };\n\n await this.db.insert(documentsTable).values(row);\n return this.rowToDocument(row);\n }\n\n async findById(_collection: string, id: string): Promise<Document | null> {\n const rows = await this.db\n .select()\n .from(documentsTable)\n .where(eq(documentsTable.id, id))\n .limit(1);\n return rows[0] ? this.rowToDocument(rows[0]) : null;\n }\n\n async findBySlug(collection: string, slug: string): Promise<Document | null> {\n const rows = await this.db\n .select()\n .from(documentsTable)\n .where(and(\n eq(documentsTable.collection, collection),\n eq(documentsTable.slug, slug),\n ))\n .limit(1);\n return rows[0] ? this.rowToDocument(rows[0]) : null;\n }\n\n async findMany(collection: string, options: QueryOptions = {}): Promise<QueryResult> {\n const conditions = [eq(documentsTable.collection, collection)];\n\n if (options.status) {\n conditions.push(eq(documentsTable.status, options.status));\n }\n\n // Tags: AND logic — each tag must exist in the JSON array\n if (options.tags && options.tags.length > 0) {\n for (const tag of options.tags) {\n conditions.push(\n sql`EXISTS (\n SELECT 1 FROM json_each(json_extract(${documentsTable.data}, '$.tags'))\n WHERE value = ${tag}\n )`,\n );\n }\n }\n\n const whereClause = conditions.length > 1\n ? and(...conditions)!\n : conditions[0]!;\n\n // orderBy: support document-level keys and data.* fields via json_extract\n const orderBy = options.orderBy ?? 'createdAt';\n const isAsc = options.order === 'asc';\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let orderExpr: any;\n switch (orderBy) {\n case 'slug': orderExpr = isAsc ? asc(documentsTable.slug) : desc(documentsTable.slug); break;\n case 'status': orderExpr = isAsc ? asc(documentsTable.status) : desc(documentsTable.status); break;\n case 'updatedAt': orderExpr = isAsc ? asc(documentsTable.updatedAt) : desc(documentsTable.updatedAt); break;\n case 'createdAt': orderExpr = isAsc ? asc(documentsTable.createdAt) : desc(documentsTable.createdAt); break;\n default:\n // data.* field: use json_extract with CAST for numeric support\n orderExpr = isAsc\n ? asc(sql`CAST(json_extract(${documentsTable.data}, ${`$.${orderBy}`}) AS REAL)`)\n : desc(sql`CAST(json_extract(${documentsTable.data}, ${`$.${orderBy}`}) AS REAL)`);\n }\n\n const rows = await this.db\n .select()\n .from(documentsTable)\n .where(whereClause)\n .orderBy(orderExpr)\n .limit(options.limit ?? 1000)\n .offset(options.offset ?? 0);\n\n const totalRows = await this.db\n .select({ count: sql<number>`count(*)` })\n .from(documentsTable)\n .where(whereClause);\n\n return {\n documents: rows.map(r => this.rowToDocument(r)),\n total: Number(totalRows[0]?.count ?? 0),\n };\n }\n\n async update(collection: string, id: string, input: Partial<DocumentInput>): Promise<Document> {\n const existing = await this.findById(collection, id);\n if (!existing) throw new Error(`Document ${id} not found in collection ${collection}`);\n\n const updatedData = input.data ? { ...existing.data, ...input.data } : existing.data;\n const updatedFieldMeta = input._fieldMeta ?? existing._fieldMeta ?? {};\n const timestamp = now();\n\n await this.db\n .update(documentsTable)\n .set({\n slug: input.slug ?? existing.slug,\n status: input.status ?? existing.status,\n data: JSON.stringify(updatedData),\n fieldMeta: JSON.stringify(updatedFieldMeta),\n updatedAt: timestamp,\n })\n .where(eq(documentsTable.id, id));\n\n return {\n ...existing,\n slug: input.slug ?? existing.slug,\n status: input.status ?? existing.status,\n data: updatedData,\n _fieldMeta: updatedFieldMeta,\n updatedAt: timestamp,\n };\n }\n\n async delete(_collection: string, id: string): Promise<void> {\n await this.db.delete(documentsTable).where(eq(documentsTable.id, id));\n }\n\n async close(): Promise<void> {\n this.sqlite.close();\n }\n}\n","import type { StorageAdapter, Document, DocumentInput, QueryOptions, QueryResult } from '../types.js';\nimport { generateId } from '../../utils/id.js';\nimport { generateSlug } from '../../utils/slug.js';\nimport { now } from '../../utils/date.js';\n\nexport interface GitHubAdapterConfig {\n owner: string;\n repo: string;\n branch?: string;\n contentDir?: string;\n token: string;\n}\n\ninterface GitHubFileResponse {\n content: string;\n sha: string;\n name: string;\n path: string;\n type: string;\n}\n\ntype GitHubDirEntry = {\n name: string;\n type: string;\n sha: string;\n};\n\nexport class GitHubStorageAdapter implements StorageAdapter {\n private owner: string;\n private repo: string;\n private branch: string;\n private contentDir: string;\n private token: string;\n private baseUrl = 'https://api.github.com';\n\n /** Cache of path → SHA for files we've fetched or written */\n private shaCache = new Map<string, string>();\n\n constructor(config: GitHubAdapterConfig) {\n this.owner = config.owner;\n this.repo = config.repo;\n this.branch = config.branch ?? 'main';\n this.contentDir = config.contentDir ?? 'content';\n this.token = config.token;\n }\n\n // ── helpers ──────────────────────────────────────────────────────────────\n\n private headers(): Record<string, string> {\n return {\n Authorization: `Bearer ${this.token}`,\n Accept: 'application/vnd.github+json',\n 'X-GitHub-Api-Version': '2022-11-28',\n 'Content-Type': 'application/json',\n };\n }\n\n private filePath(collection: string, slug: string): string {\n return `${this.contentDir}/${collection}/${slug}.json`;\n }\n\n private dirPath(collection: string): string {\n return `${this.contentDir}/${collection}`;\n }\n\n private encode(content: string): string {\n return Buffer.from(content, 'utf-8').toString('base64');\n }\n\n private decode(b64: string): string {\n // GitHub wraps base64 with newlines — strip them\n return Buffer.from(b64.replace(/\\n/g, ''), 'base64').toString('utf-8');\n }\n\n private repoUrl(path: string): string {\n return `${this.baseUrl}/repos/${this.owner}/${this.repo}/contents/${path}`;\n }\n\n // ── low-level API calls ──────────────────────────────────────────────────\n\n private async getFile(path: string): Promise<GitHubFileResponse | null> {\n const url = `${this.repoUrl(path)}?ref=${this.branch}`;\n const res = await fetch(url, { headers: this.headers() });\n\n if (res.status === 404) return null;\n if (res.status === 401) throw new Error(`GitHub: bad token or no access to ${this.owner}/${this.repo}`);\n if (!res.ok) throw new Error(`GitHub GET ${path} failed: ${res.status} ${res.statusText}`);\n\n const data = (await res.json()) as GitHubFileResponse;\n this.shaCache.set(path, data.sha);\n return data;\n }\n\n private async putFile(path: string, content: string, message: string): Promise<void> {\n const sha = this.shaCache.get(path);\n const body: Record<string, unknown> = {\n message,\n content: this.encode(content),\n branch: this.branch,\n };\n if (sha) body['sha'] = sha;\n\n const res = await fetch(this.repoUrl(path), {\n method: 'PUT',\n headers: this.headers(),\n body: JSON.stringify(body),\n });\n\n if (res.status === 409) throw new Error(`GitHub: SHA conflict writing ${path} — please retry`);\n if (res.status === 401) throw new Error(`GitHub: bad token or no access to ${this.owner}/${this.repo}`);\n if (!res.ok) throw new Error(`GitHub PUT ${path} failed: ${res.status} ${res.statusText}`);\n\n const data = (await res.json()) as { content: { sha: string } };\n if (data.content?.sha) {\n this.shaCache.set(path, data.content.sha);\n }\n }\n\n private async deleteFile(path: string, message: string): Promise<void> {\n let sha = this.shaCache.get(path);\n if (!sha) {\n const file = await this.getFile(path);\n if (!file) throw new Error(`GitHub: file not found: ${path}`);\n sha = file.sha;\n }\n\n const res = await fetch(this.repoUrl(path), {\n method: 'DELETE',\n headers: this.headers(),\n body: JSON.stringify({ message, sha, branch: this.branch }),\n });\n\n if (res.status === 404) throw new Error(`GitHub: file not found: ${path}`);\n if (res.status === 401) throw new Error(`GitHub: bad token or no access to ${this.owner}/${this.repo}`);\n if (!res.ok) throw new Error(`GitHub DELETE ${path} failed: ${res.status} ${res.statusText}`);\n\n this.shaCache.delete(path);\n }\n\n private async listDir(collection: string): Promise<GitHubDirEntry[]> {\n const path = this.dirPath(collection);\n const url = `${this.repoUrl(path)}?ref=${this.branch}`;\n const res = await fetch(url, { headers: this.headers() });\n\n if (res.status === 404) return [];\n if (res.status === 401) throw new Error(`GitHub: bad token or no access to ${this.owner}/${this.repo}`);\n if (!res.ok) throw new Error(`GitHub LIST ${path} failed: ${res.status} ${res.statusText}`);\n\n const data = (await res.json()) as GitHubDirEntry[];\n return Array.isArray(data) ? data : [];\n }\n\n // ── document helpers ──────────────────────────────────────────────────────\n\n private async fetchDocument(collection: string, slug: string): Promise<Document | null> {\n const path = this.filePath(collection, slug);\n const file = await this.getFile(path);\n if (!file) return null;\n try {\n const doc = JSON.parse(this.decode(file.content)) as Document;\n return { ...doc, _fieldMeta: doc._fieldMeta ?? {} };\n } catch {\n return null;\n }\n }\n\n // ── StorageAdapter implementation ─────────────────────────────────────────\n\n async initialize(): Promise<void> {\n // Verify token and repo access with a lightweight call\n const url = `${this.baseUrl}/repos/${this.owner}/${this.repo}`;\n const res = await fetch(url, { headers: this.headers() });\n if (res.status === 401) throw new Error(`GitHub: bad token — cannot access ${this.owner}/${this.repo}`);\n if (res.status === 404) throw new Error(`GitHub: repo not found: ${this.owner}/${this.repo}`);\n if (!res.ok) throw new Error(`GitHub: repo access check failed: ${res.status} ${res.statusText}`);\n }\n\n async migrate(_collections: string[]): Promise<void> {\n // No-op: GitHub doesn't need schema migration\n }\n\n async create(collection: string, input: DocumentInput): Promise<Document> {\n const id = generateId();\n const slug = input.slug ?? generateSlug(String(input.data['title'] ?? id));\n const timestamp = now();\n\n const doc: Document = {\n id,\n slug,\n collection,\n status: input.status ?? 'draft',\n data: input.data,\n _fieldMeta: input._fieldMeta ?? {},\n createdAt: timestamp,\n updatedAt: timestamp,\n };\n\n const path = this.filePath(collection, slug);\n await this.putFile(path, JSON.stringify(doc, null, 2), `cms: create ${collection}/${slug}`);\n return doc;\n }\n\n async findById(collection: string, id: string): Promise<Document | null> {\n const entries = await this.listDir(collection);\n const jsonFiles = entries.filter(e => e.type === 'file' && e.name.endsWith('.json'));\n\n for (const entry of jsonFiles) {\n const slug = entry.name.replace('.json', '');\n const doc = await this.fetchDocument(collection, slug);\n if (doc?.id === id) return doc;\n }\n return null;\n }\n\n async findBySlug(collection: string, slug: string): Promise<Document | null> {\n return this.fetchDocument(collection, slug);\n }\n\n async findMany(collection: string, options: QueryOptions = {}): Promise<QueryResult> {\n const entries = await this.listDir(collection);\n const jsonFiles = entries.filter(e => e.type === 'file' && e.name.endsWith('.json'));\n\n let documents: Document[] = [];\n\n for (const entry of jsonFiles) {\n const slug = entry.name.replace('.json', '');\n const doc = await this.fetchDocument(collection, slug);\n if (doc) documents.push(doc);\n }\n\n // Status filter\n if (options.status) {\n documents = documents.filter(d => d.status === options.status);\n }\n\n // Tags filter (AND logic)\n if (options.tags && options.tags.length > 0) {\n documents = documents.filter(d => {\n const docTags = d.data['tags'];\n if (!Array.isArray(docTags)) return false;\n return options.tags!.every(tag => docTags.includes(tag));\n });\n }\n\n // Sort\n const orderBy = options.orderBy ?? 'createdAt';\n const order = options.order ?? 'desc';\n const DOC_KEYS = new Set<string>(['id', 'slug', 'collection', 'status', 'createdAt', 'updatedAt']);\n documents.sort((a, b) => {\n const getVal = (doc: Document): string => {\n if (DOC_KEYS.has(orderBy)) return String(doc[orderBy as keyof Document] ?? '');\n return String(doc.data[orderBy] ?? '');\n };\n const aVal = getVal(a);\n const bVal = getVal(b);\n const aNum = Number(aVal);\n const bNum = Number(bVal);\n if (!isNaN(aNum) && !isNaN(bNum)) {\n return order === 'asc' ? aNum - bNum : bNum - aNum;\n }\n return order === 'asc' ? aVal.localeCompare(bVal) : bVal.localeCompare(aVal);\n });\n\n const total = documents.length;\n const offset = options.offset ?? 0;\n const limit = options.limit ?? total;\n documents = documents.slice(offset, offset + limit);\n\n return { documents, total };\n }\n\n async update(collection: string, id: string, input: Partial<DocumentInput>): Promise<Document> {\n const existing = await this.findById(collection, id);\n if (!existing) throw new Error(`Document ${id} not found in collection ${collection}`);\n\n const updated: Document = {\n ...existing,\n status: input.status ?? existing.status,\n data: input.data ? { ...existing.data, ...input.data } : existing.data,\n _fieldMeta: input._fieldMeta ?? existing._fieldMeta ?? {},\n updatedAt: now(),\n };\n\n if (input.slug && input.slug !== existing.slug) {\n // Delete old file, create new one\n await this.deleteFile(\n this.filePath(collection, existing.slug),\n `cms: rename ${collection}/${existing.slug} → ${input.slug}`,\n );\n updated.slug = input.slug;\n }\n\n const path = this.filePath(collection, updated.slug);\n await this.putFile(path, JSON.stringify(updated, null, 2), `cms: update ${collection}/${updated.slug}`);\n return updated;\n }\n\n async delete(collection: string, id: string): Promise<void> {\n const doc = await this.findById(collection, id);\n if (!doc) throw new Error(`Document ${id} not found in collection ${collection}`);\n await this.deleteFile(\n this.filePath(collection, doc.slug),\n `cms: delete ${collection}/${doc.slug}`,\n );\n }\n\n async close(): Promise<void> {\n // No-op for GitHub adapter\n }\n}\n","import { now } from '../utils/date.js';\nimport type { DocumentFieldMeta, FieldMeta, WriteContext } from '../storage/types.js';\n\nexport function isFieldLocked(meta: DocumentFieldMeta, fieldPath: string): boolean {\n return !!meta[fieldPath]?.lockedBy;\n}\n\nexport function getLockedFields(meta: DocumentFieldMeta): string[] {\n return Object.keys(meta).filter(k => !!meta[k]?.lockedBy);\n}\n\nexport function filterUnlockedFields(meta: DocumentFieldMeta, fieldPaths: string[]): string[] {\n return fieldPaths.filter(f => !isFieldLocked(meta, f));\n}\n\nexport interface FieldMetaChanges {\n filteredData: Record<string, unknown>;\n updatedMeta: DocumentFieldMeta;\n skippedFields: string[];\n}\n\n/**\n * Computes which fields to write and how to update _fieldMeta based on the WriteContext.\n *\n * Rules:\n * - actor='ai' + field locked → skip field (AI cannot overwrite human edits)\n * - actor='user' + field was AI-generated → write + auto-lock\n * - actor='user' + field not AI-generated → write, no meta change\n * - actor='ai' + field unlocked → write + mark as aiGenerated\n * - actor='import' → write + lock with reason 'import'\n */\nexport function computeFieldMetaChanges(\n oldData: Record<string, unknown>,\n newData: Record<string, unknown>,\n existingMeta: DocumentFieldMeta,\n context: WriteContext,\n): FieldMetaChanges {\n const timestamp = now();\n const updatedMeta: DocumentFieldMeta = { ...existingMeta };\n const filteredData: Record<string, unknown> = {};\n const skippedFields: string[] = [];\n\n for (const [field, value] of Object.entries(newData)) {\n const hasChanged = JSON.stringify(oldData[field]) !== JSON.stringify(value);\n const fieldMeta = updatedMeta[field] ?? {};\n const isLocked = !!fieldMeta.lockedBy;\n\n if (!hasChanged) {\n // No change — pass through without touching meta\n filteredData[field] = value;\n continue;\n }\n\n if (context.actor === 'ai' && isLocked) {\n // AI cannot overwrite a locked field\n skippedFields.push(field);\n } else if (context.actor === 'user') {\n filteredData[field] = value;\n if (fieldMeta.aiGenerated) {\n // User is editing an AI-generated field → auto-lock\n const locked: Partial<FieldMeta> = {\n ...fieldMeta,\n lockedBy: 'user',\n lockedAt: timestamp,\n reason: 'user-edit',\n };\n if (context.userId !== undefined) locked.userId = context.userId;\n updatedMeta[field] = locked;\n }\n // No meta change for fields that were never AI-generated\n } else if (context.actor === 'ai') {\n // AI writing to an unlocked field → mark as AI-generated\n // We build a clean meta without lock fields (omit them rather than set to undefined)\n const aiMeta: Partial<FieldMeta> = {\n aiGenerated: true,\n aiGeneratedAt: timestamp,\n };\n if (context.aiModel !== undefined) aiMeta.aiModel = context.aiModel;\n updatedMeta[field] = aiMeta;\n filteredData[field] = value;\n } else if (context.actor === 'import') {\n filteredData[field] = value;\n const importMeta: Partial<FieldMeta> = {\n ...fieldMeta,\n lockedBy: 'import',\n lockedAt: timestamp,\n reason: 'import',\n };\n if (context.userId !== undefined) importMeta.userId = context.userId;\n updatedMeta[field] = importMeta;\n }\n }\n\n return { filteredData, updatedMeta, skippedFields };\n}\n\n/**\n * Builds _fieldMeta for a newly created document.\n * All fields are marked as AI-generated when actor='ai'.\n */\nexport function buildInitialFieldMeta(\n data: Record<string, unknown>,\n context: WriteContext,\n): DocumentFieldMeta {\n if (context.actor !== 'ai') return {};\n\n const timestamp = now();\n const meta: DocumentFieldMeta = {};\n for (const field of Object.keys(data)) {\n const fieldMeta: Partial<FieldMeta> = {\n aiGenerated: true,\n aiGeneratedAt: timestamp,\n };\n if (context.aiModel !== undefined) fieldMeta.aiModel = context.aiModel;\n meta[field] = fieldMeta;\n }\n return meta;\n}\n","import type { StorageAdapter, Document, DocumentInput, QueryOptions, QueryResult, WriteContext, SearchOptions, SearchResult } from '../storage/types.js';\nimport type { ContentHooks } from './hooks.js';\nimport type { CmsConfig } from '../schema/types.js';\nimport { computeFieldMetaChanges, buildInitialFieldMeta } from './field-meta.js';\n\nconst DEFAULT_CONTEXT: WriteContext = { actor: 'user' };\n\nexport class ContentService {\n constructor(\n private storage: StorageAdapter,\n private config: CmsConfig,\n private hooks: ContentHooks = {},\n ) {}\n\n private getCollection(name: string) {\n const col = this.config.collections.find(c => c.name === name);\n if (!col) throw new Error(`Collection \"${name}\" not found in config`);\n return col;\n }\n\n async create(collection: string, input: DocumentInput, context: WriteContext = DEFAULT_CONTEXT): Promise<Document> {\n this.getCollection(collection);\n\n // Build initial _fieldMeta for AI-generated content\n const fieldMeta = buildInitialFieldMeta(input.data, context);\n let processedInput: DocumentInput = { ...input, _fieldMeta: { ...fieldMeta, ...input._fieldMeta } };\n\n if (this.hooks.beforeCreate) {\n processedInput = await this.hooks.beforeCreate(collection, processedInput, context);\n }\n\n const doc = await this.storage.create(collection, processedInput);\n\n if (this.hooks.afterCreate) {\n await this.hooks.afterCreate(collection, doc, context);\n }\n\n return doc;\n }\n\n async findById(collection: string, id: string): Promise<Document | null> {\n this.getCollection(collection);\n return this.storage.findById(collection, id);\n }\n\n async findBySlug(collection: string, slug: string): Promise<Document | null> {\n this.getCollection(collection);\n return this.storage.findBySlug(collection, slug);\n }\n\n async findMany(collection: string, options?: QueryOptions): Promise<QueryResult> {\n this.getCollection(collection);\n return this.storage.findMany(collection, options);\n }\n\n /**\n * Find all documents across one or more collections that have the given tag.\n * If no collections are specified, searches all configured collections.\n */\n async findByTag(\n tag: string,\n collections?: string[],\n options?: Omit<QueryOptions, 'tags'>,\n ): Promise<QueryResult> {\n const targets = collections ?? this.config.collections.map(c => c.name);\n const results = await Promise.all(\n targets.map(col =>\n this.storage.findMany(col, { ...options, tags: [tag] }).catch(() => ({ documents: [], total: 0 })),\n ),\n );\n const documents = results.flatMap(r => r.documents);\n return { documents, total: documents.length };\n }\n\n async update(\n collection: string,\n id: string,\n input: Partial<DocumentInput>,\n context: WriteContext = DEFAULT_CONTEXT,\n ): Promise<Document> {\n this.getCollection(collection);\n\n let processedInput = input;\n if (this.hooks.beforeUpdate) {\n processedInput = await this.hooks.beforeUpdate(collection, id, input, context);\n }\n\n // Apply field-level lock logic when data is being updated\n if (processedInput.data) {\n const existing = await this.storage.findById(collection, id);\n if (existing) {\n const { filteredData, updatedMeta } = computeFieldMetaChanges(\n existing.data,\n processedInput.data,\n existing._fieldMeta ?? {},\n context,\n );\n processedInput = {\n ...processedInput,\n data: filteredData,\n _fieldMeta: updatedMeta,\n };\n }\n }\n\n const doc = await this.storage.update(collection, id, processedInput);\n\n if (this.hooks.afterUpdate) {\n await this.hooks.afterUpdate(collection, doc, context);\n }\n\n return doc;\n }\n\n /**\n * Same as update() but also returns the list of fields that were skipped\n * because they were locked and the actor was 'ai'.\n */\n async updateWithContext(\n collection: string,\n id: string,\n input: Partial<DocumentInput>,\n context: WriteContext,\n ): Promise<{ document: Document; skippedFields: string[] }> {\n this.getCollection(collection);\n\n let processedInput = input;\n if (this.hooks.beforeUpdate) {\n processedInput = await this.hooks.beforeUpdate(collection, id, input, context);\n }\n\n let skippedFields: string[] = [];\n\n if (processedInput.data) {\n const existing = await this.storage.findById(collection, id);\n if (existing) {\n const changes = computeFieldMetaChanges(\n existing.data,\n processedInput.data,\n existing._fieldMeta ?? {},\n context,\n );\n skippedFields = changes.skippedFields;\n processedInput = {\n ...processedInput,\n data: changes.filteredData,\n _fieldMeta: changes.updatedMeta,\n };\n }\n }\n\n const doc = await this.storage.update(collection, id, processedInput);\n\n if (this.hooks.afterUpdate) {\n await this.hooks.afterUpdate(collection, doc, context);\n }\n\n return { document: doc, skippedFields };\n }\n\n /**\n * Publish all draft documents whose publishAt timestamp is in the past.\n * Called by the cron job every minute. Returns slugs of published documents.\n */\n async publishDue(collections?: string[]): Promise<{ collection: string; slug: string }[]> {\n const targets = collections ?? this.config.collections.map(c => c.name);\n const now = new Date();\n const published: { collection: string; slug: string }[] = [];\n\n for (const col of targets) {\n const { documents } = await this.storage.findMany(col, { status: 'draft' }).catch(() => ({ documents: [] }));\n for (const doc of documents) {\n if (!doc.publishAt) continue;\n if (new Date(doc.publishAt) > now) continue;\n await this.storage.update(col, doc.id, {\n status: 'published',\n publishAt: null, // clear the schedule\n });\n published.push({ collection: col, slug: doc.slug });\n }\n }\n return published;\n }\n\n /**\n * Full-text search across collections. Searches title, slug, excerpt, description and content.\n * Results are scored: exact title > slug match > prefix > excerpt > content body.\n */\n async search(query: string, options?: SearchOptions): Promise<SearchResult[]> {\n const q = query.trim().toLowerCase();\n if (!q) return [];\n\n const limit = options?.limit ?? 20;\n const targets = options?.collections\n ? this.config.collections.filter(c => options.collections!.includes(c.name))\n : this.config.collections.filter(c => c.name !== 'global');\n\n const results: SearchResult[] = [];\n\n for (const col of targets) {\n const queryOpts: QueryOptions = {};\n if (options?.status) queryOpts.status = options.status;\n const { documents } = await this.storage\n .findMany(col.name, queryOpts)\n .catch(() => ({ documents: [] as Document[] }));\n\n for (const doc of documents) {\n const title = String(doc.data['title'] ?? doc.data['name'] ?? doc.data['label'] ?? doc.slug).toLowerCase();\n const slug = doc.slug.toLowerCase();\n const excerpt = String(doc.data['excerpt'] ?? doc.data['description'] ?? '').toLowerCase();\n const rawContent = String(doc.data['content'] ?? '');\n const content = rawContent.replace(/<[^>]*>/g, ' ').replace(/\\s+/g, ' ').toLowerCase();\n\n let score = 0;\n if (title === q) score = 100;\n else if (slug === q) score = 80;\n else if (title.startsWith(q)) score = 50;\n else if (slug.startsWith(q)) score = 40;\n else if (title.includes(q)) score = 30;\n else if (excerpt.includes(q)) score = 20;\n else if (content.includes(q)) score = 10;\n\n if (score === 0) continue;\n\n const urlPrefix = (col as { urlPrefix?: string }).urlPrefix ?? '';\n const url = urlPrefix ? `${urlPrefix}/${doc.slug}` : `/${doc.slug}`;\n\n // Build excerpt: prefer excerpt field, fallback to stripped content\n const excerptText = String(doc.data['excerpt'] ?? doc.data['description'] ?? '');\n const snippetSource = excerptText || rawContent.replace(/<[^>]*>/g, ' ').replace(/\\s+/g, ' ').trim();\n const snippetMax = 160;\n const snippet = snippetSource.length > snippetMax\n ? snippetSource.slice(0, snippetMax) + '…'\n : snippetSource;\n\n results.push({\n collection: col.name,\n collectionLabel: col.label ?? col.name,\n slug: doc.slug,\n title: String(doc.data['title'] ?? doc.data['name'] ?? doc.data['label'] ?? doc.slug),\n excerpt: snippet,\n url,\n status: doc.status,\n score,\n });\n }\n }\n\n results.sort((a, b) => b.score - a.score || a.title.localeCompare(b.title));\n return results.slice(0, limit);\n }\n\n async delete(collection: string, id: string, context: WriteContext = DEFAULT_CONTEXT): Promise<void> {\n this.getCollection(collection);\n\n if (this.hooks.beforeDelete) {\n await this.hooks.beforeDelete(collection, id, context);\n }\n\n await this.storage.delete(collection, id);\n\n if (this.hooks.afterDelete) {\n await this.hooks.afterDelete(collection, id, context);\n }\n }\n}\n","import { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport { logger } from 'hono/logger';\nimport type { CmsConfig } from '../schema/types.js';\nimport type { StorageAdapter } from '../storage/types.js';\nimport { ContentService } from '../content/service.js';\nimport { createContentRoutes } from './routes/content.js';\nimport { createSchemaRoutes } from './routes/schema.js';\nimport { createManifestRoutes } from './routes/manifest.js';\n\nexport function createApiServer(config: CmsConfig, storage: StorageAdapter): Hono {\n const app = new Hono();\n const prefix = config.api?.prefix ?? '/api';\n const content = new ContentService(storage, config);\n\n app.use('*', cors());\n app.use('*', logger());\n\n app.route(`${prefix}/content`, createContentRoutes(content));\n app.route(`${prefix}/schema`, createSchemaRoutes(config));\n app.route(`${prefix}/manifest`, createManifestRoutes(config));\n\n app.get('/', (c) => c.json({\n name: '@webhouse/cms',\n version: '0.1.0',\n api: prefix,\n }));\n\n return app;\n}\n","import { Hono } from 'hono';\nimport type { ContentService } from '../../content/service.js';\nimport type { Document, DocumentFieldMeta } from '../../storage/types.js';\n\n/** Strip _fieldMeta from a document for standard GET responses */\nfunction stripFieldMeta(doc: Document): Omit<Document, '_fieldMeta'> {\n const { _fieldMeta: _ignored, ...rest } = doc;\n return rest;\n}\n\nexport function createContentRoutes(content: ContentService) {\n const app = new Hono();\n\n // List documents (no _fieldMeta in response)\n app.get('/:collection', async (c) => {\n const collection = c.req.param('collection');\n const status = c.req.query('status') as 'draft' | 'published' | 'archived' | undefined;\n const limit = c.req.query('limit') ? Number(c.req.query('limit')) : undefined;\n const offset = c.req.query('offset') ? Number(c.req.query('offset')) : undefined;\n\n try {\n const result = await content.findMany(collection, { status, limit, offset });\n return c.json({\n documents: result.documents.map(stripFieldMeta),\n total: result.total,\n });\n } catch (e) {\n return c.json({ error: String(e) }, 404);\n }\n });\n\n // --- Field meta endpoints (must come BEFORE /:collection/:slug to match correctly) ---\n\n // GET field meta for a document\n app.get('/:collection/:slug/_fieldMeta', async (c) => {\n const collection = c.req.param('collection');\n const slug = c.req.param('slug');\n try {\n const doc = await content.findBySlug(collection, slug);\n if (!doc) return c.json({ error: 'Not found' }, 404);\n return c.json(doc._fieldMeta ?? {});\n } catch (e) {\n return c.json({ error: String(e) }, 404);\n }\n });\n\n // Manual lock a single field\n app.put('/:collection/:slug/_fieldMeta/:fieldPath/lock', async (c) => {\n const collection = c.req.param('collection');\n const slug = c.req.param('slug');\n const fieldPath = c.req.param('fieldPath');\n try {\n const doc = await content.findBySlug(collection, slug);\n if (!doc) return c.json({ error: 'Not found' }, 404);\n\n const body = await c.req.json().catch(() => ({})) as { userId?: string; reason?: string };\n const updatedMeta: DocumentFieldMeta = {\n ...doc._fieldMeta,\n [fieldPath]: {\n ...(doc._fieldMeta?.[fieldPath] ?? {}),\n lockedBy: 'user',\n lockedAt: new Date().toISOString(),\n userId: body.userId,\n reason: body.reason ?? 'manual-lock',\n },\n };\n\n await content.update(collection, doc.id, { _fieldMeta: updatedMeta });\n return c.json(updatedMeta[fieldPath]);\n } catch (e) {\n return c.json({ error: String(e) }, 400);\n }\n });\n\n // Unlock a single field\n app.put('/:collection/:slug/_fieldMeta/:fieldPath/unlock', async (c) => {\n const collection = c.req.param('collection');\n const slug = c.req.param('slug');\n const fieldPath = c.req.param('fieldPath');\n try {\n const doc = await content.findBySlug(collection, slug);\n if (!doc) return c.json({ error: 'Not found' }, 404);\n\n const existing = doc._fieldMeta?.[fieldPath] ?? {};\n const updatedMeta: DocumentFieldMeta = {\n ...doc._fieldMeta,\n [fieldPath]: {\n ...existing,\n lockedBy: undefined,\n lockedAt: undefined,\n userId: undefined,\n reason: undefined,\n },\n };\n\n await content.update(collection, doc.id, { _fieldMeta: updatedMeta });\n return c.json(updatedMeta[fieldPath]);\n } catch (e) {\n return c.json({ error: String(e) }, 400);\n }\n });\n\n // Lock all AI-generated fields\n app.put('/:collection/:slug/_fieldMeta/lock-all', async (c) => {\n const collection = c.req.param('collection');\n const slug = c.req.param('slug');\n try {\n const doc = await content.findBySlug(collection, slug);\n if (!doc) return c.json({ error: 'Not found' }, 404);\n\n const body = await c.req.json().catch(() => ({})) as { userId?: string };\n const timestamp = new Date().toISOString();\n const updatedMeta: DocumentFieldMeta = {};\n\n for (const [field, meta] of Object.entries(doc._fieldMeta ?? {})) {\n updatedMeta[field] = meta?.aiGenerated\n ? { ...meta, lockedBy: 'user', lockedAt: timestamp, userId: body.userId, reason: 'manual-lock-all' }\n : meta;\n }\n\n await content.update(collection, doc.id, { _fieldMeta: updatedMeta });\n return c.json(updatedMeta);\n } catch (e) {\n return c.json({ error: String(e) }, 400);\n }\n });\n\n // Unlock all fields\n app.put('/:collection/:slug/_fieldMeta/unlock-all', async (c) => {\n const collection = c.req.param('collection');\n const slug = c.req.param('slug');\n try {\n const doc = await content.findBySlug(collection, slug);\n if (!doc) return c.json({ error: 'Not found' }, 404);\n\n const updatedMeta: DocumentFieldMeta = {};\n for (const [field, meta] of Object.entries(doc._fieldMeta ?? {})) {\n updatedMeta[field] = {\n ...meta,\n lockedBy: undefined,\n lockedAt: undefined,\n userId: undefined,\n reason: undefined,\n };\n }\n\n await content.update(collection, doc.id, { _fieldMeta: updatedMeta });\n return c.json(updatedMeta);\n } catch (e) {\n return c.json({ error: String(e) }, 400);\n }\n });\n\n // Get by slug (no _fieldMeta in response)\n app.get('/:collection/:slug', async (c) => {\n const collection = c.req.param('collection');\n const slug = c.req.param('slug');\n\n try {\n const doc = await content.findBySlug(collection, slug);\n if (!doc) return c.json({ error: 'Not found' }, 404);\n return c.json(stripFieldMeta(doc));\n } catch (e) {\n return c.json({ error: String(e) }, 404);\n }\n });\n\n // Create (actor: user)\n app.post('/:collection', async (c) => {\n const collection = c.req.param('collection');\n try {\n const body = await c.req.json() as { slug?: string; status?: 'draft' | 'published' | 'archived'; data: Record<string, unknown> };\n const doc = await content.create(collection, {\n slug: body.slug,\n status: body.status,\n data: body.data,\n }, { actor: 'user' });\n return c.json(stripFieldMeta(doc), 201);\n } catch (e) {\n return c.json({ error: String(e) }, 400);\n }\n });\n\n // Update (actor: user)\n app.put('/:collection/:slug', async (c) => {\n const collection = c.req.param('collection');\n const slug = c.req.param('slug');\n\n try {\n const existing = await content.findBySlug(collection, slug);\n if (!existing) return c.json({ error: 'Not found' }, 404);\n\n const body = await c.req.json() as { slug?: string; status?: 'draft' | 'published' | 'archived'; data?: Record<string, unknown> };\n const doc = await content.update(collection, existing.id, {\n slug: body.slug,\n status: body.status,\n data: body.data,\n }, { actor: 'user' });\n return c.json(stripFieldMeta(doc));\n } catch (e) {\n return c.json({ error: String(e) }, 400);\n }\n });\n\n // Delete\n app.delete('/:collection/:slug', async (c) => {\n const collection = c.req.param('collection');\n const slug = c.req.param('slug');\n\n try {\n const existing = await content.findBySlug(collection, slug);\n if (!existing) return c.json({ error: 'Not found' }, 404);\n await content.delete(collection, existing.id, { actor: 'user' });\n return c.json({ success: true });\n } catch (e) {\n return c.json({ error: String(e) }, 400);\n }\n });\n\n return app;\n}\n","import { Hono } from 'hono';\nimport type { CmsConfig } from '../../schema/types.js';\nimport { collectionToJsonSchema } from '../../schema/introspect.js';\n\nexport function createSchemaRoutes(config: CmsConfig) {\n const app = new Hono();\n\n app.get('/', (c) => {\n const schemas = config.collections.map(col => ({\n name: col.name,\n label: col.label ?? col.name,\n slug: col.slug ?? col.name,\n jsonSchema: collectionToJsonSchema(col),\n }));\n return c.json({ collections: schemas, blocks: config.blocks ?? [] });\n });\n\n app.get('/:collection', (c) => {\n const name = c.req.param('collection');\n const col = config.collections.find(col => col.name === name);\n if (!col) return c.json({ error: 'Collection not found' }, 404);\n return c.json({\n name: col.name,\n label: col.label ?? col.name,\n jsonSchema: collectionToJsonSchema(col),\n });\n });\n\n return app;\n}\n","import { Hono } from 'hono';\nimport type { CmsConfig } from '../../schema/types.js';\nimport { configToManifest } from '../../schema/introspect.js';\n\nexport function createManifestRoutes(config: CmsConfig) {\n const app = new Hono();\n\n app.get('/', (c) => {\n return c.json(configToManifest(config));\n });\n\n return app;\n}\n","import { join } from 'node:path';\nimport { writeFileSync, mkdirSync, existsSync, readdirSync, readFileSync } from 'node:fs';\nimport type { StorageAdapter } from '../storage/types.js';\nimport type { CmsConfig } from '../schema/types.js';\nimport { resolveSite } from './resolve.js';\nimport { renderSite } from './render.js';\nimport { writeOutput } from './output.js';\nimport { generateSitemap } from './sitemap.js';\nimport { applyAutolinks } from './autolink.js';\nimport { generateLlmsTxt } from './llms.js';\nimport { generateAiPlugin } from './ai-plugin.js';\n\nexport interface BuildOptions {\n outDir?: string;\n}\n\nexport interface BuildResult {\n pages: number;\n outDir: string;\n duration: number;\n}\n\nexport async function runBuild(\n config: CmsConfig,\n storage: StorageAdapter,\n options: BuildOptions = {},\n): Promise<BuildResult> {\n const start = Date.now();\n const outDir = options.outDir ?? config.build?.outDir ?? 'dist';\n\n // Phase 1: Resolve\n const context = await resolveSite(config, storage);\n\n // Phase 2: Render\n const pages = await renderSite(context);\n\n // Phase 3: Output\n writeOutput(pages, { outDir });\n\n // Phase 4: Sitemap\n const baseUrl = config.build?.baseUrl ?? 'https://example.com';\n const sitemap = generateSitemap(context, baseUrl);\n if (!existsSync(outDir)) mkdirSync(outDir, { recursive: true });\n writeFileSync(join(outDir, 'sitemap.xml'), sitemap, 'utf-8');\n\n // Phase 5: Autolinks — post-process all HTML files\n if (config.autolinks && config.autolinks.length > 0) {\n const htmlFiles = readdirSync(outDir)\n .filter(f => f.endsWith('.html'))\n .map(f => join(outDir, f));\n for (const file of htmlFiles) {\n const original = readFileSync(file, 'utf-8');\n const linked = applyAutolinks(original, config.autolinks);\n if (linked !== original) writeFileSync(file, linked, 'utf-8');\n }\n }\n\n // Phase 6: AI access files — llms.txt + .well-known/ai-plugin.json\n const llmsTxt = generateLlmsTxt(context, baseUrl);\n writeFileSync(join(outDir, 'llms.txt'), llmsTxt, 'utf-8');\n\n const wellKnownDir = join(outDir, '.well-known');\n if (!existsSync(wellKnownDir)) mkdirSync(wellKnownDir, { recursive: true });\n writeFileSync(join(wellKnownDir, 'ai-plugin.json'), generateAiPlugin(context, baseUrl), 'utf-8');\n\n return {\n pages: pages.length,\n outDir,\n duration: Date.now() - start,\n };\n}\n","import type { StorageAdapter, Document } from '../storage/types.js';\nimport type { CmsConfig } from '../schema/types.js';\n\nexport interface SiteContext {\n config: CmsConfig;\n collections: Record<string, Document[]>;\n}\n\nexport async function resolveSite(config: CmsConfig, storage: StorageAdapter): Promise<SiteContext> {\n const collections: Record<string, Document[]> = {};\n\n for (const collection of config.collections) {\n const { documents } = await storage.findMany(collection.name, {\n status: 'published',\n limit: 10000,\n });\n collections[collection.name] = documents;\n }\n\n return { config, collections };\n}\n","import { marked } from 'marked';\nimport { html, raw } from '../template/engine.js';\nimport { layoutTemplate } from '../template/builtins/layout.js';\nimport type { SiteContext } from './resolve.js';\nimport type { Document } from '../storage/types.js';\nimport { formatDate } from '../utils/date.js';\nimport { getDocumentUrl, getCollectionIndexUrl } from '../routing/resolver.js';\n\nexport interface RenderedPage {\n path: string;\n content: string;\n}\n\nfunction getSiteTitle(context: SiteContext): string {\n return String((context.config.build as Record<string, unknown> | undefined)?.['siteTitle'] ?? 'My Site');\n}\n\nasync function renderDocument(doc: Document, context: SiteContext): Promise<string> {\n const title = String(doc.data['title'] ?? doc.slug);\n const content = String(doc.data['content'] ?? doc.data['body'] ?? '');\n const excerpt = String(doc.data['excerpt'] ?? '');\n const date = doc.data['date'] ? formatDate(String(doc.data['date'])) : formatDate(doc.createdAt);\n\n const rendered = content ? await marked(content, { gfm: true }) : '';\n\n return html`\n<article>\n <header class=\"post-header\">\n <h1>${title}</h1>\n <p class=\"post-meta\">${date}</p>\n ${excerpt ? raw(html`<p class=\"excerpt\">${excerpt}</p>`) : ''}\n </header>\n <div class=\"prose\">\n ${raw(rendered)}\n </div>\n</article>`;\n}\n\nfunction renderCollectionIndex(\n collectionName: string,\n documents: Document[],\n context: SiteContext,\n allDocsMap: Map<string, Document>,\n): string {\n const collectionConfig = context.config.collections.find(c => c.name === collectionName);\n const label = collectionConfig?.label ?? collectionName;\n\n const cards = documents.map(doc => {\n const title = String(doc.data['title'] ?? doc.slug);\n const excerpt = String(doc.data['excerpt'] ?? '');\n const date = doc.data['date'] ? formatDate(String(doc.data['date'])) : formatDate(doc.createdAt);\n const href = collectionConfig\n ? getDocumentUrl(doc, collectionConfig, allDocsMap)\n : `/${collectionName}/${doc.slug}/`;\n return html`\n<article class=\"card\">\n <h2><a href=\"${href}\">${title}</a></h2>\n <p class=\"meta\">${date}</p>\n ${excerpt ? raw(html`<p class=\"excerpt\">${excerpt}</p>`) : ''}\n</article>`;\n }).join('\\n');\n\n return html`\n<section>\n <h1>${label}</h1>\n <div class=\"card-grid\">\n ${raw(cards)}\n </div>\n</section>`;\n}\n\nfunction renderHomePage(context: SiteContext, allDocsMap: Map<string, Document>): string {\n const siteTitle = getSiteTitle(context);\n const sections = Object.entries(context.collections).map(([name, docs]) => {\n const collectionConfig = context.config.collections.find(c => c.name === name);\n const label = collectionConfig?.label ?? name;\n if (docs.length === 0) return '';\n\n const items = docs.slice(0, 3).map(doc => {\n const title = String(doc.data['title'] ?? doc.slug);\n const href = collectionConfig\n ? getDocumentUrl(doc, collectionConfig, allDocsMap)\n : `/${name}/${doc.slug}/`;\n return html`<li><a href=\"${href}\">${title}</a></li>`;\n }).join('\\n');\n\n const indexUrl = collectionConfig\n ? getCollectionIndexUrl(collectionConfig)\n : `/${name}/`;\n\n return html`\n<section style=\"margin-bottom:2rem\">\n <h2>${label}</h2>\n <ul style=\"margin-top:1rem\">${raw(items)}</ul>\n <a href=\"${indexUrl}\" style=\"display:inline-block;margin-top:0.75rem\">View all ${label} →</a>\n</section>`;\n }).join('\\n');\n\n return html`\n<section class=\"hero\">\n <h1>${siteTitle}</h1>\n <p>Welcome to your CMS-powered site.</p>\n</section>\n<section>\n ${raw(sections)}\n</section>`;\n}\n\n/** Build a locale → absolute-URL map for all known translations of a document */\nfunction buildAlternates(\n doc: Document,\n collectionName: string,\n allDocs: Document[],\n collectionConfig: ReturnType<typeof Array.prototype.find> | undefined,\n allDocsMap: Map<string, Document>,\n baseUrl: string,\n): Record<string, string> {\n const base = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n const sourceSlug = doc.translationOf ?? doc.slug;\n const siblings = allDocs.filter(\n d => d.collection === collectionName && (d.slug === sourceSlug || d.translationOf === sourceSlug),\n );\n const alternates: Record<string, string> = {};\n for (const s of siblings) {\n if (!s.locale) continue;\n const url = collectionConfig\n ? getDocumentUrl(s, collectionConfig, allDocsMap)\n : `/${collectionName}/${s.slug}/`;\n alternates[s.locale] = `${base}${url}`;\n }\n return alternates;\n}\n\nexport async function renderSite(context: SiteContext): Promise<RenderedPage[]> {\n const pages: RenderedPage[] = [];\n const siteTitle = getSiteTitle(context);\n const baseUrl = context.config.build?.baseUrl ?? '/';\n\n // Build a global map of all documents for parent-child traversal\n const allDocsMap = new Map<string, Document>();\n for (const docs of Object.values(context.collections)) {\n for (const doc of docs) allDocsMap.set(doc.id, doc);\n }\n\n // Build nav links from all collections\n const nav = context.config.collections.map(col => ({\n label: col.label ?? col.name,\n href: getCollectionIndexUrl(col),\n }));\n const siteLang = context.config.defaultLocale ?? 'en';\n const siteContext = { title: siteTitle, baseUrl, nav, lang: siteLang };\n\n // Flat list of all documents for alternates lookup\n const allDocsList = Object.values(context.collections).flat();\n\n // Home page\n const homeContent = renderHomePage(context, allDocsMap);\n pages.push({\n path: 'index.html',\n content: layoutTemplate(homeContent, {\n site: siteContext,\n page: { title: 'Home' },\n }),\n });\n\n // Collection index + individual pages\n for (const [collectionName, documents] of Object.entries(context.collections)) {\n const collectionConfig = context.config.collections.find(c => c.name === collectionName);\n\n // Collection index path\n const indexUrl = collectionConfig\n ? getCollectionIndexUrl(collectionConfig)\n : `/${collectionName}/`;\n // Convert URL like /foo/ to foo/index.html\n const indexPath = `${indexUrl.replace(/^\\//, '')}index.html`;\n\n const indexContent = renderCollectionIndex(collectionName, documents, context, allDocsMap);\n pages.push({\n path: indexPath,\n content: layoutTemplate(indexContent, {\n site: siteContext,\n page: {\n title: collectionConfig?.label ?? collectionName,\n collection: collectionName,\n },\n }),\n });\n\n // Individual documents\n for (const doc of documents) {\n const docContent = await renderDocument(doc, context);\n const title = String(doc.data['title'] ?? doc.slug);\n const description = String(doc.data['excerpt'] ?? doc.data['description'] ?? '').slice(0, 160) || undefined;\n const seoData = doc.data['_seo'] as Record<string, unknown> | undefined;\n\n const docUrl = collectionConfig\n ? getDocumentUrl(doc, collectionConfig, allDocsMap)\n : `/${collectionName}/${doc.slug}/`;\n\n // Convert URL like /foo/bar/ to foo/bar/index.html\n const docPath = `${docUrl.replace(/^\\//, '')}index.html`;\n\n const canonicalBase = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n const canonicalUrl = `${canonicalBase}${docUrl}`;\n\n const docLang =\n doc.locale ??\n collectionConfig?.sourceLocale ??\n context.config.defaultLocale;\n\n const alternates = buildAlternates(\n doc, collectionName, allDocsList, collectionConfig, allDocsMap, baseUrl,\n );\n\n pages.push({\n path: docPath,\n content: layoutTemplate(docContent, {\n site: siteContext,\n page: {\n title: String(seoData?.['metaTitle'] ?? title),\n collection: collectionName,\n slug: doc.slug,\n description: String(seoData?.['metaDescription'] ?? description ?? ''),\n canonicalUrl,\n jsonLd: seoData?.['jsonLd'] as Record<string, unknown> | undefined,\n lang: docLang,\n alternates: Object.keys(alternates).length > 0 ? alternates : undefined,\n },\n }),\n });\n }\n }\n\n return pages;\n}\n","export interface SafeHtml {\n __html: string;\n}\n\nexport function raw(html: string): SafeHtml {\n return { __html: html };\n}\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nfunction processValue(value: unknown): string {\n if (value === null || value === undefined) return '';\n if (typeof value === 'object' && '__html' in (value as object)) {\n return (value as SafeHtml).__html;\n }\n return escapeHtml(String(value));\n}\n\nexport function html(strings: TemplateStringsArray, ...values: unknown[]): string {\n let result = '';\n for (let i = 0; i < strings.length; i++) {\n result += strings[i] ?? '';\n if (i < values.length) {\n result += processValue(values[i]);\n }\n }\n return result;\n}\n","import { html, raw } from '../engine.js';\nimport type { TemplateContext } from '../types.js';\n\nexport function layoutTemplate(content: string, context: TemplateContext): string {\n const pageTitle = context.page.title;\n const siteTitle = context.site.title;\n const description = context.page.description;\n const canonicalUrl = context.page.canonicalUrl;\n const jsonLd = context.page.jsonLd;\n const ogImage = context.page.ogImage;\n const lang = context.page.lang ?? context.site.lang ?? 'en';\n const alternates = context.page.alternates ?? {};\n\n return html`<!DOCTYPE html>\n<html lang=\"${lang}\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>${pageTitle} — ${siteTitle}</title>\n ${description ? raw(`<meta name=\"description\" content=\"${description}\">`) : ''}\n <meta property=\"og:title\" content=\"${pageTitle} — ${siteTitle}\">\n ${description ? raw(`<meta property=\"og:description\" content=\"${description}\">`) : ''}\n <meta property=\"og:type\" content=\"website\">\n ${ogImage ? raw(`<meta property=\"og:image\" content=\"${ogImage}\">`) : ''}\n ${canonicalUrl ? raw(`<link rel=\"canonical\" href=\"${canonicalUrl}\">`) : ''}\n ${raw(Object.entries(alternates).map(([l, u]) => `<link rel=\"alternate\" hreflang=\"${l}\" href=\"${u}\">`).join('\\n '))}\n ${jsonLd ? raw(`<script type=\"application/ld+json\">${JSON.stringify(jsonLd)}</script>`) : ''}\n <style>\n :root {\n --color-bg: #ffffff;\n --color-fg: #111827;\n --color-primary: #2563eb;\n --color-muted: #6b7280;\n --color-border: #e5e7eb;\n --font-sans: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n --font-mono: 'Courier New', monospace;\n --font-size-base: 1rem;\n --line-height-base: 1.7;\n --spacing-base: 1rem;\n --spacing-section: clamp(2rem, 5vw, 4rem);\n --max-width: 72rem;\n --radius: 0.5rem;\n }\n *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n body { font-family: var(--font-sans); background: var(--color-bg); color: var(--color-fg); font-size: var(--font-size-base); line-height: var(--line-height-base); }\n a { color: var(--color-primary); }\n img { max-width: 100%; height: auto; }\n .container { max-width: var(--max-width); margin: 0 auto; padding: 0 var(--spacing-base); }\n header { border-bottom: 1px solid var(--color-border); padding: 1rem 0; margin-bottom: 2rem; }\n header nav { display: flex; align-items: center; flex-wrap: wrap; position: relative; }\n header .site-title { font-weight: 700; font-size: 1.25rem; text-decoration: none; color: var(--color-fg); flex: 1; }\n .nav-toggle { display: none; }\n .nav-burger { display: flex; flex-direction: column; gap: 4px; cursor: pointer; padding: 0.5rem; margin: -0.5rem; }\n .nav-burger span { display: block; width: 20px; height: 2px; background: var(--color-fg); transition: transform 0.2s, opacity 0.2s; }\n .nav-links { display: none; width: 100%; flex-direction: column; gap: 0; padding-top: 0.75rem; }\n .nav-toggle:checked ~ .nav-links { display: flex; }\n .nav-toggle:checked ~ .nav-burger span:nth-child(1) { transform: rotate(45deg) translate(4px, 4px); }\n .nav-toggle:checked ~ .nav-burger span:nth-child(2) { opacity: 0; }\n .nav-toggle:checked ~ .nav-burger span:nth-child(3) { transform: rotate(-45deg) translate(4px, -4px); }\n header nav a.nav-link { text-decoration: none; color: var(--color-muted); font-size: 0.9375rem; transition: color 0.15s; padding: 0.75rem 0; display: block; }\n header nav a.nav-link:hover { color: var(--color-fg); }\n @media (min-width: 768px) {\n .nav-burger { display: none; }\n .nav-links { display: flex; width: auto; flex-direction: row; gap: 2rem; padding-top: 0; margin-left: 2rem; }\n header nav a.nav-link { padding: 0; display: inline; }\n }\n main { padding: var(--spacing-section) 0; }\n footer { border-top: 1px solid var(--color-border); padding: 1.5rem 0; margin-top: var(--spacing-section); color: var(--color-muted); font-size: 0.875rem; }\n .prose h1 { font-size: clamp(1.75rem, 4vw, 2.25rem); font-weight: 800; line-height: 1.2; margin-bottom: 1rem; }\n .prose h2 { font-size: clamp(1.25rem, 3vw, 1.5rem); font-weight: 700; margin: 2rem 0 0.75rem; }\n .prose h3 { font-size: clamp(1.1rem, 2.5vw, 1.25rem); font-weight: 600; margin: 1.5rem 0 0.5rem; }\n .prose p { margin-bottom: 1.25rem; }\n .prose pre { background: #1e293b; color: #e2e8f0; padding: 1rem; border-radius: var(--radius); overflow-x: auto; margin-bottom: 1.25rem; font-family: var(--font-mono); font-size: clamp(0.75rem, 1.5vw, 0.875rem); }\n .prose code { background: #f1f5f9; padding: 0.125rem 0.375rem; border-radius: 0.25rem; font-family: var(--font-mono); font-size: 0.875em; }\n .prose pre code { background: none; padding: 0; }\n .prose ul, .prose ol { padding-left: 1.5rem; margin-bottom: 1.25rem; }\n .prose li { margin-bottom: 0.375rem; }\n .prose blockquote { border-left: 4px solid var(--color-primary); padding-left: 1rem; margin: 1.5rem 0; color: var(--color-muted); }\n .prose img { border-radius: var(--radius); margin: 1.5rem 0; }\n .card-grid { display: grid; grid-template-columns: 1fr; gap: 1.25rem; }\n @media (min-width: 640px) {\n .card-grid { grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 1.5rem; }\n }\n .card { border: 1px solid var(--color-border); border-radius: var(--radius); padding: 1.5rem; transition: box-shadow 0.2s; }\n .card:hover { box-shadow: 0 4px 12px rgba(0,0,0,0.08); }\n .card h2 { font-size: 1.125rem; font-weight: 600; margin-bottom: 0.5rem; }\n .card h2 a { text-decoration: none; color: var(--color-fg); }\n .card h2 a:hover { color: var(--color-primary); }\n .card .meta { color: var(--color-muted); font-size: 0.875rem; margin-bottom: 0.75rem; }\n .card .excerpt { color: var(--color-muted); font-size: 0.9375rem; }\n .hero { padding: var(--spacing-section) 0; text-align: center; }\n .hero h1 { font-size: clamp(2rem, 6vw, 3rem); font-weight: 800; margin-bottom: 1rem; }\n .hero p { font-size: clamp(1rem, 2.5vw, 1.25rem); color: var(--color-muted); max-width: 42rem; margin: 0 auto 2rem; }\n .btn { display: inline-block; padding: 0.75rem 1.5rem; background: var(--color-primary); color: #fff; border-radius: var(--radius); text-decoration: none; font-weight: 600; }\n .btn:hover { opacity: 0.9; }\n .post-header { margin-bottom: 2rem; }\n .post-header h1 { font-size: clamp(1.75rem, 5vw, 2.5rem); font-weight: 800; line-height: 1.2; margin-bottom: 0.5rem; }\n .post-meta { color: var(--color-muted); font-size: 0.875rem; }\n </style>\n</head>\n<body>\n <header>\n <div class=\"container\">\n <nav>\n <a href=\"/\" class=\"site-title\">${context.site.title}</a>\n <input type=\"checkbox\" id=\"nav-toggle\" class=\"nav-toggle\" aria-hidden=\"true\">\n <label for=\"nav-toggle\" class=\"nav-burger\" aria-label=\"Menu\"><span></span><span></span><span></span></label>\n <div class=\"nav-links\">\n ${raw((context.site.nav ?? []).map(item => html`<a href=\"${item.href}\" class=\"nav-link\">${item.label}</a>`).join('\\n'))}\n </div>\n </nav>\n </div>\n </header>\n <main>\n <div class=\"container\">\n ${raw(content)}\n </div>\n </main>\n <footer>\n <div class=\"container\">\n <p>Built with @webhouse/cms</p>\n </div>\n </footer>\n</body>\n</html>`;\n}\n","import type { Document } from '../storage/types.js';\nimport type { CollectionConfig } from '../schema/types.js';\n\nexport function getDocumentUrl(\n doc: Document,\n collection: CollectionConfig,\n allDocs?: Map<string, Document>,\n): string {\n // If slug contains '/', it's already a hierarchical path\n if (doc.slug.includes('/')) {\n return `/${doc.slug}/`;\n }\n\n // If collection has urlPrefix '/', skip collection name\n const prefix = collection.urlPrefix ?? `/${collection.name}`;\n const cleanPrefix = prefix.endsWith('/') ? prefix.slice(0, -1) : prefix;\n\n // If collection has parentField, traverse the parent chain\n if (collection.parentField && allDocs) {\n const parentId = doc.data[collection.parentField] as string | undefined;\n if (parentId) {\n const parentDoc = allDocs.get(parentId);\n if (parentDoc) {\n const parentUrl = getDocumentUrl(parentDoc, collection, allDocs);\n const parentPath = parentUrl.endsWith('/') ? parentUrl.slice(0, -1) : parentUrl;\n return `${parentPath}/${doc.slug}/`;\n }\n }\n }\n\n return `${cleanPrefix}/${doc.slug}/`;\n}\n\nexport function getCollectionIndexUrl(collection: CollectionConfig): string {\n const prefix = collection.urlPrefix ?? `/${collection.name}`;\n return prefix.endsWith('/') ? prefix : `${prefix}/`;\n}\n","import { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport type { RenderedPage } from './render.js';\n\nexport interface OutputOptions {\n outDir: string;\n}\n\nexport function writeOutput(pages: RenderedPage[], options: OutputOptions): void {\n const { outDir } = options;\n\n for (const page of pages) {\n const filePath = join(outDir, page.path);\n const dir = dirname(filePath);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n writeFileSync(filePath, page.content, 'utf-8');\n }\n}\n","import type { SiteContext } from './resolve.js';\nimport { getDocumentUrl, getCollectionIndexUrl } from '../routing/resolver.js';\n\nexport function generateSitemap(context: SiteContext, baseUrl: string): string {\n const urls: string[] = [];\n const base = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n\n const seen = new Set<string>();\n const addUrl = (url: string) => {\n if (!seen.has(url)) {\n seen.add(url);\n urls.push(url);\n }\n };\n\n addUrl(`${base}/`);\n\n for (const col of context.config.collections) {\n addUrl(`${base}${getCollectionIndexUrl(col)}`);\n const docs = context.collections[col.name] ?? [];\n const allDocsMap = new Map(docs.map(d => [d.id, d]));\n for (const doc of docs) {\n addUrl(`${base}${getDocumentUrl(doc, col, allDocsMap)}`);\n }\n }\n\n const entries = urls.map(url => ` <url><loc>${url}</loc></url>`).join('\\n');\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\\n${entries}\\n</urlset>`;\n}\n","import type { AutolinkConfig } from '../schema/types.js';\n\n/**\n * Apply automatic internal linking to an HTML string.\n *\n * Rules:\n * - Terms are matched case-sensitively\n * - Longest term wins (prevents \"cms\" from matching before \"@webhouse/cms\")\n * - First occurrence per page only\n * - Never links inside existing <a> tags\n * - Never links inside <h1>–<h6> headings\n * - External hrefs (starting with \"http\") get target=\"_blank\" rel=\"noopener noreferrer\"\n */\nexport function applyAutolinks(html: string, autolinks: AutolinkConfig[]): string {\n if (!autolinks || autolinks.length === 0) return html;\n\n // Sort longest term first to prevent partial matches consuming longer terms\n const sorted = [...autolinks].sort((a, b) => b.term.length - a.term.length);\n\n // Track which terms have already been linked on this page\n const used = new Set<string>();\n\n let result = '';\n let pos = 0;\n let inAnchor = 0;\n let inHeading = 0;\n\n // Match any HTML tag\n const tagRegex = /<(\\/?)([\\w-]+)[^>]*>/g;\n\n while (pos < html.length) {\n tagRegex.lastIndex = pos;\n const tagMatch = tagRegex.exec(html);\n\n if (!tagMatch) {\n // Remaining content is plain text\n const text = html.slice(pos);\n result += (inAnchor > 0 || inHeading > 0)\n ? text\n : replaceTerms(text, sorted, used);\n break;\n }\n\n // Process text before this tag\n const textBefore = html.slice(pos, tagMatch.index);\n result += (inAnchor > 0 || inHeading > 0)\n ? textBefore\n : replaceTerms(textBefore, sorted, used);\n\n // Track tag context\n const isClosing = tagMatch[1] === '/';\n const tagName = tagMatch[2].toLowerCase();\n\n if (tagName === 'a') {\n inAnchor += isClosing ? -1 : 1;\n } else if (/^h[1-6]$/.test(tagName)) {\n inHeading += isClosing ? -1 : 1;\n }\n\n result += tagMatch[0];\n pos = tagMatch.index + tagMatch[0].length;\n }\n\n return result;\n}\n\nfunction replaceTerms(text: string, autolinks: AutolinkConfig[], used: Set<string>): string {\n if (!text.trim()) return text;\n\n // Single-pass: collect all match positions on the ORIGINAL text first,\n // then replace from a single sweep — prevents href values from being re-matched.\n const matches: Array<{ start: number; end: number; link: AutolinkConfig }> = [];\n\n for (const link of autolinks) {\n if (used.has(link.term)) continue;\n // Find first occurrence that doesn't overlap an already-claimed match\n let searchFrom = 0;\n let idx = text.indexOf(link.term, searchFrom);\n while (idx !== -1) {\n const overlaps = matches.some(m => idx < m.end && idx + link.term.length > m.start);\n if (!overlaps) {\n matches.push({ start: idx, end: idx + link.term.length, link });\n break;\n }\n searchFrom = idx + 1;\n idx = text.indexOf(link.term, searchFrom);\n }\n }\n\n if (matches.length === 0) return text;\n\n // Sort by start position\n matches.sort((a, b) => a.start - b.start);\n\n let result = '';\n let pos = 0;\n for (const match of matches) {\n result += text.slice(pos, match.start);\n const isExternal = match.link.href.startsWith('http');\n const attrs = [\n `href=\"${match.link.href}\"`,\n match.link.title ? `title=\"${match.link.title}\"` : '',\n isExternal ? 'target=\"_blank\" rel=\"noopener noreferrer\"' : '',\n ].filter(Boolean).join(' ');\n result += `<a ${attrs}>${match.link.term}</a>`;\n used.add(match.link.term);\n pos = match.end;\n }\n result += text.slice(pos);\n return result;\n}\n","import type { SiteContext } from './resolve.js';\n\n/**\n * Generates /llms.txt content — a machine-readable index for AI agents.\n * Format follows the emerging llms.txt standard.\n */\nexport function generateLlmsTxt(context: SiteContext, baseUrl: string): string {\n const { config, collections } = context;\n const siteName = (config.build as Record<string, unknown> | undefined)?.['siteTitle'] as string | undefined ?? 'Site';\n const siteDesc = (config.build as Record<string, unknown> | undefined)?.['siteDescription'] as string | undefined;\n\n const lines: string[] = [];\n\n // Header\n lines.push(`# ${siteName}`);\n lines.push('');\n if (siteDesc) {\n lines.push(`> ${siteDesc}`);\n lines.push('');\n }\n\n // MCP section\n lines.push('## MCP Access');\n lines.push(`- MCP endpoint: ${baseUrl}/mcp`);\n lines.push('- Protocol: Model Context Protocol (SSE transport)');\n lines.push('- Auth: none required');\n lines.push(`- Docs: ${baseUrl}/mcp/info`);\n lines.push('');\n\n // Collections section\n lines.push('## Collections');\n for (const col of config.collections) {\n const docs = collections[col.name] ?? [];\n const label = col.label ?? col.name;\n lines.push(`- ${col.name}: ${label} (${docs.length} published documents)`);\n }\n lines.push('');\n\n // Recent content\n const allDocs = Object.entries(collections).flatMap(([col, docs]) =>\n docs.map(d => ({ col, doc: d })),\n );\n allDocs.sort((a, b) =>\n new Date(b.doc.updatedAt).getTime() - new Date(a.doc.updatedAt).getTime(),\n );\n const recent = allDocs.slice(0, 20);\n\n if (recent.length > 0) {\n lines.push('## Recent Content');\n for (const { col, doc } of recent) {\n const title = String(doc.data['title'] ?? doc.data['name'] ?? doc.slug);\n const urlPath = col === 'global' ? `/${doc.slug}` : `/${col}/${doc.slug}`;\n lines.push(`- [${title}](${baseUrl}${urlPath})`);\n }\n lines.push('');\n }\n\n // Locale info\n if (config.defaultLocale) {\n lines.push('## Locale');\n lines.push(`- Default language: ${config.defaultLocale}`);\n if (config.locales && config.locales.length > 1) {\n lines.push(`- Available: ${config.locales.join(', ')}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n","import type { SiteContext } from './resolve.js';\n\n/**\n * Generates /.well-known/ai-plugin.json — the OpenAI/Anthropic plugin manifest.\n * Advertises the MCP endpoint for AI agent discovery.\n */\nexport function generateAiPlugin(context: SiteContext, baseUrl: string): string {\n const { config } = context;\n const siteName = (config.build as Record<string, unknown> | undefined)?.['siteTitle'] as string | undefined ?? 'Site';\n const siteDesc = (config.build as Record<string, unknown> | undefined)?.['siteDescription'] as string | undefined ?? `Published content from ${siteName}`;\n\n const nameForModel = siteName\n .toLowerCase()\n .replace(/[^a-z0-9_]/g, '_')\n .replace(/_+/g, '_')\n .slice(0, 50);\n\n const manifest = {\n schema_version: 'v1',\n name_for_model: nameForModel,\n name_for_human: `${siteName} CMS`,\n description_for_model: `Access published content from ${siteName}. Use get_site_summary first to discover available collections, then list_collection or search_content to find relevant content, and get_page to retrieve full documents.`,\n description_for_human: siteDesc,\n auth: { type: 'none' },\n api: {\n type: 'mcp',\n url: `${baseUrl}/mcp`,\n },\n mcp: {\n endpoint: `${baseUrl}/mcp`,\n transport: 'sse',\n info: `${baseUrl}/mcp/info`,\n },\n logo_url: `${baseUrl}/favicon.ico`,\n contact_email: '',\n legal_info_url: '',\n };\n\n return JSON.stringify(manifest, null, 2);\n}\n"],"mappings":"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","names":["import_better_sqlite3","mkdirSync","existsSync","dirname","Database","now","import_hono","import_hono","col","import_hono","import_node_path","import_node_fs","html","import_node_fs","import_node_path","html","text"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/schema/define.ts","../src/schema/validate.ts","../src/schema/introspect.ts","../src/storage/filesystem/adapter.ts","../src/utils/id.ts","../src/utils/slug.ts","../src/utils/date.ts","../src/storage/sqlite/adapter.ts","../src/storage/github/adapter.ts","../src/content/field-meta.ts","../src/content/service.ts","../src/api/server.ts","../src/api/routes/content.ts","../src/api/routes/schema.ts","../src/api/routes/manifest.ts","../src/build/pipeline.ts","../src/build/resolve.ts","../src/build/render.ts","../src/template/engine.ts","../src/template/builtins/layout.ts","../src/routing/resolver.ts","../src/build/output.ts","../src/build/sitemap.ts","../src/build/autolink.ts","../src/build/llms.ts","../src/build/ai-plugin.ts"],"sourcesContent":["// Schema\nexport { defineConfig, defineCollection, defineBlock, defineField } from './schema/define.js';\nexport { validateConfig, safeValidateConfig } from './schema/validate.js';\nexport { collectionToJsonSchema, configToManifest } from './schema/introspect.js';\nexport type { CmsConfig, CollectionConfig, FieldConfig, BlockConfig, FieldType, BuildConfig, AutolinkConfig } from './schema/types.js';\n\n// Storage\nexport { FilesystemStorageAdapter } from './storage/filesystem/adapter.js';\nexport { SqliteStorageAdapter } from './storage/sqlite/adapter.js';\nexport { GitHubStorageAdapter } from './storage/github/adapter.js';\nexport type { GitHubAdapterConfig } from './storage/github/adapter.js';\nexport type { StorageAdapter, Document, DocumentInput, QueryOptions, QueryResult, DocumentStatus, FieldMeta, DocumentFieldMeta, WriteContext, SearchOptions, SearchResult } from './storage/types.js';\n\n// Content\nexport { ContentService } from './content/service.js';\nexport type { ContentHooks } from './content/hooks.js';\nexport { isFieldLocked, getLockedFields, filterUnlockedFields, computeFieldMetaChanges, buildInitialFieldMeta } from './content/field-meta.js';\nexport type { FieldMetaChanges } from './content/field-meta.js';\n\n// API\nexport { createApiServer } from './api/server.js';\n\n// Build\nexport { runBuild } from './build/pipeline.js';\nexport type { BuildResult, BuildOptions } from './build/pipeline.js';\n\n// Template\nexport { html, raw } from './template/engine.js';\nexport type { TemplateContext, BlockRenderer, PageTemplate, LayoutTemplate } from './template/types.js';\n\n// Utils\nexport { generateId } from './utils/id.js';\nexport { generateSlug } from './utils/slug.js';\nexport { now, formatDate } from './utils/date.js';\n\n// Main factory\nimport { validateConfig } from './schema/validate.js';\nimport { FilesystemStorageAdapter } from './storage/filesystem/adapter.js';\nimport { SqliteStorageAdapter } from './storage/sqlite/adapter.js';\nimport { GitHubStorageAdapter } from './storage/github/adapter.js';\nimport { ContentService } from './content/service.js';\nimport { createApiServer } from './api/server.js';\nimport { runBuild } from './build/pipeline.js';\nimport type { CmsConfig } from './schema/types.js';\nimport type { StorageAdapter } from './storage/types.js';\nimport type { BuildOptions } from './build/pipeline.js';\n\nexport async function createCms(config: CmsConfig, options?: { storage?: StorageAdapter }) {\n const validated = validateConfig(config);\n\n let storage: StorageAdapter;\n\n if (options?.storage) {\n storage = options.storage;\n } else if (validated.storage?.adapter === 'filesystem') {\n storage = new FilesystemStorageAdapter(validated.storage.filesystem?.contentDir);\n } else if (validated.storage?.adapter === 'github') {\n storage = new GitHubStorageAdapter(validated.storage.github!);\n } else {\n storage = new SqliteStorageAdapter(validated.storage?.sqlite?.path);\n }\n\n await storage.initialize();\n await storage.migrate(validated.collections.map(c => c.name));\n\n const content = new ContentService(storage, validated);\n const api = createApiServer(validated, storage);\n\n return {\n config: validated,\n storage,\n content,\n api,\n build: (opts?: BuildOptions) => runBuild(validated, storage, opts),\n };\n}\n","import type { CmsConfig, CollectionConfig, BlockConfig, FieldConfig } from './types.js';\n\nexport function defineConfig(config: CmsConfig): CmsConfig {\n return config;\n}\n\nexport function defineCollection(config: CollectionConfig): CollectionConfig {\n return config;\n}\n\nexport function defineBlock(config: BlockConfig): BlockConfig {\n return config;\n}\n\nexport function defineField(config: FieldConfig): FieldConfig {\n return config;\n}\n","import { z } from 'zod';\nimport type { CmsConfig } from './types.js';\n\nconst fieldTypeSchema = z.enum([\n 'text', 'textarea', 'richtext', 'number', 'boolean',\n 'date', 'image', 'relation', 'array', 'object', 'blocks', 'select', 'tags',\n 'image-gallery', 'video',\n]);\n\nconst fieldConfigSchema: z.ZodType<any> = z.lazy(() =>\n z.object({\n name: z.string().min(1),\n type: fieldTypeSchema,\n label: z.string().optional(),\n required: z.boolean().optional(),\n defaultValue: z.unknown().optional(),\n maxLength: z.number().optional(),\n minLength: z.number().optional(),\n options: z.array(z.object({ label: z.string(), value: z.string() })).optional(),\n collection: z.string().optional(),\n fields: z.array(fieldConfigSchema).optional(),\n blocks: z.array(z.string()).optional(),\n ai: z.object({\n hint: z.string().optional(),\n maxLength: z.number().optional(),\n tone: z.string().optional(),\n }).optional(),\n aiLock: z.object({\n autoLockOnEdit: z.boolean().optional(),\n lockable: z.boolean().optional(),\n requireApproval: z.boolean().optional(),\n }).optional(),\n })\n);\n\nconst collectionConfigSchema = z.object({\n name: z.string().min(1),\n label: z.string().optional(),\n slug: z.string().optional(),\n urlPrefix: z.string().optional(),\n parentField: z.string().optional(),\n fields: z.array(fieldConfigSchema).min(1),\n hooks: z.object({\n beforeCreate: z.string().optional(),\n afterCreate: z.string().optional(),\n beforeUpdate: z.string().optional(),\n afterUpdate: z.string().optional(),\n beforeDelete: z.string().optional(),\n afterDelete: z.string().optional(),\n }).optional(),\n});\n\nconst cmsConfigSchema = z.object({\n collections: z.array(collectionConfigSchema).min(1),\n blocks: z.array(z.object({\n name: z.string(),\n label: z.string().optional(),\n fields: z.array(fieldConfigSchema),\n })).optional(),\n storage: z.object({\n adapter: z.enum(['sqlite', 'filesystem', 'github']).optional(),\n sqlite: z.object({ path: z.string().optional() }).optional(),\n filesystem: z.object({ contentDir: z.string().optional() }).optional(),\n github: z.object({\n owner: z.string(),\n repo: z.string(),\n branch: z.string().optional(),\n contentDir: z.string().optional(),\n token: z.string(),\n }).optional(),\n }).optional(),\n build: z.object({\n outDir: z.string().optional(),\n baseUrl: z.string().optional(),\n }).optional(),\n api: z.object({\n port: z.number().optional(),\n prefix: z.string().optional(),\n }).optional(),\n});\n\nexport function validateConfig(config: unknown): CmsConfig {\n return cmsConfigSchema.parse(config) as CmsConfig;\n}\n\nexport function safeValidateConfig(config: unknown): { success: true; data: CmsConfig } | { success: false; error: z.ZodError } {\n const result = cmsConfigSchema.safeParse(config);\n if (result.success) {\n return { success: true, data: result.data as CmsConfig };\n }\n return { success: false, error: result.error };\n}\n","import type { CmsConfig, CollectionConfig, FieldConfig } from './types.js';\n\nexport interface JsonSchemaProperty {\n type?: string | string[];\n description?: string;\n properties?: Record<string, JsonSchemaProperty>;\n items?: JsonSchemaProperty;\n enum?: string[];\n format?: string;\n minLength?: number;\n maxLength?: number;\n required?: string[];\n}\n\nexport interface CollectionJsonSchema {\n $schema: string;\n title: string;\n type: 'object';\n properties: Record<string, JsonSchemaProperty>;\n required: string[];\n}\n\nfunction fieldToJsonSchema(field: FieldConfig): JsonSchemaProperty {\n const base: JsonSchemaProperty = {\n description: field.label ?? field.name,\n };\n\n switch (field.type) {\n case 'text':\n case 'textarea':\n case 'richtext': {\n const prop: JsonSchemaProperty = { ...base, type: 'string' };\n if (field.minLength !== undefined) prop.minLength = field.minLength;\n if (field.maxLength !== undefined) prop.maxLength = field.maxLength;\n return prop;\n }\n case 'number':\n return { ...base, type: 'number' };\n case 'boolean':\n return { ...base, type: 'boolean' };\n case 'date':\n return { ...base, type: 'string', format: 'date-time' };\n case 'image':\n return { ...base, type: 'string', format: 'uri', description: 'Image URL or path' };\n case 'select': {\n const prop: JsonSchemaProperty = { ...base, type: 'string' };\n if (field.options) prop.enum = field.options.map(o => o.value);\n return prop;\n }\n case 'relation':\n return { ...base, type: 'string', description: `Reference to ${field.collection ?? 'unknown'} collection` };\n case 'array':\n return {\n ...base,\n type: 'array',\n items: field.fields?.[0] ? fieldToJsonSchema(field.fields[0]) : { type: 'string' },\n };\n case 'object':\n if (field.fields) {\n const properties: Record<string, JsonSchemaProperty> = {};\n for (const f of field.fields) {\n properties[f.name] = fieldToJsonSchema(f);\n }\n return { ...base, type: 'object', properties };\n }\n return { ...base, type: 'object' };\n case 'blocks':\n return { ...base, type: 'array', items: { type: 'object' } };\n default:\n return { ...base, type: 'string' };\n }\n}\n\nexport function collectionToJsonSchema(collection: CollectionConfig): CollectionJsonSchema {\n const properties: Record<string, JsonSchemaProperty> = {};\n const required: string[] = [];\n\n for (const field of collection.fields) {\n properties[field.name] = fieldToJsonSchema(field);\n if (field.required === true) {\n required.push(field.name);\n }\n }\n\n return {\n $schema: 'http://json-schema.org/draft-07/schema#',\n title: collection.label ?? collection.name,\n type: 'object',\n properties,\n required,\n };\n}\n\nexport function configToManifest(config: CmsConfig) {\n return {\n version: '0.1.0',\n collections: config.collections.map(c => ({\n name: c.name,\n label: c.label ?? c.name,\n slug: c.slug ?? c.name,\n fields: c.fields,\n schema: collectionToJsonSchema(c),\n })),\n blocks: config.blocks ?? [],\n api: {\n rest: {\n prefix: config.api?.prefix ?? '/api',\n endpoints: config.collections.flatMap(c => [\n { method: 'GET', path: `/api/content/${c.name}`, description: `List ${c.name}` },\n { method: 'GET', path: `/api/content/${c.name}/:slug`, description: `Get ${c.name} by slug` },\n { method: 'POST', path: `/api/content/${c.name}`, description: `Create ${c.name}` },\n { method: 'PUT', path: `/api/content/${c.name}/:slug`, description: `Update ${c.name}` },\n { method: 'DELETE', path: `/api/content/${c.name}/:slug`, description: `Delete ${c.name}` },\n ]),\n },\n },\n ai: {\n agents: ['content', 'seo'],\n capabilities: {\n content: ['generate', 'rewrite', 'translate', 'seo-optimize', 'expand'],\n seo: ['meta-tags', 'json-ld', 'sitemap'],\n },\n note: 'Set ANTHROPIC_API_KEY or OPENAI_API_KEY to enable AI features',\n },\n };\n}\n","import { existsSync, mkdirSync, readdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { StorageAdapter, Document, DocumentInput, QueryOptions, QueryResult } from '../types.js';\nimport { generateId } from '../../utils/id.js';\nimport { generateSlug } from '../../utils/slug.js';\nimport { now } from '../../utils/date.js';\n\nexport class FilesystemStorageAdapter implements StorageAdapter {\n private contentDir: string;\n\n constructor(contentDir: string = 'content') {\n this.contentDir = contentDir;\n }\n\n async initialize(): Promise<void> {\n if (!existsSync(this.contentDir)) {\n mkdirSync(this.contentDir, { recursive: true });\n }\n }\n\n private collectionDir(collection: string): string {\n return join(this.contentDir, collection);\n }\n\n private documentPath(collection: string, slug: string): string {\n return join(this.collectionDir(collection), `${slug}.json`);\n }\n\n private readDocument(collection: string, slug: string): Document | null {\n const path = this.documentPath(collection, slug);\n if (!existsSync(path)) return null;\n try {\n const doc = JSON.parse(readFileSync(path, 'utf-8')) as Document;\n // Legacy files may lack an id — assign and persist one immediately\n if (!doc.id) {\n doc.id = generateId();\n writeFileSync(path, JSON.stringify({ ...doc, _fieldMeta: doc._fieldMeta ?? {} }, null, 2), 'utf-8');\n }\n return { ...doc, _fieldMeta: doc._fieldMeta ?? {} };\n } catch {\n return null;\n }\n }\n\n async migrate(collections: string[]): Promise<void> {\n for (const collection of collections) {\n const dir = this.collectionDir(collection);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n }\n\n async create(collection: string, input: DocumentInput): Promise<Document> {\n const dir = this.collectionDir(collection);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n\n const id = generateId();\n const slug = input.slug ?? generateSlug(String(input.data['title'] ?? id));\n const timestamp = now();\n\n const doc: Document = {\n id,\n slug,\n collection,\n status: input.status ?? 'draft',\n data: input.data,\n _fieldMeta: input._fieldMeta ?? {},\n createdAt: timestamp,\n updatedAt: timestamp,\n ...(input.locale !== undefined && { locale: input.locale }),\n ...(input.translationOf !== undefined && { translationOf: input.translationOf }),\n ...(input.publishAt != null && { publishAt: input.publishAt }),\n };\n\n writeFileSync(this.documentPath(collection, slug), JSON.stringify(doc, null, 2), 'utf-8');\n return doc;\n }\n\n async findById(collection: string, id: string): Promise<Document | null> {\n if (!id) return null; // guard: never match documents with missing ids\n const dir = this.collectionDir(collection);\n if (!existsSync(dir)) return null;\n\n const files = readdirSync(dir).filter(f => f.endsWith('.json'));\n for (const file of files) {\n const slug = file.replace('.json', '');\n const doc = this.readDocument(collection, slug);\n if (doc?.id === id) return doc;\n }\n return null;\n }\n\n async findBySlug(collection: string, slug: string): Promise<Document | null> {\n return this.readDocument(collection, slug);\n }\n\n async findMany(collection: string, options: QueryOptions = {}): Promise<QueryResult> {\n const dir = this.collectionDir(collection);\n if (!existsSync(dir)) return { documents: [], total: 0 };\n\n const files = readdirSync(dir).filter(f => f.endsWith('.json'));\n let documents: Document[] = [];\n\n for (const file of files) {\n const slug = file.replace('.json', '');\n const doc = this.readDocument(collection, slug);\n if (doc) documents.push(doc);\n }\n\n if (options.status) {\n documents = documents.filter(d => d.status === options.status);\n }\n\n if (options.locale) {\n documents = documents.filter(d => d.locale === options.locale);\n }\n\n if (options.translationOf) {\n documents = documents.filter(d => d.translationOf === options.translationOf);\n }\n\n if (options.tags && options.tags.length > 0) {\n documents = documents.filter(d => {\n const docTags = d.data['tags'];\n if (!Array.isArray(docTags)) return false;\n return options.tags!.every(tag => docTags.includes(tag));\n });\n }\n\n const orderBy = options.orderBy ?? 'createdAt';\n const order = options.order ?? 'desc';\n const DOC_KEYS = new Set<string>(['id', 'slug', 'collection', 'status', 'createdAt', 'updatedAt']);\n documents.sort((a, b) => {\n const getVal = (doc: Document): string => {\n if (DOC_KEYS.has(orderBy)) return String(doc[orderBy as keyof Document] ?? '');\n return String(doc.data[orderBy] ?? '');\n };\n const aVal = getVal(a);\n const bVal = getVal(b);\n const aNum = Number(aVal);\n const bNum = Number(bVal);\n if (!isNaN(aNum) && !isNaN(bNum)) {\n return order === 'asc' ? aNum - bNum : bNum - aNum;\n }\n return order === 'asc' ? aVal.localeCompare(bVal) : bVal.localeCompare(aVal);\n });\n\n const total = documents.length;\n const offset = options.offset ?? 0;\n const limit = options.limit ?? total;\n documents = documents.slice(offset, offset + limit);\n\n return { documents, total };\n }\n\n async update(collection: string, id: string, input: Partial<DocumentInput>): Promise<Document> {\n const existing = await this.findById(collection, id);\n if (!existing) throw new Error(`Document ${id} not found in collection ${collection}`);\n\n const updated: Document = {\n ...existing,\n status: input.status ?? existing.status,\n data: input.data ? { ...existing.data, ...input.data } : existing.data,\n _fieldMeta: input._fieldMeta ?? existing._fieldMeta ?? {},\n updatedAt: now(),\n ...(((input.locale !== undefined ? input.locale : existing.locale) !== undefined) && { locale: input.locale !== undefined ? input.locale : existing.locale }),\n ...(((input.translationOf !== undefined ? input.translationOf : existing.translationOf) !== undefined) && { translationOf: input.translationOf !== undefined ? input.translationOf : existing.translationOf }),\n ...(() => {\n // null = clear, string = set, undefined = keep existing\n const pa = input.publishAt === null ? undefined : (input.publishAt !== undefined ? input.publishAt : existing.publishAt);\n return pa !== undefined ? { publishAt: pa } : {};\n })(),\n };\n\n if (input.slug && input.slug !== existing.slug) {\n unlinkSync(this.documentPath(collection, existing.slug));\n updated.slug = input.slug;\n }\n\n writeFileSync(this.documentPath(collection, updated.slug), JSON.stringify(updated, null, 2), 'utf-8');\n return updated;\n }\n\n async delete(collection: string, id: string): Promise<void> {\n const doc = await this.findById(collection, id);\n if (!doc) throw new Error(`Document ${id} not found in collection ${collection}`);\n const path = this.documentPath(collection, doc.slug);\n if (existsSync(path)) unlinkSync(path);\n }\n\n async close(): Promise<void> {\n // No-op for filesystem adapter\n }\n}\n","import { nanoid } from 'nanoid';\n\nexport function generateId(): string {\n return nanoid(21);\n}\n","export function generateSlug(input: string): string {\n return input\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 200);\n}\n","export function now(): string {\n return new Date().toISOString();\n}\n\nexport function formatDate(date: string, locale = 'en-US'): string {\n return new Date(date).toLocaleDateString(locale, {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n });\n}\n","import Database from 'better-sqlite3';\nimport { drizzle } from 'drizzle-orm/better-sqlite3';\nimport { eq, and, desc, asc, sql } from 'drizzle-orm';\nimport { sqliteTable, text } from 'drizzle-orm/sqlite-core';\nimport type { StorageAdapter, Document, DocumentInput, QueryOptions, QueryResult, DocumentStatus, DocumentFieldMeta } from '../types.js';\nimport { generateId } from '../../utils/id.js';\nimport { generateSlug } from '../../utils/slug.js';\nimport { now } from '../../utils/date.js';\n\nconst documentsTable = sqliteTable('documents', {\n id: text('id').primaryKey(),\n slug: text('slug').notNull(),\n collection: text('collection').notNull(),\n status: text('status').notNull().default('draft'),\n data: text('data').notNull().default('{}'),\n fieldMeta: text('field_meta').notNull().default('{}'),\n createdAt: text('created_at').notNull(),\n updatedAt: text('updated_at').notNull(),\n});\n\nexport class SqliteStorageAdapter implements StorageAdapter {\n private dbPath: string;\n private sqlite!: ReturnType<typeof Database>;\n private db!: ReturnType<typeof drizzle>;\n\n constructor(dbPath: string = '.cms/content.db') {\n this.dbPath = dbPath;\n }\n\n async initialize(): Promise<void> {\n const { mkdirSync, existsSync } = await import('node:fs');\n const { dirname } = await import('node:path');\n const dir = dirname(this.dbPath);\n if (dir && !existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n this.sqlite = new Database(this.dbPath);\n this.db = drizzle(this.sqlite);\n }\n\n async migrate(_collections: string[]): Promise<void> {\n this.sqlite.exec(`\n CREATE TABLE IF NOT EXISTS documents (\n id TEXT PRIMARY KEY,\n slug TEXT NOT NULL,\n collection TEXT NOT NULL,\n status TEXT NOT NULL DEFAULT 'draft',\n data TEXT NOT NULL DEFAULT '{}',\n field_meta TEXT NOT NULL DEFAULT '{}',\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n UNIQUE(collection, slug)\n );\n CREATE INDEX IF NOT EXISTS idx_documents_collection ON documents(collection);\n CREATE INDEX IF NOT EXISTS idx_documents_status ON documents(status);\n CREATE INDEX IF NOT EXISTS idx_documents_collection_slug ON documents(collection, slug);\n `);\n // Add field_meta column to existing databases that pre-date this migration\n try {\n this.sqlite.exec(`ALTER TABLE documents ADD COLUMN field_meta TEXT NOT NULL DEFAULT '{}'`);\n } catch {\n // Column already exists — safe to ignore\n }\n }\n\n private rowToDocument(row: typeof documentsTable.$inferSelect): Document {\n return {\n id: row.id,\n slug: row.slug,\n collection: row.collection,\n status: row.status as DocumentStatus,\n data: JSON.parse(row.data) as Record<string, unknown>,\n _fieldMeta: JSON.parse(row.fieldMeta ?? '{}') as DocumentFieldMeta,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n };\n }\n\n async create(collection: string, input: DocumentInput): Promise<Document> {\n const id = generateId();\n const slug = input.slug ?? generateSlug(String(input.data['title'] ?? id));\n const timestamp = now();\n\n const row = {\n id,\n slug,\n collection,\n status: input.status ?? 'draft',\n data: JSON.stringify(input.data),\n fieldMeta: JSON.stringify(input._fieldMeta ?? {}),\n createdAt: timestamp,\n updatedAt: timestamp,\n };\n\n await this.db.insert(documentsTable).values(row);\n return this.rowToDocument(row);\n }\n\n async findById(_collection: string, id: string): Promise<Document | null> {\n const rows = await this.db\n .select()\n .from(documentsTable)\n .where(eq(documentsTable.id, id))\n .limit(1);\n return rows[0] ? this.rowToDocument(rows[0]) : null;\n }\n\n async findBySlug(collection: string, slug: string): Promise<Document | null> {\n const rows = await this.db\n .select()\n .from(documentsTable)\n .where(and(\n eq(documentsTable.collection, collection),\n eq(documentsTable.slug, slug),\n ))\n .limit(1);\n return rows[0] ? this.rowToDocument(rows[0]) : null;\n }\n\n async findMany(collection: string, options: QueryOptions = {}): Promise<QueryResult> {\n const conditions = [eq(documentsTable.collection, collection)];\n\n if (options.status) {\n conditions.push(eq(documentsTable.status, options.status));\n }\n\n // Tags: AND logic — each tag must exist in the JSON array\n if (options.tags && options.tags.length > 0) {\n for (const tag of options.tags) {\n conditions.push(\n sql`EXISTS (\n SELECT 1 FROM json_each(json_extract(${documentsTable.data}, '$.tags'))\n WHERE value = ${tag}\n )`,\n );\n }\n }\n\n const whereClause = conditions.length > 1\n ? and(...conditions)!\n : conditions[0]!;\n\n // orderBy: support document-level keys and data.* fields via json_extract\n const orderBy = options.orderBy ?? 'createdAt';\n const isAsc = options.order === 'asc';\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let orderExpr: any;\n switch (orderBy) {\n case 'slug': orderExpr = isAsc ? asc(documentsTable.slug) : desc(documentsTable.slug); break;\n case 'status': orderExpr = isAsc ? asc(documentsTable.status) : desc(documentsTable.status); break;\n case 'updatedAt': orderExpr = isAsc ? asc(documentsTable.updatedAt) : desc(documentsTable.updatedAt); break;\n case 'createdAt': orderExpr = isAsc ? asc(documentsTable.createdAt) : desc(documentsTable.createdAt); break;\n default:\n // data.* field: use json_extract with CAST for numeric support\n orderExpr = isAsc\n ? asc(sql`CAST(json_extract(${documentsTable.data}, ${`$.${orderBy}`}) AS REAL)`)\n : desc(sql`CAST(json_extract(${documentsTable.data}, ${`$.${orderBy}`}) AS REAL)`);\n }\n\n const rows = await this.db\n .select()\n .from(documentsTable)\n .where(whereClause)\n .orderBy(orderExpr)\n .limit(options.limit ?? 1000)\n .offset(options.offset ?? 0);\n\n const totalRows = await this.db\n .select({ count: sql<number>`count(*)` })\n .from(documentsTable)\n .where(whereClause);\n\n return {\n documents: rows.map(r => this.rowToDocument(r)),\n total: Number(totalRows[0]?.count ?? 0),\n };\n }\n\n async update(collection: string, id: string, input: Partial<DocumentInput>): Promise<Document> {\n const existing = await this.findById(collection, id);\n if (!existing) throw new Error(`Document ${id} not found in collection ${collection}`);\n\n const updatedData = input.data ? { ...existing.data, ...input.data } : existing.data;\n const updatedFieldMeta = input._fieldMeta ?? existing._fieldMeta ?? {};\n const timestamp = now();\n\n await this.db\n .update(documentsTable)\n .set({\n slug: input.slug ?? existing.slug,\n status: input.status ?? existing.status,\n data: JSON.stringify(updatedData),\n fieldMeta: JSON.stringify(updatedFieldMeta),\n updatedAt: timestamp,\n })\n .where(eq(documentsTable.id, id));\n\n return {\n ...existing,\n slug: input.slug ?? existing.slug,\n status: input.status ?? existing.status,\n data: updatedData,\n _fieldMeta: updatedFieldMeta,\n updatedAt: timestamp,\n };\n }\n\n async delete(_collection: string, id: string): Promise<void> {\n await this.db.delete(documentsTable).where(eq(documentsTable.id, id));\n }\n\n async close(): Promise<void> {\n this.sqlite.close();\n }\n}\n","import type { StorageAdapter, Document, DocumentInput, QueryOptions, QueryResult } from '../types.js';\nimport { generateId } from '../../utils/id.js';\nimport { generateSlug } from '../../utils/slug.js';\nimport { now } from '../../utils/date.js';\n\nexport interface GitHubAdapterConfig {\n owner: string;\n repo: string;\n branch?: string;\n contentDir?: string;\n token: string;\n}\n\ninterface GitHubFileResponse {\n content: string;\n sha: string;\n name: string;\n path: string;\n type: string;\n}\n\ntype GitHubDirEntry = {\n name: string;\n type: string;\n sha: string;\n};\n\nexport class GitHubStorageAdapter implements StorageAdapter {\n private owner: string;\n private repo: string;\n private branch: string;\n private contentDir: string;\n private token: string;\n private baseUrl = 'https://api.github.com';\n\n /** Cache of path → SHA for files we've fetched or written */\n private shaCache = new Map<string, string>();\n\n constructor(config: GitHubAdapterConfig) {\n this.owner = config.owner;\n this.repo = config.repo;\n this.branch = config.branch ?? 'main';\n this.contentDir = config.contentDir ?? 'content';\n this.token = config.token;\n }\n\n // ── helpers ──────────────────────────────────────────────────────────────\n\n private headers(): Record<string, string> {\n return {\n Authorization: `Bearer ${this.token}`,\n Accept: 'application/vnd.github+json',\n 'X-GitHub-Api-Version': '2022-11-28',\n 'Content-Type': 'application/json',\n };\n }\n\n private filePath(collection: string, slug: string): string {\n return `${this.contentDir}/${collection}/${slug}.json`;\n }\n\n private dirPath(collection: string): string {\n return `${this.contentDir}/${collection}`;\n }\n\n private encode(content: string): string {\n return Buffer.from(content, 'utf-8').toString('base64');\n }\n\n private decode(b64: string): string {\n // GitHub wraps base64 with newlines — strip them\n return Buffer.from(b64.replace(/\\n/g, ''), 'base64').toString('utf-8');\n }\n\n private repoUrl(path: string): string {\n return `${this.baseUrl}/repos/${this.owner}/${this.repo}/contents/${path}`;\n }\n\n // ── low-level API calls ──────────────────────────────────────────────────\n\n private async getFile(path: string): Promise<GitHubFileResponse | null> {\n const url = `${this.repoUrl(path)}?ref=${this.branch}`;\n const res = await fetch(url, { headers: this.headers() });\n\n if (res.status === 404) return null;\n if (res.status === 401) throw new Error(`GitHub: bad token or no access to ${this.owner}/${this.repo}`);\n if (!res.ok) throw new Error(`GitHub GET ${path} failed: ${res.status} ${res.statusText}`);\n\n const data = (await res.json()) as GitHubFileResponse;\n this.shaCache.set(path, data.sha);\n return data;\n }\n\n private async putFile(path: string, content: string, message: string): Promise<void> {\n const sha = this.shaCache.get(path);\n const body: Record<string, unknown> = {\n message,\n content: this.encode(content),\n branch: this.branch,\n };\n if (sha) body['sha'] = sha;\n\n const res = await fetch(this.repoUrl(path), {\n method: 'PUT',\n headers: this.headers(),\n body: JSON.stringify(body),\n });\n\n if (res.status === 409) throw new Error(`GitHub: SHA conflict writing ${path} — please retry`);\n if (res.status === 401) throw new Error(`GitHub: bad token or no access to ${this.owner}/${this.repo}`);\n if (!res.ok) throw new Error(`GitHub PUT ${path} failed: ${res.status} ${res.statusText}`);\n\n const data = (await res.json()) as { content: { sha: string } };\n if (data.content?.sha) {\n this.shaCache.set(path, data.content.sha);\n }\n }\n\n private async deleteFile(path: string, message: string): Promise<void> {\n let sha = this.shaCache.get(path);\n if (!sha) {\n const file = await this.getFile(path);\n if (!file) throw new Error(`GitHub: file not found: ${path}`);\n sha = file.sha;\n }\n\n const res = await fetch(this.repoUrl(path), {\n method: 'DELETE',\n headers: this.headers(),\n body: JSON.stringify({ message, sha, branch: this.branch }),\n });\n\n if (res.status === 404) throw new Error(`GitHub: file not found: ${path}`);\n if (res.status === 401) throw new Error(`GitHub: bad token or no access to ${this.owner}/${this.repo}`);\n if (!res.ok) throw new Error(`GitHub DELETE ${path} failed: ${res.status} ${res.statusText}`);\n\n this.shaCache.delete(path);\n }\n\n private async listDir(collection: string): Promise<GitHubDirEntry[]> {\n const path = this.dirPath(collection);\n const url = `${this.repoUrl(path)}?ref=${this.branch}`;\n const res = await fetch(url, { headers: this.headers() });\n\n if (res.status === 404) return [];\n if (res.status === 401) throw new Error(`GitHub: bad token or no access to ${this.owner}/${this.repo}`);\n if (!res.ok) throw new Error(`GitHub LIST ${path} failed: ${res.status} ${res.statusText}`);\n\n const data = (await res.json()) as GitHubDirEntry[];\n return Array.isArray(data) ? data : [];\n }\n\n // ── document helpers ──────────────────────────────────────────────────────\n\n private async fetchDocument(collection: string, slug: string): Promise<Document | null> {\n const path = this.filePath(collection, slug);\n const file = await this.getFile(path);\n if (!file) return null;\n try {\n const doc = JSON.parse(this.decode(file.content)) as Document;\n return { ...doc, _fieldMeta: doc._fieldMeta ?? {} };\n } catch {\n return null;\n }\n }\n\n // ── StorageAdapter implementation ─────────────────────────────────────────\n\n async initialize(): Promise<void> {\n // Verify token and repo access with a lightweight call\n const url = `${this.baseUrl}/repos/${this.owner}/${this.repo}`;\n const res = await fetch(url, { headers: this.headers() });\n if (res.status === 401) throw new Error(`GitHub: bad token — cannot access ${this.owner}/${this.repo}`);\n if (res.status === 404) throw new Error(`GitHub: repo not found: ${this.owner}/${this.repo}`);\n if (!res.ok) throw new Error(`GitHub: repo access check failed: ${res.status} ${res.statusText}`);\n }\n\n async migrate(_collections: string[]): Promise<void> {\n // No-op: GitHub doesn't need schema migration\n }\n\n async create(collection: string, input: DocumentInput): Promise<Document> {\n const id = generateId();\n const slug = input.slug ?? generateSlug(String(input.data['title'] ?? id));\n const timestamp = now();\n\n const doc: Document = {\n id,\n slug,\n collection,\n status: input.status ?? 'draft',\n data: input.data,\n _fieldMeta: input._fieldMeta ?? {},\n createdAt: timestamp,\n updatedAt: timestamp,\n };\n\n const path = this.filePath(collection, slug);\n await this.putFile(path, JSON.stringify(doc, null, 2), `cms: create ${collection}/${slug}`);\n return doc;\n }\n\n async findById(collection: string, id: string): Promise<Document | null> {\n const entries = await this.listDir(collection);\n const jsonFiles = entries.filter(e => e.type === 'file' && e.name.endsWith('.json'));\n\n for (const entry of jsonFiles) {\n const slug = entry.name.replace('.json', '');\n const doc = await this.fetchDocument(collection, slug);\n if (doc?.id === id) return doc;\n }\n return null;\n }\n\n async findBySlug(collection: string, slug: string): Promise<Document | null> {\n return this.fetchDocument(collection, slug);\n }\n\n async findMany(collection: string, options: QueryOptions = {}): Promise<QueryResult> {\n const entries = await this.listDir(collection);\n const jsonFiles = entries.filter(e => e.type === 'file' && e.name.endsWith('.json'));\n\n let documents: Document[] = [];\n\n for (const entry of jsonFiles) {\n const slug = entry.name.replace('.json', '');\n const doc = await this.fetchDocument(collection, slug);\n if (doc) documents.push(doc);\n }\n\n // Status filter\n if (options.status) {\n documents = documents.filter(d => d.status === options.status);\n }\n\n // Tags filter (AND logic)\n if (options.tags && options.tags.length > 0) {\n documents = documents.filter(d => {\n const docTags = d.data['tags'];\n if (!Array.isArray(docTags)) return false;\n return options.tags!.every(tag => docTags.includes(tag));\n });\n }\n\n // Sort\n const orderBy = options.orderBy ?? 'createdAt';\n const order = options.order ?? 'desc';\n const DOC_KEYS = new Set<string>(['id', 'slug', 'collection', 'status', 'createdAt', 'updatedAt']);\n documents.sort((a, b) => {\n const getVal = (doc: Document): string => {\n if (DOC_KEYS.has(orderBy)) return String(doc[orderBy as keyof Document] ?? '');\n return String(doc.data[orderBy] ?? '');\n };\n const aVal = getVal(a);\n const bVal = getVal(b);\n const aNum = Number(aVal);\n const bNum = Number(bVal);\n if (!isNaN(aNum) && !isNaN(bNum)) {\n return order === 'asc' ? aNum - bNum : bNum - aNum;\n }\n return order === 'asc' ? aVal.localeCompare(bVal) : bVal.localeCompare(aVal);\n });\n\n const total = documents.length;\n const offset = options.offset ?? 0;\n const limit = options.limit ?? total;\n documents = documents.slice(offset, offset + limit);\n\n return { documents, total };\n }\n\n async update(collection: string, id: string, input: Partial<DocumentInput>): Promise<Document> {\n const existing = await this.findById(collection, id);\n if (!existing) throw new Error(`Document ${id} not found in collection ${collection}`);\n\n const updated: Document = {\n ...existing,\n status: input.status ?? existing.status,\n data: input.data ? { ...existing.data, ...input.data } : existing.data,\n _fieldMeta: input._fieldMeta ?? existing._fieldMeta ?? {},\n updatedAt: now(),\n };\n\n if (input.slug && input.slug !== existing.slug) {\n // Delete old file, create new one\n await this.deleteFile(\n this.filePath(collection, existing.slug),\n `cms: rename ${collection}/${existing.slug} → ${input.slug}`,\n );\n updated.slug = input.slug;\n }\n\n const path = this.filePath(collection, updated.slug);\n await this.putFile(path, JSON.stringify(updated, null, 2), `cms: update ${collection}/${updated.slug}`);\n return updated;\n }\n\n async delete(collection: string, id: string): Promise<void> {\n const doc = await this.findById(collection, id);\n if (!doc) throw new Error(`Document ${id} not found in collection ${collection}`);\n await this.deleteFile(\n this.filePath(collection, doc.slug),\n `cms: delete ${collection}/${doc.slug}`,\n );\n }\n\n async close(): Promise<void> {\n // No-op for GitHub adapter\n }\n}\n","import { now } from '../utils/date.js';\nimport type { DocumentFieldMeta, FieldMeta, WriteContext } from '../storage/types.js';\n\nexport function isFieldLocked(meta: DocumentFieldMeta, fieldPath: string): boolean {\n return !!meta[fieldPath]?.lockedBy;\n}\n\nexport function getLockedFields(meta: DocumentFieldMeta): string[] {\n return Object.keys(meta).filter(k => !!meta[k]?.lockedBy);\n}\n\nexport function filterUnlockedFields(meta: DocumentFieldMeta, fieldPaths: string[]): string[] {\n return fieldPaths.filter(f => !isFieldLocked(meta, f));\n}\n\nexport interface FieldMetaChanges {\n filteredData: Record<string, unknown>;\n updatedMeta: DocumentFieldMeta;\n skippedFields: string[];\n}\n\n/**\n * Computes which fields to write and how to update _fieldMeta based on the WriteContext.\n *\n * Rules:\n * - actor='ai' + field locked → skip field (AI cannot overwrite human edits)\n * - actor='user' + field was AI-generated → write + auto-lock\n * - actor='user' + field not AI-generated → write, no meta change\n * - actor='ai' + field unlocked → write + mark as aiGenerated\n * - actor='import' → write + lock with reason 'import'\n */\nexport function computeFieldMetaChanges(\n oldData: Record<string, unknown>,\n newData: Record<string, unknown>,\n existingMeta: DocumentFieldMeta,\n context: WriteContext,\n): FieldMetaChanges {\n const timestamp = now();\n const updatedMeta: DocumentFieldMeta = { ...existingMeta };\n const filteredData: Record<string, unknown> = {};\n const skippedFields: string[] = [];\n\n for (const [field, value] of Object.entries(newData)) {\n const hasChanged = JSON.stringify(oldData[field]) !== JSON.stringify(value);\n const fieldMeta = updatedMeta[field] ?? {};\n const isLocked = !!fieldMeta.lockedBy;\n\n if (!hasChanged) {\n // No change — pass through without touching meta\n filteredData[field] = value;\n continue;\n }\n\n if (context.actor === 'ai' && isLocked) {\n // AI cannot overwrite a locked field\n skippedFields.push(field);\n } else if (context.actor === 'user') {\n filteredData[field] = value;\n if (fieldMeta.aiGenerated) {\n // User is editing an AI-generated field → auto-lock\n const locked: Partial<FieldMeta> = {\n ...fieldMeta,\n lockedBy: 'user',\n lockedAt: timestamp,\n reason: 'user-edit',\n };\n if (context.userId !== undefined) locked.userId = context.userId;\n updatedMeta[field] = locked;\n }\n // No meta change for fields that were never AI-generated\n } else if (context.actor === 'ai') {\n // AI writing to an unlocked field → mark as AI-generated\n // We build a clean meta without lock fields (omit them rather than set to undefined)\n const aiMeta: Partial<FieldMeta> = {\n aiGenerated: true,\n aiGeneratedAt: timestamp,\n };\n if (context.aiModel !== undefined) aiMeta.aiModel = context.aiModel;\n updatedMeta[field] = aiMeta;\n filteredData[field] = value;\n } else if (context.actor === 'import') {\n filteredData[field] = value;\n const importMeta: Partial<FieldMeta> = {\n ...fieldMeta,\n lockedBy: 'import',\n lockedAt: timestamp,\n reason: 'import',\n };\n if (context.userId !== undefined) importMeta.userId = context.userId;\n updatedMeta[field] = importMeta;\n }\n }\n\n return { filteredData, updatedMeta, skippedFields };\n}\n\n/**\n * Builds _fieldMeta for a newly created document.\n * All fields are marked as AI-generated when actor='ai'.\n */\nexport function buildInitialFieldMeta(\n data: Record<string, unknown>,\n context: WriteContext,\n): DocumentFieldMeta {\n if (context.actor !== 'ai') return {};\n\n const timestamp = now();\n const meta: DocumentFieldMeta = {};\n for (const field of Object.keys(data)) {\n const fieldMeta: Partial<FieldMeta> = {\n aiGenerated: true,\n aiGeneratedAt: timestamp,\n };\n if (context.aiModel !== undefined) fieldMeta.aiModel = context.aiModel;\n meta[field] = fieldMeta;\n }\n return meta;\n}\n","import type { StorageAdapter, Document, DocumentInput, QueryOptions, QueryResult, WriteContext, SearchOptions, SearchResult } from '../storage/types.js';\nimport type { ContentHooks } from './hooks.js';\nimport type { CmsConfig } from '../schema/types.js';\nimport { computeFieldMetaChanges, buildInitialFieldMeta } from './field-meta.js';\n\nconst DEFAULT_CONTEXT: WriteContext = { actor: 'user' };\n\nexport class ContentService {\n constructor(\n private storage: StorageAdapter,\n private config: CmsConfig,\n private hooks: ContentHooks = {},\n ) {}\n\n private getCollection(name: string) {\n const col = this.config.collections.find(c => c.name === name);\n if (!col) throw new Error(`Collection \"${name}\" not found in config`);\n return col;\n }\n\n async create(collection: string, input: DocumentInput, context: WriteContext = DEFAULT_CONTEXT): Promise<Document> {\n this.getCollection(collection);\n\n // Build initial _fieldMeta for AI-generated content\n const fieldMeta = buildInitialFieldMeta(input.data, context);\n let processedInput: DocumentInput = { ...input, _fieldMeta: { ...fieldMeta, ...input._fieldMeta } };\n\n if (this.hooks.beforeCreate) {\n processedInput = await this.hooks.beforeCreate(collection, processedInput, context);\n }\n\n const doc = await this.storage.create(collection, processedInput);\n\n if (this.hooks.afterCreate) {\n await this.hooks.afterCreate(collection, doc, context);\n }\n\n return doc;\n }\n\n async findById(collection: string, id: string): Promise<Document | null> {\n this.getCollection(collection);\n return this.storage.findById(collection, id);\n }\n\n async findBySlug(collection: string, slug: string): Promise<Document | null> {\n this.getCollection(collection);\n return this.storage.findBySlug(collection, slug);\n }\n\n async findMany(collection: string, options?: QueryOptions): Promise<QueryResult> {\n this.getCollection(collection);\n return this.storage.findMany(collection, options);\n }\n\n /**\n * Find all documents across one or more collections that have the given tag.\n * If no collections are specified, searches all configured collections.\n */\n async findByTag(\n tag: string,\n collections?: string[],\n options?: Omit<QueryOptions, 'tags'>,\n ): Promise<QueryResult> {\n const targets = collections ?? this.config.collections.map(c => c.name);\n const results = await Promise.all(\n targets.map(col =>\n this.storage.findMany(col, { ...options, tags: [tag] }).catch(() => ({ documents: [], total: 0 })),\n ),\n );\n const documents = results.flatMap(r => r.documents);\n return { documents, total: documents.length };\n }\n\n async update(\n collection: string,\n id: string,\n input: Partial<DocumentInput>,\n context: WriteContext = DEFAULT_CONTEXT,\n ): Promise<Document> {\n this.getCollection(collection);\n\n let processedInput = input;\n if (this.hooks.beforeUpdate) {\n processedInput = await this.hooks.beforeUpdate(collection, id, input, context);\n }\n\n // Apply field-level lock logic when data is being updated\n if (processedInput.data) {\n const existing = await this.storage.findById(collection, id);\n if (existing) {\n const { filteredData, updatedMeta } = computeFieldMetaChanges(\n existing.data,\n processedInput.data,\n existing._fieldMeta ?? {},\n context,\n );\n processedInput = {\n ...processedInput,\n data: filteredData,\n _fieldMeta: updatedMeta,\n };\n }\n }\n\n const doc = await this.storage.update(collection, id, processedInput);\n\n if (this.hooks.afterUpdate) {\n await this.hooks.afterUpdate(collection, doc, context);\n }\n\n return doc;\n }\n\n /**\n * Same as update() but also returns the list of fields that were skipped\n * because they were locked and the actor was 'ai'.\n */\n async updateWithContext(\n collection: string,\n id: string,\n input: Partial<DocumentInput>,\n context: WriteContext,\n ): Promise<{ document: Document; skippedFields: string[] }> {\n this.getCollection(collection);\n\n let processedInput = input;\n if (this.hooks.beforeUpdate) {\n processedInput = await this.hooks.beforeUpdate(collection, id, input, context);\n }\n\n let skippedFields: string[] = [];\n\n if (processedInput.data) {\n const existing = await this.storage.findById(collection, id);\n if (existing) {\n const changes = computeFieldMetaChanges(\n existing.data,\n processedInput.data,\n existing._fieldMeta ?? {},\n context,\n );\n skippedFields = changes.skippedFields;\n processedInput = {\n ...processedInput,\n data: changes.filteredData,\n _fieldMeta: changes.updatedMeta,\n };\n }\n }\n\n const doc = await this.storage.update(collection, id, processedInput);\n\n if (this.hooks.afterUpdate) {\n await this.hooks.afterUpdate(collection, doc, context);\n }\n\n return { document: doc, skippedFields };\n }\n\n /**\n * Publish all draft documents whose publishAt timestamp is in the past.\n * Called by the cron job every minute. Returns slugs of published documents.\n */\n async publishDue(collections?: string[]): Promise<{ collection: string; slug: string }[]> {\n const targets = collections ?? this.config.collections.map(c => c.name);\n const now = new Date();\n const published: { collection: string; slug: string }[] = [];\n\n for (const col of targets) {\n const { documents } = await this.storage.findMany(col, { status: 'draft' }).catch(() => ({ documents: [] }));\n for (const doc of documents) {\n if (!doc.publishAt) continue;\n if (new Date(doc.publishAt) > now) continue;\n await this.storage.update(col, doc.id, {\n status: 'published',\n publishAt: null, // clear the schedule\n });\n published.push({ collection: col, slug: doc.slug });\n }\n }\n return published;\n }\n\n /**\n * Full-text search across collections. Searches title, slug, excerpt, description and content.\n * Results are scored: exact title > slug match > prefix > excerpt > content body.\n */\n async search(query: string, options?: SearchOptions): Promise<SearchResult[]> {\n const q = query.trim().toLowerCase();\n if (!q) return [];\n\n const limit = options?.limit ?? 20;\n const targets = options?.collections\n ? this.config.collections.filter(c => options.collections!.includes(c.name))\n : this.config.collections.filter(c => c.name !== 'global');\n\n const results: SearchResult[] = [];\n\n for (const col of targets) {\n const queryOpts: QueryOptions = {};\n if (options?.status) queryOpts.status = options.status;\n const { documents } = await this.storage\n .findMany(col.name, queryOpts)\n .catch(() => ({ documents: [] as Document[] }));\n\n for (const doc of documents) {\n const title = String(doc.data['title'] ?? doc.data['name'] ?? doc.data['label'] ?? doc.slug).toLowerCase();\n const slug = doc.slug.toLowerCase();\n const excerpt = String(doc.data['excerpt'] ?? doc.data['description'] ?? '').toLowerCase();\n const rawContent = String(doc.data['content'] ?? '');\n const content = rawContent.replace(/<[^>]*>/g, ' ').replace(/\\s+/g, ' ').toLowerCase();\n\n let score = 0;\n if (title === q) score = 100;\n else if (slug === q) score = 80;\n else if (title.startsWith(q)) score = 50;\n else if (slug.startsWith(q)) score = 40;\n else if (title.includes(q)) score = 30;\n else if (excerpt.includes(q)) score = 20;\n else if (content.includes(q)) score = 10;\n\n if (score === 0) continue;\n\n const urlPrefix = (col as { urlPrefix?: string }).urlPrefix ?? '';\n const url = urlPrefix ? `${urlPrefix}/${doc.slug}` : `/${doc.slug}`;\n\n // Build excerpt: prefer excerpt field, fallback to stripped content\n const excerptText = String(doc.data['excerpt'] ?? doc.data['description'] ?? '');\n const snippetSource = excerptText || rawContent.replace(/<[^>]*>/g, ' ').replace(/\\s+/g, ' ').trim();\n const snippetMax = 160;\n const snippet = snippetSource.length > snippetMax\n ? snippetSource.slice(0, snippetMax) + '…'\n : snippetSource;\n\n results.push({\n collection: col.name,\n collectionLabel: col.label ?? col.name,\n slug: doc.slug,\n title: String(doc.data['title'] ?? doc.data['name'] ?? doc.data['label'] ?? doc.slug),\n excerpt: snippet,\n url,\n status: doc.status,\n score,\n });\n }\n }\n\n results.sort((a, b) => b.score - a.score || a.title.localeCompare(b.title));\n return results.slice(0, limit);\n }\n\n async delete(collection: string, id: string, context: WriteContext = DEFAULT_CONTEXT): Promise<void> {\n this.getCollection(collection);\n\n if (this.hooks.beforeDelete) {\n await this.hooks.beforeDelete(collection, id, context);\n }\n\n await this.storage.delete(collection, id);\n\n if (this.hooks.afterDelete) {\n await this.hooks.afterDelete(collection, id, context);\n }\n }\n}\n","import { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport { logger } from 'hono/logger';\nimport type { CmsConfig } from '../schema/types.js';\nimport type { StorageAdapter } from '../storage/types.js';\nimport { ContentService } from '../content/service.js';\nimport { createContentRoutes } from './routes/content.js';\nimport { createSchemaRoutes } from './routes/schema.js';\nimport { createManifestRoutes } from './routes/manifest.js';\n\nexport function createApiServer(config: CmsConfig, storage: StorageAdapter): Hono {\n const app = new Hono();\n const prefix = config.api?.prefix ?? '/api';\n const content = new ContentService(storage, config);\n\n app.use('*', cors());\n app.use('*', logger());\n\n app.route(`${prefix}/content`, createContentRoutes(content));\n app.route(`${prefix}/schema`, createSchemaRoutes(config));\n app.route(`${prefix}/manifest`, createManifestRoutes(config));\n\n app.get('/', (c) => c.json({\n name: '@webhouse/cms',\n version: '0.1.0',\n api: prefix,\n }));\n\n return app;\n}\n","import { Hono } from 'hono';\nimport type { ContentService } from '../../content/service.js';\nimport type { Document, DocumentFieldMeta } from '../../storage/types.js';\n\n/** Strip _fieldMeta from a document for standard GET responses */\nfunction stripFieldMeta(doc: Document): Omit<Document, '_fieldMeta'> {\n const { _fieldMeta: _ignored, ...rest } = doc;\n return rest;\n}\n\nexport function createContentRoutes(content: ContentService) {\n const app = new Hono();\n\n // List documents (no _fieldMeta in response)\n app.get('/:collection', async (c) => {\n const collection = c.req.param('collection');\n const status = c.req.query('status') as 'draft' | 'published' | 'archived' | undefined;\n const limit = c.req.query('limit') ? Number(c.req.query('limit')) : undefined;\n const offset = c.req.query('offset') ? Number(c.req.query('offset')) : undefined;\n\n try {\n const result = await content.findMany(collection, { status, limit, offset });\n return c.json({\n documents: result.documents.map(stripFieldMeta),\n total: result.total,\n });\n } catch (e) {\n return c.json({ error: String(e) }, 404);\n }\n });\n\n // --- Field meta endpoints (must come BEFORE /:collection/:slug to match correctly) ---\n\n // GET field meta for a document\n app.get('/:collection/:slug/_fieldMeta', async (c) => {\n const collection = c.req.param('collection');\n const slug = c.req.param('slug');\n try {\n const doc = await content.findBySlug(collection, slug);\n if (!doc) return c.json({ error: 'Not found' }, 404);\n return c.json(doc._fieldMeta ?? {});\n } catch (e) {\n return c.json({ error: String(e) }, 404);\n }\n });\n\n // Manual lock a single field\n app.put('/:collection/:slug/_fieldMeta/:fieldPath/lock', async (c) => {\n const collection = c.req.param('collection');\n const slug = c.req.param('slug');\n const fieldPath = c.req.param('fieldPath');\n try {\n const doc = await content.findBySlug(collection, slug);\n if (!doc) return c.json({ error: 'Not found' }, 404);\n\n const body = await c.req.json().catch(() => ({})) as { userId?: string; reason?: string };\n const updatedMeta: DocumentFieldMeta = {\n ...doc._fieldMeta,\n [fieldPath]: {\n ...(doc._fieldMeta?.[fieldPath] ?? {}),\n lockedBy: 'user',\n lockedAt: new Date().toISOString(),\n userId: body.userId,\n reason: body.reason ?? 'manual-lock',\n },\n };\n\n await content.update(collection, doc.id, { _fieldMeta: updatedMeta });\n return c.json(updatedMeta[fieldPath]);\n } catch (e) {\n return c.json({ error: String(e) }, 400);\n }\n });\n\n // Unlock a single field\n app.put('/:collection/:slug/_fieldMeta/:fieldPath/unlock', async (c) => {\n const collection = c.req.param('collection');\n const slug = c.req.param('slug');\n const fieldPath = c.req.param('fieldPath');\n try {\n const doc = await content.findBySlug(collection, slug);\n if (!doc) return c.json({ error: 'Not found' }, 404);\n\n const existing = doc._fieldMeta?.[fieldPath] ?? {};\n const updatedMeta: DocumentFieldMeta = {\n ...doc._fieldMeta,\n [fieldPath]: {\n ...existing,\n lockedBy: undefined,\n lockedAt: undefined,\n userId: undefined,\n reason: undefined,\n },\n };\n\n await content.update(collection, doc.id, { _fieldMeta: updatedMeta });\n return c.json(updatedMeta[fieldPath]);\n } catch (e) {\n return c.json({ error: String(e) }, 400);\n }\n });\n\n // Lock all AI-generated fields\n app.put('/:collection/:slug/_fieldMeta/lock-all', async (c) => {\n const collection = c.req.param('collection');\n const slug = c.req.param('slug');\n try {\n const doc = await content.findBySlug(collection, slug);\n if (!doc) return c.json({ error: 'Not found' }, 404);\n\n const body = await c.req.json().catch(() => ({})) as { userId?: string };\n const timestamp = new Date().toISOString();\n const updatedMeta: DocumentFieldMeta = {};\n\n for (const [field, meta] of Object.entries(doc._fieldMeta ?? {})) {\n updatedMeta[field] = meta?.aiGenerated\n ? { ...meta, lockedBy: 'user', lockedAt: timestamp, userId: body.userId, reason: 'manual-lock-all' }\n : meta;\n }\n\n await content.update(collection, doc.id, { _fieldMeta: updatedMeta });\n return c.json(updatedMeta);\n } catch (e) {\n return c.json({ error: String(e) }, 400);\n }\n });\n\n // Unlock all fields\n app.put('/:collection/:slug/_fieldMeta/unlock-all', async (c) => {\n const collection = c.req.param('collection');\n const slug = c.req.param('slug');\n try {\n const doc = await content.findBySlug(collection, slug);\n if (!doc) return c.json({ error: 'Not found' }, 404);\n\n const updatedMeta: DocumentFieldMeta = {};\n for (const [field, meta] of Object.entries(doc._fieldMeta ?? {})) {\n updatedMeta[field] = {\n ...meta,\n lockedBy: undefined,\n lockedAt: undefined,\n userId: undefined,\n reason: undefined,\n };\n }\n\n await content.update(collection, doc.id, { _fieldMeta: updatedMeta });\n return c.json(updatedMeta);\n } catch (e) {\n return c.json({ error: String(e) }, 400);\n }\n });\n\n // Get by slug (no _fieldMeta in response)\n app.get('/:collection/:slug', async (c) => {\n const collection = c.req.param('collection');\n const slug = c.req.param('slug');\n\n try {\n const doc = await content.findBySlug(collection, slug);\n if (!doc) return c.json({ error: 'Not found' }, 404);\n return c.json(stripFieldMeta(doc));\n } catch (e) {\n return c.json({ error: String(e) }, 404);\n }\n });\n\n // Create (actor: user)\n app.post('/:collection', async (c) => {\n const collection = c.req.param('collection');\n try {\n const body = await c.req.json() as { slug?: string; status?: 'draft' | 'published' | 'archived'; data: Record<string, unknown> };\n const doc = await content.create(collection, {\n slug: body.slug,\n status: body.status,\n data: body.data,\n }, { actor: 'user' });\n return c.json(stripFieldMeta(doc), 201);\n } catch (e) {\n return c.json({ error: String(e) }, 400);\n }\n });\n\n // Update (actor: user)\n app.put('/:collection/:slug', async (c) => {\n const collection = c.req.param('collection');\n const slug = c.req.param('slug');\n\n try {\n const existing = await content.findBySlug(collection, slug);\n if (!existing) return c.json({ error: 'Not found' }, 404);\n\n const body = await c.req.json() as { slug?: string; status?: 'draft' | 'published' | 'archived'; data?: Record<string, unknown> };\n const doc = await content.update(collection, existing.id, {\n slug: body.slug,\n status: body.status,\n data: body.data,\n }, { actor: 'user' });\n return c.json(stripFieldMeta(doc));\n } catch (e) {\n return c.json({ error: String(e) }, 400);\n }\n });\n\n // Delete\n app.delete('/:collection/:slug', async (c) => {\n const collection = c.req.param('collection');\n const slug = c.req.param('slug');\n\n try {\n const existing = await content.findBySlug(collection, slug);\n if (!existing) return c.json({ error: 'Not found' }, 404);\n await content.delete(collection, existing.id, { actor: 'user' });\n return c.json({ success: true });\n } catch (e) {\n return c.json({ error: String(e) }, 400);\n }\n });\n\n return app;\n}\n","import { Hono } from 'hono';\nimport type { CmsConfig } from '../../schema/types.js';\nimport { collectionToJsonSchema } from '../../schema/introspect.js';\n\nexport function createSchemaRoutes(config: CmsConfig) {\n const app = new Hono();\n\n app.get('/', (c) => {\n const schemas = config.collections.map(col => ({\n name: col.name,\n label: col.label ?? col.name,\n slug: col.slug ?? col.name,\n jsonSchema: collectionToJsonSchema(col),\n }));\n return c.json({ collections: schemas, blocks: config.blocks ?? [] });\n });\n\n app.get('/:collection', (c) => {\n const name = c.req.param('collection');\n const col = config.collections.find(col => col.name === name);\n if (!col) return c.json({ error: 'Collection not found' }, 404);\n return c.json({\n name: col.name,\n label: col.label ?? col.name,\n jsonSchema: collectionToJsonSchema(col),\n });\n });\n\n return app;\n}\n","import { Hono } from 'hono';\nimport type { CmsConfig } from '../../schema/types.js';\nimport { configToManifest } from '../../schema/introspect.js';\n\nexport function createManifestRoutes(config: CmsConfig) {\n const app = new Hono();\n\n app.get('/', (c) => {\n return c.json(configToManifest(config));\n });\n\n return app;\n}\n","import { join } from 'node:path';\nimport { writeFileSync, mkdirSync, existsSync, readdirSync, readFileSync } from 'node:fs';\nimport type { StorageAdapter } from '../storage/types.js';\nimport type { CmsConfig } from '../schema/types.js';\nimport { resolveSite } from './resolve.js';\nimport { renderSite } from './render.js';\nimport { writeOutput } from './output.js';\nimport { generateSitemap } from './sitemap.js';\nimport { applyAutolinks } from './autolink.js';\nimport { generateLlmsTxt } from './llms.js';\nimport { generateAiPlugin } from './ai-plugin.js';\n\nexport interface BuildOptions {\n outDir?: string;\n}\n\nexport interface BuildResult {\n pages: number;\n outDir: string;\n duration: number;\n}\n\nexport async function runBuild(\n config: CmsConfig,\n storage: StorageAdapter,\n options: BuildOptions = {},\n): Promise<BuildResult> {\n const start = Date.now();\n const outDir = options.outDir ?? config.build?.outDir ?? 'dist';\n\n // Phase 1: Resolve\n const context = await resolveSite(config, storage);\n\n // Phase 2: Render\n const pages = await renderSite(context);\n\n // Phase 3: Output\n writeOutput(pages, { outDir });\n\n // Phase 4: Sitemap\n const baseUrl = config.build?.baseUrl ?? 'https://example.com';\n const sitemap = generateSitemap(context, baseUrl);\n if (!existsSync(outDir)) mkdirSync(outDir, { recursive: true });\n writeFileSync(join(outDir, 'sitemap.xml'), sitemap, 'utf-8');\n\n // Phase 5: Autolinks — post-process all HTML files\n if (config.autolinks && config.autolinks.length > 0) {\n const htmlFiles = readdirSync(outDir)\n .filter(f => f.endsWith('.html'))\n .map(f => join(outDir, f));\n for (const file of htmlFiles) {\n const original = readFileSync(file, 'utf-8');\n const linked = applyAutolinks(original, config.autolinks);\n if (linked !== original) writeFileSync(file, linked, 'utf-8');\n }\n }\n\n // Phase 6: AI access files — llms.txt + .well-known/ai-plugin.json\n const llmsTxt = generateLlmsTxt(context, baseUrl);\n writeFileSync(join(outDir, 'llms.txt'), llmsTxt, 'utf-8');\n\n const wellKnownDir = join(outDir, '.well-known');\n if (!existsSync(wellKnownDir)) mkdirSync(wellKnownDir, { recursive: true });\n writeFileSync(join(wellKnownDir, 'ai-plugin.json'), generateAiPlugin(context, baseUrl), 'utf-8');\n\n return {\n pages: pages.length,\n outDir,\n duration: Date.now() - start,\n };\n}\n","import type { StorageAdapter, Document } from '../storage/types.js';\nimport type { CmsConfig } from '../schema/types.js';\n\nexport interface SiteContext {\n config: CmsConfig;\n collections: Record<string, Document[]>;\n}\n\nexport async function resolveSite(config: CmsConfig, storage: StorageAdapter): Promise<SiteContext> {\n const collections: Record<string, Document[]> = {};\n\n for (const collection of config.collections) {\n const { documents } = await storage.findMany(collection.name, {\n status: 'published',\n limit: 10000,\n });\n collections[collection.name] = documents;\n }\n\n return { config, collections };\n}\n","import { marked } from 'marked';\nimport { html, raw } from '../template/engine.js';\nimport { layoutTemplate } from '../template/builtins/layout.js';\nimport type { SiteContext } from './resolve.js';\nimport type { Document } from '../storage/types.js';\nimport { formatDate } from '../utils/date.js';\nimport { getDocumentUrl, getCollectionIndexUrl } from '../routing/resolver.js';\n\nexport interface RenderedPage {\n path: string;\n content: string;\n}\n\nfunction getSiteTitle(context: SiteContext): string {\n return String((context.config.build as Record<string, unknown> | undefined)?.['siteTitle'] ?? 'My Site');\n}\n\nasync function renderDocument(doc: Document, context: SiteContext): Promise<string> {\n const title = String(doc.data['title'] ?? doc.slug);\n const content = String(doc.data['content'] ?? doc.data['body'] ?? '');\n const excerpt = String(doc.data['excerpt'] ?? '');\n const date = doc.data['date'] ? formatDate(String(doc.data['date'])) : formatDate(doc.createdAt);\n\n const rendered = content ? await marked(content, { gfm: true }) : '';\n\n return html`\n<article>\n <header class=\"post-header\">\n <h1>${title}</h1>\n <p class=\"post-meta\">${date}</p>\n ${excerpt ? raw(html`<p class=\"excerpt\">${excerpt}</p>`) : ''}\n </header>\n <div class=\"prose\">\n ${raw(rendered)}\n </div>\n</article>`;\n}\n\nfunction renderCollectionIndex(\n collectionName: string,\n documents: Document[],\n context: SiteContext,\n allDocsMap: Map<string, Document>,\n): string {\n const collectionConfig = context.config.collections.find(c => c.name === collectionName);\n const label = collectionConfig?.label ?? collectionName;\n\n const cards = documents.map(doc => {\n const title = String(doc.data['title'] ?? doc.slug);\n const excerpt = String(doc.data['excerpt'] ?? '');\n const date = doc.data['date'] ? formatDate(String(doc.data['date'])) : formatDate(doc.createdAt);\n const href = collectionConfig\n ? getDocumentUrl(doc, collectionConfig, allDocsMap)\n : `/${collectionName}/${doc.slug}/`;\n return html`\n<article class=\"card\">\n <h2><a href=\"${href}\">${title}</a></h2>\n <p class=\"meta\">${date}</p>\n ${excerpt ? raw(html`<p class=\"excerpt\">${excerpt}</p>`) : ''}\n</article>`;\n }).join('\\n');\n\n return html`\n<section>\n <h1>${label}</h1>\n <div class=\"card-grid\">\n ${raw(cards)}\n </div>\n</section>`;\n}\n\nfunction renderHomePage(context: SiteContext, allDocsMap: Map<string, Document>): string {\n const siteTitle = getSiteTitle(context);\n const sections = Object.entries(context.collections).map(([name, docs]) => {\n const collectionConfig = context.config.collections.find(c => c.name === name);\n const label = collectionConfig?.label ?? name;\n if (docs.length === 0) return '';\n\n const items = docs.slice(0, 3).map(doc => {\n const title = String(doc.data['title'] ?? doc.slug);\n const href = collectionConfig\n ? getDocumentUrl(doc, collectionConfig, allDocsMap)\n : `/${name}/${doc.slug}/`;\n return html`<li><a href=\"${href}\">${title}</a></li>`;\n }).join('\\n');\n\n const indexUrl = collectionConfig\n ? getCollectionIndexUrl(collectionConfig)\n : `/${name}/`;\n\n return html`\n<section style=\"margin-bottom:2rem\">\n <h2>${label}</h2>\n <ul style=\"margin-top:1rem\">${raw(items)}</ul>\n <a href=\"${indexUrl}\" style=\"display:inline-block;margin-top:0.75rem\">View all ${label} →</a>\n</section>`;\n }).join('\\n');\n\n return html`\n<section class=\"hero\">\n <h1>${siteTitle}</h1>\n <p>Welcome to your CMS-powered site.</p>\n</section>\n<section>\n ${raw(sections)}\n</section>`;\n}\n\n/** Build a locale → absolute-URL map for all known translations of a document */\nfunction buildAlternates(\n doc: Document,\n collectionName: string,\n allDocs: Document[],\n collectionConfig: ReturnType<typeof Array.prototype.find> | undefined,\n allDocsMap: Map<string, Document>,\n baseUrl: string,\n): Record<string, string> {\n const base = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n const sourceSlug = doc.translationOf ?? doc.slug;\n const siblings = allDocs.filter(\n d => d.collection === collectionName && (d.slug === sourceSlug || d.translationOf === sourceSlug),\n );\n const alternates: Record<string, string> = {};\n for (const s of siblings) {\n if (!s.locale) continue;\n const url = collectionConfig\n ? getDocumentUrl(s, collectionConfig, allDocsMap)\n : `/${collectionName}/${s.slug}/`;\n alternates[s.locale] = `${base}${url}`;\n }\n return alternates;\n}\n\nexport async function renderSite(context: SiteContext): Promise<RenderedPage[]> {\n const pages: RenderedPage[] = [];\n const siteTitle = getSiteTitle(context);\n const baseUrl = context.config.build?.baseUrl ?? '/';\n\n // Build a global map of all documents for parent-child traversal\n const allDocsMap = new Map<string, Document>();\n for (const docs of Object.values(context.collections)) {\n for (const doc of docs) allDocsMap.set(doc.id, doc);\n }\n\n // Build nav links from all collections\n const nav = context.config.collections.map(col => ({\n label: col.label ?? col.name,\n href: getCollectionIndexUrl(col),\n }));\n const siteLang = context.config.defaultLocale ?? 'en';\n const siteContext = { title: siteTitle, baseUrl, nav, lang: siteLang };\n\n // Flat list of all documents for alternates lookup\n const allDocsList = Object.values(context.collections).flat();\n\n // Home page\n const homeContent = renderHomePage(context, allDocsMap);\n pages.push({\n path: 'index.html',\n content: layoutTemplate(homeContent, {\n site: siteContext,\n page: { title: 'Home' },\n }),\n });\n\n // Collection index + individual pages\n for (const [collectionName, documents] of Object.entries(context.collections)) {\n const collectionConfig = context.config.collections.find(c => c.name === collectionName);\n\n // Collection index path\n const indexUrl = collectionConfig\n ? getCollectionIndexUrl(collectionConfig)\n : `/${collectionName}/`;\n // Convert URL like /foo/ to foo/index.html\n const indexPath = `${indexUrl.replace(/^\\//, '')}index.html`;\n\n const indexContent = renderCollectionIndex(collectionName, documents, context, allDocsMap);\n pages.push({\n path: indexPath,\n content: layoutTemplate(indexContent, {\n site: siteContext,\n page: {\n title: collectionConfig?.label ?? collectionName,\n collection: collectionName,\n },\n }),\n });\n\n // Individual documents\n for (const doc of documents) {\n const docContent = await renderDocument(doc, context);\n const title = String(doc.data['title'] ?? doc.slug);\n const description = String(doc.data['excerpt'] ?? doc.data['description'] ?? '').slice(0, 160) || undefined;\n const seoData = doc.data['_seo'] as Record<string, unknown> | undefined;\n\n const docUrl = collectionConfig\n ? getDocumentUrl(doc, collectionConfig, allDocsMap)\n : `/${collectionName}/${doc.slug}/`;\n\n // Convert URL like /foo/bar/ to foo/bar/index.html\n const docPath = `${docUrl.replace(/^\\//, '')}index.html`;\n\n const canonicalBase = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n const canonicalUrl = `${canonicalBase}${docUrl}`;\n\n const docLang =\n doc.locale ??\n collectionConfig?.sourceLocale ??\n context.config.defaultLocale;\n\n const alternates = buildAlternates(\n doc, collectionName, allDocsList, collectionConfig, allDocsMap, baseUrl,\n );\n\n pages.push({\n path: docPath,\n content: layoutTemplate(docContent, {\n site: siteContext,\n page: {\n title: String(seoData?.['metaTitle'] ?? title),\n collection: collectionName,\n slug: doc.slug,\n description: String(seoData?.['metaDescription'] ?? description ?? ''),\n canonicalUrl,\n jsonLd: seoData?.['jsonLd'] as Record<string, unknown> | undefined,\n lang: docLang,\n alternates: Object.keys(alternates).length > 0 ? alternates : undefined,\n },\n }),\n });\n }\n }\n\n return pages;\n}\n","export interface SafeHtml {\n __html: string;\n}\n\nexport function raw(html: string): SafeHtml {\n return { __html: html };\n}\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nfunction processValue(value: unknown): string {\n if (value === null || value === undefined) return '';\n if (typeof value === 'object' && '__html' in (value as object)) {\n return (value as SafeHtml).__html;\n }\n return escapeHtml(String(value));\n}\n\nexport function html(strings: TemplateStringsArray, ...values: unknown[]): string {\n let result = '';\n for (let i = 0; i < strings.length; i++) {\n result += strings[i] ?? '';\n if (i < values.length) {\n result += processValue(values[i]);\n }\n }\n return result;\n}\n","import { html, raw } from '../engine.js';\nimport type { TemplateContext } from '../types.js';\n\nexport function layoutTemplate(content: string, context: TemplateContext): string {\n const pageTitle = context.page.title;\n const siteTitle = context.site.title;\n const description = context.page.description;\n const canonicalUrl = context.page.canonicalUrl;\n const jsonLd = context.page.jsonLd;\n const ogImage = context.page.ogImage;\n const lang = context.page.lang ?? context.site.lang ?? 'en';\n const alternates = context.page.alternates ?? {};\n\n return html`<!DOCTYPE html>\n<html lang=\"${lang}\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>${pageTitle} — ${siteTitle}</title>\n ${description ? raw(`<meta name=\"description\" content=\"${description}\">`) : ''}\n <meta property=\"og:title\" content=\"${pageTitle} — ${siteTitle}\">\n ${description ? raw(`<meta property=\"og:description\" content=\"${description}\">`) : ''}\n <meta property=\"og:type\" content=\"website\">\n ${ogImage ? raw(`<meta property=\"og:image\" content=\"${ogImage}\">`) : ''}\n ${canonicalUrl ? raw(`<link rel=\"canonical\" href=\"${canonicalUrl}\">`) : ''}\n ${raw(Object.entries(alternates).map(([l, u]) => `<link rel=\"alternate\" hreflang=\"${l}\" href=\"${u}\">`).join('\\n '))}\n ${jsonLd ? raw(`<script type=\"application/ld+json\">${JSON.stringify(jsonLd)}</script>`) : ''}\n <style>\n :root {\n --color-bg: #ffffff;\n --color-fg: #111827;\n --color-primary: #2563eb;\n --color-muted: #6b7280;\n --color-border: #e5e7eb;\n --font-sans: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n --font-mono: 'Courier New', monospace;\n --font-size-base: 1rem;\n --line-height-base: 1.7;\n --spacing-base: 1rem;\n --spacing-section: clamp(2rem, 5vw, 4rem);\n --max-width: 72rem;\n --radius: 0.5rem;\n }\n *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n body { font-family: var(--font-sans); background: var(--color-bg); color: var(--color-fg); font-size: var(--font-size-base); line-height: var(--line-height-base); }\n a { color: var(--color-primary); }\n img { max-width: 100%; height: auto; }\n .container { max-width: var(--max-width); margin: 0 auto; padding: 0 var(--spacing-base); }\n header { border-bottom: 1px solid var(--color-border); padding: 1rem 0; margin-bottom: 2rem; }\n header nav { display: flex; align-items: center; flex-wrap: wrap; position: relative; }\n header .site-title { font-weight: 700; font-size: 1.25rem; text-decoration: none; color: var(--color-fg); flex: 1; }\n .nav-toggle { display: none; }\n .nav-burger { display: flex; flex-direction: column; gap: 4px; cursor: pointer; padding: 0.5rem; margin: -0.5rem; }\n .nav-burger span { display: block; width: 20px; height: 2px; background: var(--color-fg); transition: transform 0.2s, opacity 0.2s; }\n .nav-links { display: none; width: 100%; flex-direction: column; gap: 0; padding-top: 0.75rem; }\n .nav-toggle:checked ~ .nav-links { display: flex; }\n .nav-toggle:checked ~ .nav-burger span:nth-child(1) { transform: rotate(45deg) translate(4px, 4px); }\n .nav-toggle:checked ~ .nav-burger span:nth-child(2) { opacity: 0; }\n .nav-toggle:checked ~ .nav-burger span:nth-child(3) { transform: rotate(-45deg) translate(4px, -4px); }\n header nav a.nav-link { text-decoration: none; color: var(--color-muted); font-size: 0.9375rem; transition: color 0.15s; padding: 0.75rem 0; display: block; }\n header nav a.nav-link:hover { color: var(--color-fg); }\n @media (min-width: 768px) {\n .nav-burger { display: none; }\n .nav-links { display: flex; width: auto; flex-direction: row; gap: 2rem; padding-top: 0; margin-left: 2rem; }\n header nav a.nav-link { padding: 0; display: inline; }\n }\n main { padding: var(--spacing-section) 0; }\n footer { border-top: 1px solid var(--color-border); padding: 1.5rem 0; margin-top: var(--spacing-section); color: var(--color-muted); font-size: 0.875rem; }\n .prose h1 { font-size: clamp(1.75rem, 4vw, 2.25rem); font-weight: 800; line-height: 1.2; margin-bottom: 1rem; }\n .prose h2 { font-size: clamp(1.25rem, 3vw, 1.5rem); font-weight: 700; margin: 2rem 0 0.75rem; }\n .prose h3 { font-size: clamp(1.1rem, 2.5vw, 1.25rem); font-weight: 600; margin: 1.5rem 0 0.5rem; }\n .prose p { margin-bottom: 1.25rem; }\n .prose pre { background: #1e293b; color: #e2e8f0; padding: 1rem; border-radius: var(--radius); overflow-x: auto; margin-bottom: 1.25rem; font-family: var(--font-mono); font-size: clamp(0.75rem, 1.5vw, 0.875rem); }\n .prose code { background: #f1f5f9; padding: 0.125rem 0.375rem; border-radius: 0.25rem; font-family: var(--font-mono); font-size: 0.875em; }\n .prose pre code { background: none; padding: 0; }\n .prose ul, .prose ol { padding-left: 1.5rem; margin-bottom: 1.25rem; }\n .prose li { margin-bottom: 0.375rem; }\n .prose blockquote { border-left: 4px solid var(--color-primary); padding-left: 1rem; margin: 1.5rem 0; color: var(--color-muted); }\n .prose img { border-radius: var(--radius); margin: 1.5rem 0; }\n .card-grid { display: grid; grid-template-columns: 1fr; gap: 1.25rem; }\n @media (min-width: 640px) {\n .card-grid { grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 1.5rem; }\n }\n .card { border: 1px solid var(--color-border); border-radius: var(--radius); padding: 1.5rem; transition: box-shadow 0.2s; }\n .card:hover { box-shadow: 0 4px 12px rgba(0,0,0,0.08); }\n .card h2 { font-size: 1.125rem; font-weight: 600; margin-bottom: 0.5rem; }\n .card h2 a { text-decoration: none; color: var(--color-fg); }\n .card h2 a:hover { color: var(--color-primary); }\n .card .meta { color: var(--color-muted); font-size: 0.875rem; margin-bottom: 0.75rem; }\n .card .excerpt { color: var(--color-muted); font-size: 0.9375rem; }\n .hero { padding: var(--spacing-section) 0; text-align: center; }\n .hero h1 { font-size: clamp(2rem, 6vw, 3rem); font-weight: 800; margin-bottom: 1rem; }\n .hero p { font-size: clamp(1rem, 2.5vw, 1.25rem); color: var(--color-muted); max-width: 42rem; margin: 0 auto 2rem; }\n .btn { display: inline-block; padding: 0.75rem 1.5rem; background: var(--color-primary); color: #fff; border-radius: var(--radius); text-decoration: none; font-weight: 600; }\n .btn:hover { opacity: 0.9; }\n .post-header { margin-bottom: 2rem; }\n .post-header h1 { font-size: clamp(1.75rem, 5vw, 2.5rem); font-weight: 800; line-height: 1.2; margin-bottom: 0.5rem; }\n .post-meta { color: var(--color-muted); font-size: 0.875rem; }\n </style>\n</head>\n<body>\n <header>\n <div class=\"container\">\n <nav>\n <a href=\"/\" class=\"site-title\">${context.site.title}</a>\n <input type=\"checkbox\" id=\"nav-toggle\" class=\"nav-toggle\" aria-hidden=\"true\">\n <label for=\"nav-toggle\" class=\"nav-burger\" aria-label=\"Menu\"><span></span><span></span><span></span></label>\n <div class=\"nav-links\">\n ${raw((context.site.nav ?? []).map(item => html`<a href=\"${item.href}\" class=\"nav-link\">${item.label}</a>`).join('\\n'))}\n </div>\n </nav>\n </div>\n </header>\n <main>\n <div class=\"container\">\n ${raw(content)}\n </div>\n </main>\n <footer>\n <div class=\"container\">\n <p>Built with @webhouse/cms</p>\n </div>\n </footer>\n</body>\n</html>`;\n}\n","import type { Document } from '../storage/types.js';\nimport type { CollectionConfig } from '../schema/types.js';\n\nexport function getDocumentUrl(\n doc: Document,\n collection: CollectionConfig,\n allDocs?: Map<string, Document>,\n): string {\n // If slug contains '/', it's already a hierarchical path\n if (doc.slug.includes('/')) {\n return `/${doc.slug}/`;\n }\n\n // If collection has urlPrefix '/', skip collection name\n const prefix = collection.urlPrefix ?? `/${collection.name}`;\n const cleanPrefix = prefix.endsWith('/') ? prefix.slice(0, -1) : prefix;\n\n // If collection has parentField, traverse the parent chain\n if (collection.parentField && allDocs) {\n const parentId = doc.data[collection.parentField] as string | undefined;\n if (parentId) {\n const parentDoc = allDocs.get(parentId);\n if (parentDoc) {\n const parentUrl = getDocumentUrl(parentDoc, collection, allDocs);\n const parentPath = parentUrl.endsWith('/') ? parentUrl.slice(0, -1) : parentUrl;\n return `${parentPath}/${doc.slug}/`;\n }\n }\n }\n\n return `${cleanPrefix}/${doc.slug}/`;\n}\n\nexport function getCollectionIndexUrl(collection: CollectionConfig): string {\n const prefix = collection.urlPrefix ?? `/${collection.name}`;\n return prefix.endsWith('/') ? prefix : `${prefix}/`;\n}\n","import { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport type { RenderedPage } from './render.js';\n\nexport interface OutputOptions {\n outDir: string;\n}\n\nexport function writeOutput(pages: RenderedPage[], options: OutputOptions): void {\n const { outDir } = options;\n\n for (const page of pages) {\n const filePath = join(outDir, page.path);\n const dir = dirname(filePath);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n writeFileSync(filePath, page.content, 'utf-8');\n }\n}\n","import type { SiteContext } from './resolve.js';\nimport { getDocumentUrl, getCollectionIndexUrl } from '../routing/resolver.js';\n\nexport function generateSitemap(context: SiteContext, baseUrl: string): string {\n const urls: string[] = [];\n const base = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;\n\n const seen = new Set<string>();\n const addUrl = (url: string) => {\n if (!seen.has(url)) {\n seen.add(url);\n urls.push(url);\n }\n };\n\n addUrl(`${base}/`);\n\n for (const col of context.config.collections) {\n addUrl(`${base}${getCollectionIndexUrl(col)}`);\n const docs = context.collections[col.name] ?? [];\n const allDocsMap = new Map(docs.map(d => [d.id, d]));\n for (const doc of docs) {\n addUrl(`${base}${getDocumentUrl(doc, col, allDocsMap)}`);\n }\n }\n\n const entries = urls.map(url => ` <url><loc>${url}</loc></url>`).join('\\n');\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\\n${entries}\\n</urlset>`;\n}\n","import type { AutolinkConfig } from '../schema/types.js';\n\n/**\n * Apply automatic internal linking to an HTML string.\n *\n * Rules:\n * - Terms are matched case-sensitively\n * - Longest term wins (prevents \"cms\" from matching before \"@webhouse/cms\")\n * - First occurrence per page only\n * - Never links inside existing <a> tags\n * - Never links inside <h1>–<h6> headings\n * - External hrefs (starting with \"http\") get target=\"_blank\" rel=\"noopener noreferrer\"\n */\nexport function applyAutolinks(html: string, autolinks: AutolinkConfig[]): string {\n if (!autolinks || autolinks.length === 0) return html;\n\n // Sort longest term first to prevent partial matches consuming longer terms\n const sorted = [...autolinks].sort((a, b) => b.term.length - a.term.length);\n\n // Track which terms have already been linked on this page\n const used = new Set<string>();\n\n let result = '';\n let pos = 0;\n let inAnchor = 0;\n let inHeading = 0;\n\n // Match any HTML tag\n const tagRegex = /<(\\/?)([\\w-]+)[^>]*>/g;\n\n while (pos < html.length) {\n tagRegex.lastIndex = pos;\n const tagMatch = tagRegex.exec(html);\n\n if (!tagMatch) {\n // Remaining content is plain text\n const text = html.slice(pos);\n result += (inAnchor > 0 || inHeading > 0)\n ? text\n : replaceTerms(text, sorted, used);\n break;\n }\n\n // Process text before this tag\n const textBefore = html.slice(pos, tagMatch.index);\n result += (inAnchor > 0 || inHeading > 0)\n ? textBefore\n : replaceTerms(textBefore, sorted, used);\n\n // Track tag context\n const isClosing = tagMatch[1] === '/';\n const tagName = tagMatch[2].toLowerCase();\n\n if (tagName === 'a') {\n inAnchor += isClosing ? -1 : 1;\n } else if (/^h[1-6]$/.test(tagName)) {\n inHeading += isClosing ? -1 : 1;\n }\n\n result += tagMatch[0];\n pos = tagMatch.index + tagMatch[0].length;\n }\n\n return result;\n}\n\nfunction replaceTerms(text: string, autolinks: AutolinkConfig[], used: Set<string>): string {\n if (!text.trim()) return text;\n\n // Single-pass: collect all match positions on the ORIGINAL text first,\n // then replace from a single sweep — prevents href values from being re-matched.\n const matches: Array<{ start: number; end: number; link: AutolinkConfig }> = [];\n\n for (const link of autolinks) {\n if (used.has(link.term)) continue;\n // Find first occurrence that doesn't overlap an already-claimed match\n let searchFrom = 0;\n let idx = text.indexOf(link.term, searchFrom);\n while (idx !== -1) {\n const overlaps = matches.some(m => idx < m.end && idx + link.term.length > m.start);\n if (!overlaps) {\n matches.push({ start: idx, end: idx + link.term.length, link });\n break;\n }\n searchFrom = idx + 1;\n idx = text.indexOf(link.term, searchFrom);\n }\n }\n\n if (matches.length === 0) return text;\n\n // Sort by start position\n matches.sort((a, b) => a.start - b.start);\n\n let result = '';\n let pos = 0;\n for (const match of matches) {\n result += text.slice(pos, match.start);\n const isExternal = match.link.href.startsWith('http');\n const attrs = [\n `href=\"${match.link.href}\"`,\n match.link.title ? `title=\"${match.link.title}\"` : '',\n isExternal ? 'target=\"_blank\" rel=\"noopener noreferrer\"' : '',\n ].filter(Boolean).join(' ');\n result += `<a ${attrs}>${match.link.term}</a>`;\n used.add(match.link.term);\n pos = match.end;\n }\n result += text.slice(pos);\n return result;\n}\n","import type { SiteContext } from './resolve.js';\n\n/**\n * Generates /llms.txt content — a machine-readable index for AI agents.\n * Format follows the emerging llms.txt standard.\n */\nexport function generateLlmsTxt(context: SiteContext, baseUrl: string): string {\n const { config, collections } = context;\n const siteName = (config.build as Record<string, unknown> | undefined)?.['siteTitle'] as string | undefined ?? 'Site';\n const siteDesc = (config.build as Record<string, unknown> | undefined)?.['siteDescription'] as string | undefined;\n\n const lines: string[] = [];\n\n // Header\n lines.push(`# ${siteName}`);\n lines.push('');\n if (siteDesc) {\n lines.push(`> ${siteDesc}`);\n lines.push('');\n }\n\n // MCP section\n lines.push('## MCP Access');\n lines.push(`- MCP endpoint: ${baseUrl}/mcp`);\n lines.push('- Protocol: Model Context Protocol (SSE transport)');\n lines.push('- Auth: none required');\n lines.push(`- Docs: ${baseUrl}/mcp/info`);\n lines.push('');\n\n // Collections section\n lines.push('## Collections');\n for (const col of config.collections) {\n const docs = collections[col.name] ?? [];\n const label = col.label ?? col.name;\n lines.push(`- ${col.name}: ${label} (${docs.length} published documents)`);\n }\n lines.push('');\n\n // Recent content\n const allDocs = Object.entries(collections).flatMap(([col, docs]) =>\n docs.map(d => ({ col, doc: d })),\n );\n allDocs.sort((a, b) =>\n new Date(b.doc.updatedAt).getTime() - new Date(a.doc.updatedAt).getTime(),\n );\n const recent = allDocs.slice(0, 20);\n\n if (recent.length > 0) {\n lines.push('## Recent Content');\n for (const { col, doc } of recent) {\n const title = String(doc.data['title'] ?? doc.data['name'] ?? doc.slug);\n const urlPath = col === 'global' ? `/${doc.slug}` : `/${col}/${doc.slug}`;\n lines.push(`- [${title}](${baseUrl}${urlPath})`);\n }\n lines.push('');\n }\n\n // Locale info\n if (config.defaultLocale) {\n lines.push('## Locale');\n lines.push(`- Default language: ${config.defaultLocale}`);\n if (config.locales && config.locales.length > 1) {\n lines.push(`- Available: ${config.locales.join(', ')}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n","import type { SiteContext } from './resolve.js';\n\n/**\n * Generates /.well-known/ai-plugin.json — the OpenAI/Anthropic plugin manifest.\n * Advertises the MCP endpoint for AI agent discovery.\n */\nexport function generateAiPlugin(context: SiteContext, baseUrl: string): string {\n const { config } = context;\n const siteName = (config.build as Record<string, unknown> | undefined)?.['siteTitle'] as string | undefined ?? 'Site';\n const siteDesc = (config.build as Record<string, unknown> | undefined)?.['siteDescription'] as string | undefined ?? `Published content from ${siteName}`;\n\n const nameForModel = siteName\n .toLowerCase()\n .replace(/[^a-z0-9_]/g, '_')\n .replace(/_+/g, '_')\n .slice(0, 50);\n\n const manifest = {\n schema_version: 'v1',\n name_for_model: nameForModel,\n name_for_human: `${siteName} CMS`,\n description_for_model: `Access published content from ${siteName}. Use get_site_summary first to discover available collections, then list_collection or search_content to find relevant content, and get_page to retrieve full documents.`,\n description_for_human: siteDesc,\n auth: { type: 'none' },\n api: {\n type: 'mcp',\n url: `${baseUrl}/mcp`,\n },\n mcp: {\n endpoint: `${baseUrl}/mcp`,\n transport: 'sse',\n info: `${baseUrl}/mcp/info`,\n },\n logo_url: `${baseUrl}/favicon.ico`,\n contact_email: '',\n legal_info_url: '',\n };\n\n return JSON.stringify(manifest, null, 2);\n}\n"],"mappings":"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","names":["import_better_sqlite3","mkdirSync","existsSync","dirname","Database","now","import_hono","import_hono","col","import_hono","import_node_path","import_node_fs","html","import_node_fs","import_node_path","html","text"]}
|