@ubercode/chronicler 1.0.3 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -1,23 +1,45 @@
1
1
  #!/usr/bin/env node
2
- import { createRequire } from 'module';
3
- import path2 from 'path';
2
+ import path3 from 'path';
4
3
  import { Command } from 'commander';
5
- import fs2 from 'fs';
4
+ import fs3 from 'fs';
6
5
  import { pathToFileURL } from 'url';
7
- import { tsImport } from 'tsx/esm/api';
8
-
9
- createRequire(import.meta.url);
6
+ import esbuild from 'esbuild';
10
7
 
11
8
  // src/cli/config.ts
12
9
  var DEFAULT_DOCS_CONFIG = {
13
10
  outputPath: "./docs/chronicler-events.md",
14
11
  format: "markdown"
15
12
  };
13
+ async function importTsModule(filePath) {
14
+ const absolutePath = path3.resolve(filePath);
15
+ const result = await esbuild.build({
16
+ entryPoints: [absolutePath],
17
+ bundle: true,
18
+ format: "esm",
19
+ platform: "node",
20
+ target: "node20",
21
+ write: false,
22
+ packages: "external"
23
+ });
24
+ const code = result.outputFiles?.[0]?.text;
25
+ if (!code) {
26
+ throw new Error(`esbuild produced no output for ${filePath}`);
27
+ }
28
+ const tmpFile = absolutePath.replace(/\.ts$/, `.chronicler-tmp-${Date.now()}.mjs`);
29
+ try {
30
+ fs3.writeFileSync(tmpFile, code);
31
+ return await import(pathToFileURL(tmpFile).href);
32
+ } finally {
33
+ try {
34
+ fs3.unlinkSync(tmpFile);
35
+ } catch {
36
+ }
37
+ }
38
+ }
16
39
 
17
40
  // src/cli/config-loader.ts
18
41
  async function importConfigModule(configPath) {
19
- const configUrl = pathToFileURL(configPath).href;
20
- const configModule = await tsImport(configUrl, import.meta.url);
42
+ const configModule = await importTsModule(configPath);
21
43
  const config = configModule.default;
22
44
  if (!config) {
23
45
  throw new Error("chronicler.config.ts must have a default export");
@@ -31,8 +53,8 @@ async function importConfigModule(configPath) {
31
53
  };
32
54
  }
33
55
  async function loadConfig(cwd = process.cwd()) {
34
- const configPath = path2.join(cwd, "chronicler.config.ts");
35
- if (!fs2.existsSync(configPath)) {
56
+ const configPath = path3.join(cwd, "chronicler.config.ts");
57
+ if (!fs3.existsSync(configPath)) {
36
58
  throw new Error(
37
59
  `Configuration file not found: chronicler.config.ts
38
60
  Please create a chronicler.config.ts file in your project root.`
@@ -48,19 +70,19 @@ Please create a chronicler.config.ts file in your project root.`
48
70
  }
49
71
  }
50
72
  function validateEventsFile(config, cwd = process.cwd()) {
51
- const eventsFilePath = path2.resolve(cwd, config.eventsFile);
52
- if (!fs2.existsSync(eventsFilePath)) {
73
+ const eventsFilePath = path3.resolve(cwd, config.eventsFile);
74
+ if (!fs3.existsSync(eventsFilePath)) {
53
75
  throw new Error(`Events file not found: ${config.eventsFile}`);
54
76
  }
55
77
  }
56
78
  function generateDocs(tree, config) {
57
79
  const format = config.docs?.format ?? "markdown";
58
80
  const outputPath = config.docs?.outputPath ?? "./docs/chronicler-events.md";
59
- const resolved = path2.resolve(outputPath);
81
+ const resolved = path3.resolve(outputPath);
60
82
  const cwd = process.cwd();
61
83
  const normalizedResolved = resolved.toLowerCase();
62
84
  const normalizedCwd = cwd.toLowerCase();
63
- if (!normalizedResolved.startsWith(normalizedCwd + path2.sep) && normalizedResolved !== normalizedCwd) {
85
+ if (!normalizedResolved.startsWith(normalizedCwd + path3.sep) && normalizedResolved !== normalizedCwd) {
64
86
  throw new Error(`Output path "${outputPath}" resolves outside the project directory.`);
65
87
  }
66
88
  let content;
@@ -71,15 +93,15 @@ function generateDocs(tree, config) {
71
93
  } else {
72
94
  throw new Error(`Unknown format: ${String(format)}`);
73
95
  }
74
- const dir = path2.dirname(resolved);
75
- if (!fs2.existsSync(dir)) {
76
- fs2.mkdirSync(dir, { recursive: true });
96
+ const dir = path3.dirname(resolved);
97
+ if (!fs3.existsSync(dir)) {
98
+ fs3.mkdirSync(dir, { recursive: true });
77
99
  }
78
- const realDir = fs2.realpathSync(dir);
79
- if (!realDir.toLowerCase().startsWith(normalizedCwd + path2.sep) && realDir.toLowerCase() !== normalizedCwd) {
100
+ const realDir = fs3.realpathSync(dir);
101
+ if (!realDir.toLowerCase().startsWith(normalizedCwd + path3.sep) && realDir.toLowerCase() !== normalizedCwd) {
80
102
  throw new Error("Output directory resolves outside the project directory via symlink.");
81
103
  }
82
- fs2.writeFileSync(resolved, content, "utf-8");
104
+ fs3.writeFileSync(resolved, content, "utf-8");
83
105
  }
84
106
  function collectAllGroupEventKeys(groups) {
85
107
  const keys = /* @__PURE__ */ new Set();
@@ -358,13 +380,12 @@ function collectEventsFromGroup(rootGroup, seen) {
358
380
  return events;
359
381
  }
360
382
  async function parseEventsFile(filePath) {
361
- const absolutePath = path2.resolve(filePath);
383
+ const absolutePath = path3.resolve(filePath);
362
384
  const events = [];
363
385
  const groups = [];
364
386
  const errors = [];
365
387
  const seen = /* @__PURE__ */ new Set();
366
- const fileUrl = pathToFileURL(absolutePath).href;
367
- const mod = await tsImport(fileUrl, import.meta.url);
388
+ const mod = await importTsModule(absolutePath);
368
389
  for (const [exportName, value] of Object.entries(mod)) {
369
390
  if (isEventGroup(value)) {
370
391
  const parsed = convertGroup(value);
@@ -541,7 +562,7 @@ program.command("docs").description("Generate documentation from event definitio
541
562
  }
542
563
  });
543
564
  function resolveCwd(configPath) {
544
- return configPath ? path2.dirname(path2.resolve(configPath)) : void 0;
565
+ return configPath ? path3.dirname(path3.resolve(configPath)) : void 0;
545
566
  }
546
567
  function printValidateJson(tree, errors, elapsed) {
547
568
  const result = {
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/config.ts","../src/cli/config-loader.ts","../src/cli/generator/docs-generator.ts","../src/cli/parser/runtime-parser.ts","../src/core/constants.ts","../src/core/reserved.ts","../src/cli/parser/validator.ts","../src/cli/index.ts"],"names":["path","fs","pathToFileURL","tsImport"],"mappings":"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","file":"cli.js","sourcesContent":["/**\n * CLI configuration schema for Chronicler\n */\n\nexport interface ChroniclerCliConfig {\n /**\n * Path to the file containing event definitions\n * Relative to project root\n */\n readonly eventsFile: string;\n\n /**\n * Documentation generation options\n */\n readonly docs?: {\n /**\n * Output path for generated documentation\n * @default './docs/chronicler-events.md'\n */\n readonly outputPath?: string;\n\n /**\n * Documentation format\n * @default 'markdown'\n */\n readonly format?: 'markdown' | 'json';\n };\n}\n\nexport const DEFAULT_DOCS_CONFIG: Required<NonNullable<ChroniclerCliConfig['docs']>> = {\n outputPath: './docs/chronicler-events.md',\n format: 'markdown',\n};\n","/**\n * Configuration loader for Chronicler CLI\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nimport { tsImport } from 'tsx/esm/api';\n\nimport type { ChroniclerCliConfig } from './config';\nimport { DEFAULT_DOCS_CONFIG } from './config';\n\n/** Dynamically import and validate a chronicler config file via tsx loader. */\nasync function importConfigModule(configPath: string): Promise<ChroniclerCliConfig> {\n const configUrl = pathToFileURL(configPath).href;\n const configModule = (await tsImport(configUrl, import.meta.url)) as {\n default?: ChroniclerCliConfig;\n };\n const config = configModule.default;\n\n if (!config) {\n throw new Error('chronicler.config.ts must have a default export');\n }\n if (!config.eventsFile) {\n throw new Error('eventsFile is required in chronicler.config.ts');\n }\n\n return {\n eventsFile: config.eventsFile,\n docs: { ...DEFAULT_DOCS_CONFIG, ...config.docs },\n };\n}\n\n/**\n * Load Chronicler CLI configuration from chronicler.config.ts.\n *\n * **Security note:** This function dynamically imports a user-authored TypeScript\n * file, which executes arbitrary code. This is acceptable for a CLI tool that\n * the user invokes locally, but callers must never pass untrusted paths.\n *\n * @param cwd - Working directory to search for chronicler.config.ts (defaults to process.cwd())\n * @returns Resolved CLI configuration merged with defaults\n * @throws {Error} If the config file is missing, has no default export, or lacks required fields\n */\nexport async function loadConfig(cwd: string = process.cwd()): Promise<ChroniclerCliConfig> {\n const configPath = path.join(cwd, 'chronicler.config.ts');\n\n if (!fs.existsSync(configPath)) {\n throw new Error(\n `Configuration file not found: chronicler.config.ts\\n` +\n 'Please create a chronicler.config.ts file in your project root.',\n );\n }\n\n try {\n return await importConfigModule(configPath);\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to load config: ${error.message}`, { cause: error });\n }\n throw error;\n }\n}\n\n/**\n * Validate that the events file exists.\n *\n * @param config - CLI configuration containing the eventsFile path to validate\n * @param cwd - Working directory to resolve the eventsFile path against (defaults to process.cwd())\n * @throws {Error} If the events file does not exist at the resolved path\n */\nexport function validateEventsFile(config: ChroniclerCliConfig, cwd: string = process.cwd()): void {\n const eventsFilePath = path.resolve(cwd, config.eventsFile);\n\n if (!fs.existsSync(eventsFilePath)) {\n throw new Error(`Events file not found: ${config.eventsFile}`);\n }\n}\n","/**\n * Documentation generator for Chronicler events\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nimport type { EventDefinition } from '../../core/events';\nimport type { ChroniclerCliConfig } from '../config';\nimport type { ParsedEventGroup, ParsedEventTree } from '../types';\n\n/**\n * Generate documentation from parsed event tree.\n *\n * @param tree - Parsed event tree containing events and groups to document\n * @param config - CLI configuration specifying output format and file path\n * @throws {Error} If the output path resolves outside the project directory or the format is unknown\n */\n// eslint-disable-next-line complexity -- multiple output format branches and path-safety checks\nexport function generateDocs(tree: ParsedEventTree, config: ChroniclerCliConfig): void {\n const format = config.docs?.format ?? 'markdown';\n const outputPath = config.docs?.outputPath ?? './docs/chronicler-events.md';\n\n // Prevent path traversal: output must resolve within cwd.\n // Use fs.realpathSync where possible to resolve symlinks, and normalize\n // case on case-insensitive file systems (Windows).\n const resolved = path.resolve(outputPath);\n const cwd = process.cwd();\n const normalizedResolved = resolved.toLowerCase();\n const normalizedCwd = cwd.toLowerCase();\n if (\n !normalizedResolved.startsWith(normalizedCwd + path.sep) &&\n normalizedResolved !== normalizedCwd\n ) {\n throw new Error(`Output path \"${outputPath}\" resolves outside the project directory.`);\n }\n\n let content: string;\n\n if (format === 'markdown') {\n content = generateMarkdown(tree);\n } else if (format === 'json') {\n content = generateJSON(tree);\n } else {\n throw new Error(`Unknown format: ${String(format)}`);\n }\n\n // Ensure output directory exists\n const dir = path.dirname(resolved);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n // Re-validate after mkdir to catch symlinks that resolve outside cwd\n const realDir = fs.realpathSync(dir);\n if (\n !realDir.toLowerCase().startsWith(normalizedCwd + path.sep) &&\n realDir.toLowerCase() !== normalizedCwd\n ) {\n throw new Error('Output directory resolves outside the project directory via symlink.');\n }\n\n // Write output\n fs.writeFileSync(resolved, content, 'utf-8');\n}\n\n/** Collect all event keys from groups and their nested sub-groups. */\nfunction collectAllGroupEventKeys(groups: ParsedEventGroup[]): Set<string> {\n const keys = new Set<string>();\n const stack = [...groups];\n while (stack.length > 0) {\n const group = stack.pop()!;\n for (const event of Object.values(group.events)) {\n keys.add(event.key);\n }\n for (const nested of Object.values(group.groups)) {\n stack.push(nested);\n }\n }\n return keys;\n}\n\n/**\n * Generate Markdown documentation\n */\nfunction generateMarkdown(tree: ParsedEventTree): string {\n const lines: string[] = [];\n\n lines.push('# Chronicler Events');\n lines.push('');\n lines.push('> Auto-generated documentation from event definitions');\n lines.push('');\n\n // Table of contents\n if (tree.groups.length > 0) {\n lines.push('## Table of Contents');\n lines.push('');\n tree.groups.forEach((group) => {\n lines.push(`- [${group.key}](#${group.key.replace(/\\./g, '-').toLowerCase()})`);\n });\n lines.push('');\n lines.push('---');\n lines.push('');\n }\n\n // Document each group\n tree.groups.forEach((group) => {\n lines.push(...generateGroupMarkdown(group));\n });\n\n // Document standalone events (not in any group or nested sub-group)\n const groupEventKeys = collectAllGroupEventKeys(tree.groups);\n const standaloneEvents = tree.events.filter((event) => !groupEventKeys.has(event.key));\n\n if (standaloneEvents.length > 0) {\n lines.push('## Standalone Events');\n lines.push('');\n standaloneEvents.forEach((event) => {\n lines.push(...generateEventMarkdown(event));\n });\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Generate Markdown for an event group and its nested groups (iterative)\n */\n// eslint-disable-next-line max-lines-per-function -- Accepted deviation: iterative traversal with markdown assembly\nfunction generateGroupMarkdown(rootGroup: ParsedEventGroup, rootLevel = 2): string[] {\n const lines: string[] = [];\n const stack: { group: ParsedEventGroup; level: number }[] = [\n { group: rootGroup, level: rootLevel },\n ];\n\n while (stack.length > 0) {\n const { group, level } = stack.pop()!;\n const heading = '#'.repeat(Math.min(level, 6));\n\n lines.push(`${heading} ${group.key}`);\n lines.push('');\n\n if (group.type === 'correlation') {\n lines.push('**Type:** Correlation Group');\n if (group.timeout !== undefined) {\n lines.push(\n group.timeout === 0\n ? '**Timeout:** Disabled'\n : `**Timeout:** ${group.timeout}ms (activity-based)`,\n );\n }\n lines.push('');\n }\n\n if (group.doc) {\n lines.push(group.doc);\n lines.push('');\n }\n\n if (group.type === 'correlation') {\n lines.push('**Auto-Generated Events:**');\n lines.push('');\n lines.push(`- \\`${group.key}.start\\` - Logged when correlation starts`);\n lines.push(\n `- \\`${group.key}.complete\\` - Logged when correlation completes (includes \\`duration\\` field)`,\n );\n lines.push(\n `- \\`${group.key}.fail\\` - Logged when correlation fails (includes \\`duration\\` and \\`error\\` fields)`,\n );\n lines.push(\n `- \\`${group.key}.timeout\\` - Logged when correlation times out due to inactivity`,\n );\n lines.push('');\n }\n\n Object.values(group.events).forEach((event) => {\n lines.push(...generateEventMarkdown(event, level + 1));\n });\n\n // Push nested groups in reverse order so they process in original order\n const nestedEntries = Object.values(group.groups);\n for (let i = nestedEntries.length - 1; i >= 0; i--) {\n stack.push({ group: nestedEntries[i]!, level: level + 1 });\n }\n\n lines.push('---');\n lines.push('');\n }\n\n return lines;\n}\n\n/**\n * Generate Markdown for a single event\n */\nfunction generateEventMarkdown(event: EventDefinition, level = 3): string[] {\n const lines: string[] = [];\n const heading = '#'.repeat(Math.min(level, 6));\n\n lines.push(`${heading} ${event.key}`);\n lines.push('');\n lines.push(`**Level:** \\`${event.level}\\``);\n lines.push(`**Message:** \"${event.message}\"`);\n lines.push('');\n if (event.doc) {\n lines.push(event.doc);\n lines.push('');\n }\n\n if (event.fields && Object.keys(event.fields).length > 0) {\n lines.push('**Fields:**');\n lines.push('');\n\n Object.entries(event.fields).forEach(([name, field]) => {\n const required = field._required ? 'required' : 'optional';\n lines.push(`- **\\`${name}\\`** (\\`${field._type}\\`, ${required}): ${field._doc ?? ''}`);\n });\n\n lines.push('');\n }\n\n return lines;\n}\n\n/**\n * Generate JSON documentation\n */\nfunction generateJSON(tree: ParsedEventTree): string {\n const groupEventKeys = collectAllGroupEventKeys(tree.groups);\n const output = {\n generated: new Date().toISOString(),\n eventCount: tree.events.length,\n groupCount: tree.groups.length,\n groups: tree.groups.map((group) => serializeGroup(group)),\n standaloneEvents: tree.events\n .filter((event) => !groupEventKeys.has(event.key))\n .map((event) => serializeEvent(event)),\n };\n\n return JSON.stringify(output, null, 2);\n}\n\n/**\n * Serialize event group to JSON (iterative)\n */\nfunction serializeGroup(rootGroup: ParsedEventGroup): Record<string, unknown> {\n const resultMap = new Map<ParsedEventGroup, Record<string, unknown>>();\n // Process bottom-up: collect all groups first, then wire children\n const allGroups: ParsedEventGroup[] = [];\n const traverseStack: ParsedEventGroup[] = [rootGroup];\n\n while (traverseStack.length > 0) {\n const group = traverseStack.pop()!;\n allGroups.push(group);\n for (const nestedGroup of Object.values(group.groups)) {\n traverseStack.push(nestedGroup);\n }\n }\n\n // Process in reverse (leaf-first) so children are ready when parents reference them\n for (let i = allGroups.length - 1; i >= 0; i--) {\n const group = allGroups[i]!;\n resultMap.set(group, {\n key: group.key,\n type: group.type,\n doc: group.doc ?? '',\n timeout: group.timeout,\n autoEvents:\n group.type === 'correlation' ? ['start', 'complete', 'fail', 'timeout'] : undefined,\n events: Object.entries(group.events).map(([name, event]) => ({\n name,\n ...serializeEvent(event),\n })),\n groups: Object.entries(group.groups).map(([name, nestedGroup]) => ({\n name,\n ...resultMap.get(nestedGroup)!,\n })),\n });\n }\n\n return resultMap.get(rootGroup)!;\n}\n\n/**\n * Serialize event to JSON\n */\nfunction serializeEvent(event: EventDefinition): Record<string, unknown> {\n return {\n key: event.key,\n level: event.level,\n message: event.message,\n doc: event.doc ?? '',\n fields: event.fields\n ? Object.entries(event.fields).map(([name, field]) => ({\n name,\n type: field._type,\n required: field._required,\n doc: field._doc ?? '',\n }))\n : [],\n };\n}\n","/**\n * Runtime parser for extracting event definitions from TypeScript files.\n * Uses tsx/esm/api to dynamically import the file and inspect exports.\n */\n\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nimport { tsImport } from 'tsx/esm/api';\n\nimport type { EventDefinition } from '../../core/events';\nimport type { FieldBuilder } from '../../core/fields';\nimport type { ParsedEventGroup, ParsedEventTree, ValidationError } from '../types';\n\n/** Auto-generated event property names added by defineCorrelationGroup. Excluded from docs output. */\nconst CORRELATION_AUTO_EVENTS = new Set(['start', 'complete', 'fail', 'timeout']);\n\n/**\n * Type guard: is the value an EventDefinition?\n */\nfunction isEventDefinition(value: unknown): value is EventDefinition {\n if (typeof value !== 'object' || value === null) return false;\n const v = value as Record<string, unknown>;\n return (\n typeof v.key === 'string' &&\n typeof v.level === 'string' &&\n typeof v.message === 'string' &&\n (v.doc === undefined || typeof v.doc === 'string')\n );\n}\n\n/**\n * Type guard: is the value a FieldBuilder?\n */\nfunction isFieldBuilder(value: unknown): value is FieldBuilder<string, boolean> {\n if (typeof value !== 'object' || value === null) return false;\n const v = value as Record<string, unknown>;\n return typeof v._type === 'string' && typeof v._required === 'boolean';\n}\n\ninterface EventGroupLike {\n readonly key: string;\n readonly type: 'system' | 'correlation';\n readonly doc?: string;\n readonly timeout?: number;\n readonly events?: Record<string, unknown>;\n readonly groups?: Record<string, unknown>;\n}\n\n/**\n * Type guard: is the value an event group (system or correlation)?\n */\nfunction isEventGroup(value: unknown): value is EventGroupLike {\n if (typeof value !== 'object' || value === null) return false;\n const v = value as Record<string, unknown>;\n return (\n typeof v.key === 'string' &&\n (v.type === 'system' || v.type === 'correlation') &&\n (v.doc === undefined || typeof v.doc === 'string')\n );\n}\n\n/**\n * Heuristic: does the value look like a partial event definition?\n * Used to report helpful parse errors for exports that are close but invalid.\n */\nfunction looksLikeEvent(value: unknown): boolean {\n if (typeof value !== 'object' || value === null) return false;\n const v = value as Record<string, unknown>;\n return typeof v.key === 'string' || typeof v.level === 'string' || typeof v.message === 'string';\n}\n\n/**\n * Extract clean field data from a FieldBuilder (strips methods, keeps data).\n */\nfunction extractFields(\n fields: Record<string, unknown>,\n): Record<string, FieldBuilder<string, boolean>> | undefined {\n const result: Record<string, FieldBuilder<string, boolean>> = {};\n let hasFields = false;\n\n for (const [name, value] of Object.entries(fields)) {\n if (isFieldBuilder(value)) {\n result[name] = {\n _type: value._type,\n _required: value._required,\n _doc: value._doc,\n } as FieldBuilder<string, boolean>;\n hasFields = true;\n }\n }\n\n return hasFields ? result : undefined;\n}\n\n/** Strip a raw EventDefinition down to plain data (doc defaults to empty string). */\nfunction cleanEvent(event: EventDefinition): EventDefinition {\n const fields = event.fields ? extractFields(event.fields as Record<string, unknown>) : undefined;\n return fields\n ? { ...event, doc: event.doc ?? '', fields }\n : { key: event.key, level: event.level, message: event.message, doc: event.doc ?? '' };\n}\n\n/**\n * Convert a runtime event group to a ParsedEventGroup (iterative).\n * Filters out auto-generated correlation events (start, complete, fail, timeout).\n */\n/* eslint-disable max-lines-per-function, complexity, max-depth -- Accepted deviation: iterative two-pass traversal */\nfunction convertGroup(rootGroup: EventGroupLike): ParsedEventGroup {\n // First pass: create ParsedEventGroup shells for all groups\n const groupMap = new Map<EventGroupLike, ParsedEventGroup>();\n const stack: EventGroupLike[] = [rootGroup];\n\n while (stack.length > 0) {\n const group = stack.pop()!;\n const events: Record<string, EventDefinition> = {};\n\n if (group.events) {\n for (const [name, value] of Object.entries(group.events)) {\n if (group.type === 'correlation' && CORRELATION_AUTO_EVENTS.has(name)) continue;\n if (isEventDefinition(value)) {\n events[name] = cleanEvent(value);\n }\n }\n }\n\n const parsed: ParsedEventGroup = {\n key: group.key,\n type: group.type,\n doc: group.doc ?? '',\n ...(group.timeout !== undefined ? { timeout: group.timeout } : {}),\n events,\n groups: {},\n };\n groupMap.set(group, parsed);\n\n if (group.groups) {\n for (const [, value] of Object.entries(group.groups)) {\n if (isEventGroup(value)) {\n stack.push(value);\n }\n }\n }\n }\n\n // Second pass: wire up parent-child group relationships\n const wireStack: EventGroupLike[] = [rootGroup];\n while (wireStack.length > 0) {\n const group = wireStack.pop()!;\n const parsed = groupMap.get(group)!;\n if (group.groups) {\n for (const [name, value] of Object.entries(group.groups)) {\n if (isEventGroup(value)) {\n parsed.groups[name] = groupMap.get(value)!;\n wireStack.push(value);\n }\n }\n }\n }\n\n return groupMap.get(rootGroup)!;\n}\n/* eslint-enable max-lines-per-function, complexity, max-depth */\n\n/**\n * Iteratively collect all events from a group (including nested groups) into a flat list.\n * Uses a Set of event keys for deduplication.\n */\nfunction collectEventsFromGroup(rootGroup: ParsedEventGroup, seen: Set<string>): EventDefinition[] {\n const events: EventDefinition[] = [];\n const stack: ParsedEventGroup[] = [rootGroup];\n\n while (stack.length > 0) {\n const group = stack.pop()!;\n for (const event of Object.values(group.events)) {\n if (!seen.has(event.key)) {\n seen.add(event.key);\n events.push(event);\n }\n }\n for (const nestedGroup of Object.values(group.groups)) {\n stack.push(nestedGroup);\n }\n }\n\n return events;\n}\n\n/**\n * Parse an events file by dynamically importing it via tsx and inspecting exports.\n *\n * **Security note:** This function dynamically imports a user-authored TypeScript\n * file, which executes arbitrary code. This is acceptable for a CLI tool that\n * the user invokes locally, but callers must never pass untrusted paths.\n *\n * @param filePath - Path to the TypeScript events file to parse\n * @returns Parsed event tree containing extracted events, groups, and any parse errors\n */\nexport async function parseEventsFile(filePath: string): Promise<ParsedEventTree> {\n const absolutePath = path.resolve(filePath);\n const events: EventDefinition[] = [];\n const groups: ParsedEventGroup[] = [];\n const errors: ValidationError[] = [];\n const seen = new Set<string>();\n\n const fileUrl = pathToFileURL(absolutePath).href;\n const mod = (await tsImport(fileUrl, import.meta.url)) as Record<string, unknown>;\n\n for (const [exportName, value] of Object.entries(mod)) {\n if (isEventGroup(value)) {\n const parsed = convertGroup(value);\n groups.push(parsed);\n events.push(...collectEventsFromGroup(parsed, seen));\n } else if (isEventDefinition(value)) {\n if (!seen.has(value.key)) {\n seen.add(value.key);\n events.push(cleanEvent(value));\n }\n } else if (looksLikeEvent(value)) {\n errors.push({\n type: 'parse-error',\n message: `Export \"${exportName}\" looks like an event definition but is missing required properties (key, level, message).`,\n });\n }\n }\n\n return { events, groups, errors };\n}\n","/**\n * Global constants used throughout Chronicler\n */\n\n/**\n * Log level priority mapping\n * Lower numbers = higher priority/severity\n */\nexport const LOG_LEVELS = {\n fatal: 0, // System is unusable\n critical: 1, // Critical conditions requiring immediate attention\n alert: 2, // Action must be taken immediately\n error: 3, // Error conditions\n warn: 4, // Warning conditions\n audit: 5, // Audit trail events (compliance, security)\n info: 6, // Informational messages\n debug: 7, // Debug-level messages\n trace: 8, // Trace-level messages (very verbose)\n} as const;\n\n/**\n * Union of all valid log level names, derived from {@link LOG_LEVELS}.\n */\nexport type LogLevel = keyof typeof LOG_LEVELS;\n\n/**\n * All required log levels that backends must implement.\n * Derived from LOG_LEVELS keys to prevent drift.\n */\nexport const DEFAULT_REQUIRED_LEVELS = Object.keys(LOG_LEVELS) as readonly LogLevel[];\n\n/**\n * Default correlation timeout in milliseconds (5 minutes)\n */\nexport const DEFAULT_CORRELATION_TIMEOUT_MS = 5 * 60 * 1000;\n\n/**\n * Root fork ID for the base chronicle instance\n */\nexport const ROOT_FORK_ID = '0';\n\n/**\n * Separator used in hierarchical fork IDs\n * @example '1.1', '1.2.3'\n */\nexport const FORK_ID_SEPARATOR = '.';\n\n/**\n * Default maximum number of context keys per ContextStore\n */\nexport const DEFAULT_MAX_CONTEXT_KEYS = 100;\n\n/**\n * Default maximum fork nesting depth\n */\nexport const DEFAULT_MAX_FORK_DEPTH = 10;\n\n/**\n * Default maximum number of active (uncompleted) correlations\n */\nexport const DEFAULT_MAX_ACTIVE_CORRELATIONS = 1000;\n","/** Reserved top-level field names that cannot be used in user context or metadata. */\nexport const RESERVED_TOP_LEVEL_FIELDS = [\n 'eventKey',\n 'level',\n 'message',\n 'correlationId',\n 'forkId',\n 'timestamp',\n 'fields',\n '_validation',\n] as const;\n\nexport type ReservedTopLevelField = (typeof RESERVED_TOP_LEVEL_FIELDS)[number];\n\n/** Set for O(1) lookup during validation. */\nconst TOP_LEVEL_SET = new Set<string>(RESERVED_TOP_LEVEL_FIELDS);\n\n/**\n * Check if a key is a reserved top-level field.\n *\n * @param key - Field name to check against the reserved set\n * @returns True if the key is reserved and must not be used in user context or metadata\n */\nexport const isReservedTopLevelField = (key: string): key is ReservedTopLevelField =>\n TOP_LEVEL_SET.has(key);\n\n/**\n * Check a record for reserved keys and return array of violations\n * @param record - Object to check\n * @returns Array of reserved keys found in the record\n */\nexport const assertNoReservedKeys = (record: Record<string, unknown>): string[] => {\n const invalid: string[] = [];\n for (const key of Object.keys(record)) {\n if (isReservedTopLevelField(key)) {\n invalid.push(key);\n }\n }\n return invalid;\n};\n","/**\n * Validation rules for event definitions\n */\n\nimport { DEFAULT_REQUIRED_LEVELS } from '../../core/constants';\nimport type { EventDefinition } from '../../core/events';\nimport { isReservedTopLevelField } from '../../core/reserved';\nimport type { ParsedEventGroup, ParsedEventTree, ValidationError } from '../types';\n\nconst VALID_LEVELS = new Set<string>(DEFAULT_REQUIRED_LEVELS);\n\n/**\n * Validate parsed event tree\n */\nexport function validateEventTree(tree: ParsedEventTree): ValidationError[] {\n const errors: ValidationError[] = [...tree.errors];\n\n // Validate each event\n tree.events.forEach((event) => {\n errors.push(...validateEvent(event));\n });\n\n // Validate each group\n tree.groups.forEach((group) => {\n errors.push(...validateGroup(group));\n });\n\n return errors;\n}\n\nconst makeError = (type: ValidationError['type'], message: string): ValidationError => ({\n type,\n message,\n});\n\n/**\n * Validate a single event definition\n */\nfunction validateEvent(event: EventDefinition): ValidationError[] {\n const errors: ValidationError[] = [];\n\n if (event.key.startsWith('chronicler.')) {\n errors.push(\n makeError(\n 'reserved-prefix',\n `Event key \"${event.key}\" uses reserved prefix \"chronicler.\". This prefix is reserved for internal Chronicler system events.`,\n ),\n );\n }\n\n if (!VALID_LEVELS.has(event.level)) {\n errors.push(\n makeError(\n 'invalid-level',\n `Invalid log level \"${event.level}\" in event \"${event.key}\". Valid levels: ${DEFAULT_REQUIRED_LEVELS.join(', ')}`,\n ),\n );\n }\n\n if (!event.doc) {\n errors.push(makeError('missing-doc', `Event \"${event.key}\" is missing a \"doc\" description`));\n }\n\n if (event.fields) {\n for (const fieldName of Object.keys(event.fields)) {\n if (isReservedTopLevelField(fieldName)) {\n errors.push(\n makeError(\n 'reserved-field',\n `Field \"${fieldName}\" in event \"${event.key}\" is a reserved field name`,\n ),\n );\n }\n }\n }\n\n return errors;\n}\n\n/**\n * Validate event group and its hierarchy (iterative)\n */\n// eslint-disable-next-line complexity -- Accepted deviation: iterative group traversal with multiple validation checks\nfunction validateGroup(rootGroup: ParsedEventGroup, parentKey = ''): ValidationError[] {\n const errors: ValidationError[] = [];\n const stack: { group: ParsedEventGroup; parentKey: string }[] = [{ group: rootGroup, parentKey }];\n\n while (stack.length > 0) {\n const { group, parentKey: parent } = stack.pop()!;\n const expectedPrefix = parent ? `${parent}.` : '';\n\n if (parent && !group.key.startsWith(expectedPrefix)) {\n errors.push(\n makeError('key-path', `Group key \"${group.key}\" should start with \"${expectedPrefix}\"`),\n );\n }\n\n for (const [name, event] of Object.entries(group.events)) {\n const expectedKey = `${group.key}.${name}`;\n if (event.key !== expectedKey) {\n errors.push(\n makeError(\n 'key-path',\n `Event key \"${event.key}\" should be \"${expectedKey}\" based on its position in the hierarchy`,\n ),\n );\n }\n errors.push(...validateEvent(event));\n }\n\n if (group.type === 'correlation' && group.timeout !== undefined && group.timeout < 0) {\n errors.push(\n makeError(\n 'invalid-timeout',\n `Correlation group \"${group.key}\" has invalid timeout: ${group.timeout}. Must be non-negative.`,\n ),\n );\n }\n\n for (const nestedGroup of Object.values(group.groups)) {\n stack.push({ group: nestedGroup, parentKey: group.key });\n }\n }\n\n return errors;\n}\n\n/**\n * Format validation errors for display\n */\nexport function formatErrors(errors: ValidationError[]): string {\n if (errors.length === 0) {\n return 'No errors found.';\n }\n\n const lines = errors.map((error) => {\n return ` ${error.type}: ${error.message}`;\n });\n\n return `Found ${errors.length} error(s):\\n${lines.join('\\n')}`;\n}\n","/**\n * Chronicler CLI\n */\n\nimport path from 'node:path';\n\nimport { Command } from 'commander';\n\nimport type { ChroniclerCliConfig } from './config';\nimport { loadConfig, validateEventsFile } from './config-loader';\nimport { generateDocs } from './generator/docs-generator';\nimport { parseEventsFile } from './parser/runtime-parser';\nimport { formatErrors, validateEventTree } from './parser/validator';\nimport type { ParsedEventTree, ValidationError } from './types';\n\nconst program = new Command();\n\nprogram\n .name('@ubercode/chronicler')\n .description('Chronicler CLI for event validation and documentation generation')\n .version('0.1.0');\n\nprogram\n .command('validate')\n .description('Validate event definitions')\n .option('-v, --verbose', 'Show detailed validation information')\n .option('--json', 'Output results as JSON')\n .option('--config <path>', 'Path to config file (default: chronicler.config.ts)')\n .action(async (options: { verbose?: boolean; json?: boolean; config?: string }) => {\n try {\n await runValidate(options);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : 'Unknown error');\n process.exit(1);\n }\n });\n\nprogram\n .command('docs')\n .description('Generate documentation from event definitions')\n .option('-f, --format <format>', 'Output format (markdown or json)', 'markdown')\n .option('-o, --output <path>', 'Output file path')\n .option('--config <path>', 'Path to config file (default: chronicler.config.ts)')\n .action(async (options: { format?: string; output?: string; config?: string }) => {\n try {\n await runDocs(options);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : 'Unknown error');\n process.exit(1);\n }\n });\n\n/** Derive the working directory from a config file path, or undefined for process.cwd(). */\nfunction resolveCwd(configPath?: string): string | undefined {\n return configPath ? path.dirname(path.resolve(configPath)) : undefined;\n}\n\n/** Format validation results as JSON and exit. */\nfunction printValidateJson(tree: ParsedEventTree, errors: ValidationError[], elapsed: number) {\n const result = {\n success: errors.length === 0,\n eventCount: tree.events.length,\n groupCount: tree.groups.length,\n errorCount: errors.length,\n errors: errors.map((e) => ({ type: e.type, message: e.message })),\n elapsedMs: elapsed,\n };\n console.log(JSON.stringify(result, null, 2));\n process.exit(errors.length > 0 ? 1 : 0);\n}\n\n/** Print human-readable success summary and exit. */\nfunction printValidateSuccess(tree: ParsedEventTree, verbose: boolean, elapsed: number) {\n console.log('\\nāœ… All event definitions are valid!');\n if (verbose) {\n console.log(`\\nšŸ“Š Summary:`);\n console.log(` Events: ${tree.events.length}`);\n console.log(` Groups: ${tree.groups.length}`);\n console.log(` Errors: 0`);\n }\n console.log(`ā±ļø Completed in ${elapsed}ms`);\n process.exit(0);\n}\n\nasync function runValidate(options: { verbose?: boolean; json?: boolean; config?: string }) {\n const startTime = Date.now();\n const log = (msg: string) => !options.json && console.log(msg);\n\n log('šŸ” Loading configuration...');\n const config = await loadConfig(resolveCwd(options.config));\n\n if (options.verbose && !options.json) {\n console.log(` Events file: ${config.eventsFile}`);\n }\n\n log('šŸ“‚ Validating events file exists...');\n validateEventsFile(config);\n\n log(`šŸ“– Parsing ${config.eventsFile}...`);\n const tree = await parseEventsFile(config.eventsFile);\n\n if (options.verbose && !options.json) {\n console.log(` Found ${tree.events.length} event definition(s)`);\n console.log(` Found ${tree.groups.length} group(s)`);\n } else {\n log(` Found ${tree.events.length} event(s)`);\n }\n\n const errors = validateEventTree(tree);\n const elapsed = Date.now() - startTime;\n\n if (options.json) return printValidateJson(tree, errors, elapsed);\n\n if (errors.length > 0) {\n console.error('\\nāŒ Validation failed:\\n');\n console.error(formatErrors(errors));\n console.error(`\\nā±ļø Completed in ${elapsed}ms`);\n process.exit(1);\n }\n\n printValidateSuccess(tree, options.verbose ?? false, elapsed);\n}\n\n/** Merge CLI flags with config-file docs options, validating the format. */\nfunction resolveDocsOptions(\n config: { docs?: { format?: string; outputPath?: string } },\n options: { format?: string; output?: string },\n): { format: 'markdown' | 'json'; outputPath: string } {\n const VALID_FORMATS = ['markdown', 'json'] as const;\n let format = config.docs?.format ?? 'markdown';\n let outputPath = config.docs?.outputPath ?? './docs/chronicler-events.md';\n\n if (options.format) {\n if (!VALID_FORMATS.includes(options.format as (typeof VALID_FORMATS)[number])) {\n console.error(\n `Error: Invalid format \"${options.format}\". Must be one of: ${VALID_FORMATS.join(', ')}`,\n );\n process.exit(1);\n }\n format = options.format;\n }\n if (options.output) outputPath = options.output;\n\n return { format: format as 'markdown' | 'json', outputPath };\n}\n\nasync function runDocs(options: { format?: string; output?: string; config?: string }) {\n const startTime = Date.now();\n\n console.log('šŸ” Loading configuration...');\n const loadedConfig = await loadConfig(resolveCwd(options.config));\n const { format, outputPath } = resolveDocsOptions(loadedConfig, options);\n const config: ChroniclerCliConfig = { ...loadedConfig, docs: { format, outputPath } };\n\n console.log(`šŸ“‚ Validating events file exists...`);\n validateEventsFile(config);\n\n console.log(`šŸ“– Parsing ${config.eventsFile}...`);\n const tree = await parseEventsFile(config.eventsFile);\n console.log(` Found ${tree.events.length} event(s)`);\n\n const errors = validateEventTree(tree);\n if (errors.length > 0) {\n console.error('\\nāš ļø Validation warnings found:\\n');\n console.error(formatErrors(errors));\n console.error('\\nProceeding with documentation generation...\\n');\n }\n\n console.log(`šŸ“ Generating ${format} documentation...`);\n generateDocs(tree, config);\n\n const elapsed = Date.now() - startTime;\n console.log(`āœ… Documentation generated successfully!`);\n console.log(` Output: ${outputPath}`);\n console.log(` Format: ${format}`);\n console.log(` Events documented: ${tree.events.length}`);\n console.log(`ā±ļø Completed in ${elapsed}ms`);\n process.exit(0);\n}\n\nprogram.parse();\n"]}
1
+ {"version":3,"sources":["../src/cli/config.ts","../src/cli/ts-import.ts","../src/cli/config-loader.ts","../src/cli/generator/docs-generator.ts","../src/cli/parser/runtime-parser.ts","../src/core/constants.ts","../src/core/reserved.ts","../src/cli/parser/validator.ts","../src/cli/index.ts"],"names":["path","fs"],"mappings":"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","file":"cli.js","sourcesContent":["/**\n * CLI configuration schema for Chronicler\n */\n\nexport interface ChroniclerCliConfig {\n /**\n * Path to the file containing event definitions\n * Relative to project root\n */\n readonly eventsFile: string;\n\n /**\n * Documentation generation options\n */\n readonly docs?: {\n /**\n * Output path for generated documentation\n * @default './docs/chronicler-events.md'\n */\n readonly outputPath?: string;\n\n /**\n * Documentation format\n * @default 'markdown'\n */\n readonly format?: 'markdown' | 'json';\n };\n}\n\nexport const DEFAULT_DOCS_CONFIG: Required<NonNullable<ChroniclerCliConfig['docs']>> = {\n outputPath: './docs/chronicler-events.md',\n format: 'markdown',\n};\n","/**\n * TypeScript file importer using esbuild.\n *\n * Compiles .ts files to a temporary .mjs file via esbuild, then imports it.\n * The .mjs extension forces ESM parsing regardless of the project's package.json \"type\".\n * All relative .ts imports are bundled; npm packages are left as external imports.\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nimport esbuild from 'esbuild';\n\n/**\n * Import a TypeScript file by compiling it to a temporary .mjs file.\n * Works in both ESM and CJS project contexts.\n */\nexport async function importTsModule(filePath: string): Promise<Record<string, unknown>> {\n const absolutePath = path.resolve(filePath);\n\n const result = await esbuild.build({\n entryPoints: [absolutePath],\n bundle: true,\n format: 'esm',\n platform: 'node',\n target: 'node20',\n write: false,\n packages: 'external',\n });\n\n const code = result.outputFiles?.[0]?.text;\n if (!code) {\n throw new Error(`esbuild produced no output for ${filePath}`);\n }\n const tmpFile = absolutePath.replace(/\\.ts$/, `.chronicler-tmp-${Date.now()}.mjs`);\n\n try {\n fs.writeFileSync(tmpFile, code);\n return (await import(pathToFileURL(tmpFile).href)) as Record<string, unknown>;\n } finally {\n try {\n fs.unlinkSync(tmpFile);\n } catch {\n // Ignore cleanup errors\n }\n }\n}\n","/**\n * Configuration loader for Chronicler CLI\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nimport type { ChroniclerCliConfig } from './config';\nimport { DEFAULT_DOCS_CONFIG } from './config';\nimport { importTsModule } from './ts-import';\n\n/** Dynamically import and validate a chronicler config file. */\nasync function importConfigModule(configPath: string): Promise<ChroniclerCliConfig> {\n const configModule = (await importTsModule(configPath)) as { default?: ChroniclerCliConfig };\n const config = configModule.default;\n\n if (!config) {\n throw new Error('chronicler.config.ts must have a default export');\n }\n if (!config.eventsFile) {\n throw new Error('eventsFile is required in chronicler.config.ts');\n }\n\n return {\n eventsFile: config.eventsFile,\n docs: { ...DEFAULT_DOCS_CONFIG, ...config.docs },\n };\n}\n\n/**\n * Load Chronicler CLI configuration from chronicler.config.ts.\n *\n * **Security note:** This function dynamically imports a user-authored TypeScript\n * file, which executes arbitrary code. This is acceptable for a CLI tool that\n * the user invokes locally, but callers must never pass untrusted paths.\n *\n * @param cwd - Working directory to search for chronicler.config.ts (defaults to process.cwd())\n * @returns Resolved CLI configuration merged with defaults\n * @throws {Error} If the config file is missing, has no default export, or lacks required fields\n */\nexport async function loadConfig(cwd: string = process.cwd()): Promise<ChroniclerCliConfig> {\n const configPath = path.join(cwd, 'chronicler.config.ts');\n\n if (!fs.existsSync(configPath)) {\n throw new Error(\n `Configuration file not found: chronicler.config.ts\\n` +\n 'Please create a chronicler.config.ts file in your project root.',\n );\n }\n\n try {\n return await importConfigModule(configPath);\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Failed to load config: ${error.message}`, { cause: error });\n }\n throw error;\n }\n}\n\n/**\n * Validate that the events file exists.\n *\n * @param config - CLI configuration containing the eventsFile path to validate\n * @param cwd - Working directory to resolve the eventsFile path against (defaults to process.cwd())\n * @throws {Error} If the events file does not exist at the resolved path\n */\nexport function validateEventsFile(config: ChroniclerCliConfig, cwd: string = process.cwd()): void {\n const eventsFilePath = path.resolve(cwd, config.eventsFile);\n\n if (!fs.existsSync(eventsFilePath)) {\n throw new Error(`Events file not found: ${config.eventsFile}`);\n }\n}\n","/**\n * Documentation generator for Chronicler events\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nimport type { EventDefinition } from '../../core/events';\nimport type { ChroniclerCliConfig } from '../config';\nimport type { ParsedEventGroup, ParsedEventTree } from '../types';\n\n/**\n * Generate documentation from parsed event tree.\n *\n * @param tree - Parsed event tree containing events and groups to document\n * @param config - CLI configuration specifying output format and file path\n * @throws {Error} If the output path resolves outside the project directory or the format is unknown\n */\n// eslint-disable-next-line complexity -- multiple output format branches and path-safety checks\nexport function generateDocs(tree: ParsedEventTree, config: ChroniclerCliConfig): void {\n const format = config.docs?.format ?? 'markdown';\n const outputPath = config.docs?.outputPath ?? './docs/chronicler-events.md';\n\n // Prevent path traversal: output must resolve within cwd.\n // Use fs.realpathSync where possible to resolve symlinks, and normalize\n // case on case-insensitive file systems (Windows).\n const resolved = path.resolve(outputPath);\n const cwd = process.cwd();\n const normalizedResolved = resolved.toLowerCase();\n const normalizedCwd = cwd.toLowerCase();\n if (\n !normalizedResolved.startsWith(normalizedCwd + path.sep) &&\n normalizedResolved !== normalizedCwd\n ) {\n throw new Error(`Output path \"${outputPath}\" resolves outside the project directory.`);\n }\n\n let content: string;\n\n if (format === 'markdown') {\n content = generateMarkdown(tree);\n } else if (format === 'json') {\n content = generateJSON(tree);\n } else {\n throw new Error(`Unknown format: ${String(format)}`);\n }\n\n // Ensure output directory exists\n const dir = path.dirname(resolved);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n // Re-validate after mkdir to catch symlinks that resolve outside cwd\n const realDir = fs.realpathSync(dir);\n if (\n !realDir.toLowerCase().startsWith(normalizedCwd + path.sep) &&\n realDir.toLowerCase() !== normalizedCwd\n ) {\n throw new Error('Output directory resolves outside the project directory via symlink.');\n }\n\n // Write output\n fs.writeFileSync(resolved, content, 'utf-8');\n}\n\n/** Collect all event keys from groups and their nested sub-groups. */\nfunction collectAllGroupEventKeys(groups: ParsedEventGroup[]): Set<string> {\n const keys = new Set<string>();\n const stack = [...groups];\n while (stack.length > 0) {\n const group = stack.pop()!;\n for (const event of Object.values(group.events)) {\n keys.add(event.key);\n }\n for (const nested of Object.values(group.groups)) {\n stack.push(nested);\n }\n }\n return keys;\n}\n\n/**\n * Generate Markdown documentation\n */\nfunction generateMarkdown(tree: ParsedEventTree): string {\n const lines: string[] = [];\n\n lines.push('# Chronicler Events');\n lines.push('');\n lines.push('> Auto-generated documentation from event definitions');\n lines.push('');\n\n // Table of contents\n if (tree.groups.length > 0) {\n lines.push('## Table of Contents');\n lines.push('');\n tree.groups.forEach((group) => {\n lines.push(`- [${group.key}](#${group.key.replace(/\\./g, '-').toLowerCase()})`);\n });\n lines.push('');\n lines.push('---');\n lines.push('');\n }\n\n // Document each group\n tree.groups.forEach((group) => {\n lines.push(...generateGroupMarkdown(group));\n });\n\n // Document standalone events (not in any group or nested sub-group)\n const groupEventKeys = collectAllGroupEventKeys(tree.groups);\n const standaloneEvents = tree.events.filter((event) => !groupEventKeys.has(event.key));\n\n if (standaloneEvents.length > 0) {\n lines.push('## Standalone Events');\n lines.push('');\n standaloneEvents.forEach((event) => {\n lines.push(...generateEventMarkdown(event));\n });\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Generate Markdown for an event group and its nested groups (iterative)\n */\n// eslint-disable-next-line max-lines-per-function -- Accepted deviation: iterative traversal with markdown assembly\nfunction generateGroupMarkdown(rootGroup: ParsedEventGroup, rootLevel = 2): string[] {\n const lines: string[] = [];\n const stack: { group: ParsedEventGroup; level: number }[] = [\n { group: rootGroup, level: rootLevel },\n ];\n\n while (stack.length > 0) {\n const { group, level } = stack.pop()!;\n const heading = '#'.repeat(Math.min(level, 6));\n\n lines.push(`${heading} ${group.key}`);\n lines.push('');\n\n if (group.type === 'correlation') {\n lines.push('**Type:** Correlation Group');\n if (group.timeout !== undefined) {\n lines.push(\n group.timeout === 0\n ? '**Timeout:** Disabled'\n : `**Timeout:** ${group.timeout}ms (activity-based)`,\n );\n }\n lines.push('');\n }\n\n if (group.doc) {\n lines.push(group.doc);\n lines.push('');\n }\n\n if (group.type === 'correlation') {\n lines.push('**Auto-Generated Events:**');\n lines.push('');\n lines.push(`- \\`${group.key}.start\\` - Logged when correlation starts`);\n lines.push(\n `- \\`${group.key}.complete\\` - Logged when correlation completes (includes \\`duration\\` field)`,\n );\n lines.push(\n `- \\`${group.key}.fail\\` - Logged when correlation fails (includes \\`duration\\` and \\`error\\` fields)`,\n );\n lines.push(\n `- \\`${group.key}.timeout\\` - Logged when correlation times out due to inactivity`,\n );\n lines.push('');\n }\n\n Object.values(group.events).forEach((event) => {\n lines.push(...generateEventMarkdown(event, level + 1));\n });\n\n // Push nested groups in reverse order so they process in original order\n const nestedEntries = Object.values(group.groups);\n for (let i = nestedEntries.length - 1; i >= 0; i--) {\n stack.push({ group: nestedEntries[i]!, level: level + 1 });\n }\n\n lines.push('---');\n lines.push('');\n }\n\n return lines;\n}\n\n/**\n * Generate Markdown for a single event\n */\nfunction generateEventMarkdown(event: EventDefinition, level = 3): string[] {\n const lines: string[] = [];\n const heading = '#'.repeat(Math.min(level, 6));\n\n lines.push(`${heading} ${event.key}`);\n lines.push('');\n lines.push(`**Level:** \\`${event.level}\\``);\n lines.push(`**Message:** \"${event.message}\"`);\n lines.push('');\n if (event.doc) {\n lines.push(event.doc);\n lines.push('');\n }\n\n if (event.fields && Object.keys(event.fields).length > 0) {\n lines.push('**Fields:**');\n lines.push('');\n\n Object.entries(event.fields).forEach(([name, field]) => {\n const required = field._required ? 'required' : 'optional';\n lines.push(`- **\\`${name}\\`** (\\`${field._type}\\`, ${required}): ${field._doc ?? ''}`);\n });\n\n lines.push('');\n }\n\n return lines;\n}\n\n/**\n * Generate JSON documentation\n */\nfunction generateJSON(tree: ParsedEventTree): string {\n const groupEventKeys = collectAllGroupEventKeys(tree.groups);\n const output = {\n generated: new Date().toISOString(),\n eventCount: tree.events.length,\n groupCount: tree.groups.length,\n groups: tree.groups.map((group) => serializeGroup(group)),\n standaloneEvents: tree.events\n .filter((event) => !groupEventKeys.has(event.key))\n .map((event) => serializeEvent(event)),\n };\n\n return JSON.stringify(output, null, 2);\n}\n\n/**\n * Serialize event group to JSON (iterative)\n */\nfunction serializeGroup(rootGroup: ParsedEventGroup): Record<string, unknown> {\n const resultMap = new Map<ParsedEventGroup, Record<string, unknown>>();\n // Process bottom-up: collect all groups first, then wire children\n const allGroups: ParsedEventGroup[] = [];\n const traverseStack: ParsedEventGroup[] = [rootGroup];\n\n while (traverseStack.length > 0) {\n const group = traverseStack.pop()!;\n allGroups.push(group);\n for (const nestedGroup of Object.values(group.groups)) {\n traverseStack.push(nestedGroup);\n }\n }\n\n // Process in reverse (leaf-first) so children are ready when parents reference them\n for (let i = allGroups.length - 1; i >= 0; i--) {\n const group = allGroups[i]!;\n resultMap.set(group, {\n key: group.key,\n type: group.type,\n doc: group.doc ?? '',\n timeout: group.timeout,\n autoEvents:\n group.type === 'correlation' ? ['start', 'complete', 'fail', 'timeout'] : undefined,\n events: Object.entries(group.events).map(([name, event]) => ({\n name,\n ...serializeEvent(event),\n })),\n groups: Object.entries(group.groups).map(([name, nestedGroup]) => ({\n name,\n ...resultMap.get(nestedGroup)!,\n })),\n });\n }\n\n return resultMap.get(rootGroup)!;\n}\n\n/**\n * Serialize event to JSON\n */\nfunction serializeEvent(event: EventDefinition): Record<string, unknown> {\n return {\n key: event.key,\n level: event.level,\n message: event.message,\n doc: event.doc ?? '',\n fields: event.fields\n ? Object.entries(event.fields).map(([name, field]) => ({\n name,\n type: field._type,\n required: field._required,\n doc: field._doc ?? '',\n }))\n : [],\n };\n}\n","/**\n * Runtime parser for extracting event definitions from TypeScript files.\n * Uses esbuild to compile .ts files before importing them.\n */\n\nimport path from 'node:path';\n\nimport type { EventDefinition } from '../../core/events';\nimport type { FieldBuilder } from '../../core/fields';\nimport { importTsModule } from '../ts-import';\nimport type { ParsedEventGroup, ParsedEventTree, ValidationError } from '../types';\n\n/** Auto-generated event property names added by defineCorrelationGroup. Excluded from docs output. */\nconst CORRELATION_AUTO_EVENTS = new Set(['start', 'complete', 'fail', 'timeout']);\n\n/**\n * Type guard: is the value an EventDefinition?\n */\nfunction isEventDefinition(value: unknown): value is EventDefinition {\n if (typeof value !== 'object' || value === null) return false;\n const v = value as Record<string, unknown>;\n return (\n typeof v.key === 'string' &&\n typeof v.level === 'string' &&\n typeof v.message === 'string' &&\n (v.doc === undefined || typeof v.doc === 'string')\n );\n}\n\n/**\n * Type guard: is the value a FieldBuilder?\n */\nfunction isFieldBuilder(value: unknown): value is FieldBuilder<string, boolean> {\n if (typeof value !== 'object' || value === null) return false;\n const v = value as Record<string, unknown>;\n return typeof v._type === 'string' && typeof v._required === 'boolean';\n}\n\ninterface EventGroupLike {\n readonly key: string;\n readonly type: 'system' | 'correlation';\n readonly doc?: string;\n readonly timeout?: number;\n readonly events?: Record<string, unknown>;\n readonly groups?: Record<string, unknown>;\n}\n\n/**\n * Type guard: is the value an event group (system or correlation)?\n */\nfunction isEventGroup(value: unknown): value is EventGroupLike {\n if (typeof value !== 'object' || value === null) return false;\n const v = value as Record<string, unknown>;\n return (\n typeof v.key === 'string' &&\n (v.type === 'system' || v.type === 'correlation') &&\n (v.doc === undefined || typeof v.doc === 'string')\n );\n}\n\n/**\n * Heuristic: does the value look like a partial event definition?\n * Used to report helpful parse errors for exports that are close but invalid.\n */\nfunction looksLikeEvent(value: unknown): boolean {\n if (typeof value !== 'object' || value === null) return false;\n const v = value as Record<string, unknown>;\n return typeof v.key === 'string' || typeof v.level === 'string' || typeof v.message === 'string';\n}\n\n/**\n * Extract clean field data from a FieldBuilder (strips methods, keeps data).\n */\nfunction extractFields(\n fields: Record<string, unknown>,\n): Record<string, FieldBuilder<string, boolean>> | undefined {\n const result: Record<string, FieldBuilder<string, boolean>> = {};\n let hasFields = false;\n\n for (const [name, value] of Object.entries(fields)) {\n if (isFieldBuilder(value)) {\n result[name] = {\n _type: value._type,\n _required: value._required,\n _doc: value._doc,\n } as FieldBuilder<string, boolean>;\n hasFields = true;\n }\n }\n\n return hasFields ? result : undefined;\n}\n\n/** Strip a raw EventDefinition down to plain data (doc defaults to empty string). */\nfunction cleanEvent(event: EventDefinition): EventDefinition {\n const fields = event.fields ? extractFields(event.fields as Record<string, unknown>) : undefined;\n return fields\n ? { ...event, doc: event.doc ?? '', fields }\n : { key: event.key, level: event.level, message: event.message, doc: event.doc ?? '' };\n}\n\n/**\n * Convert a runtime event group to a ParsedEventGroup (iterative).\n * Filters out auto-generated correlation events (start, complete, fail, timeout).\n */\n/* eslint-disable max-lines-per-function, complexity, max-depth -- Accepted deviation: iterative two-pass traversal */\nfunction convertGroup(rootGroup: EventGroupLike): ParsedEventGroup {\n // First pass: create ParsedEventGroup shells for all groups\n const groupMap = new Map<EventGroupLike, ParsedEventGroup>();\n const stack: EventGroupLike[] = [rootGroup];\n\n while (stack.length > 0) {\n const group = stack.pop()!;\n const events: Record<string, EventDefinition> = {};\n\n if (group.events) {\n for (const [name, value] of Object.entries(group.events)) {\n if (group.type === 'correlation' && CORRELATION_AUTO_EVENTS.has(name)) continue;\n if (isEventDefinition(value)) {\n events[name] = cleanEvent(value);\n }\n }\n }\n\n const parsed: ParsedEventGroup = {\n key: group.key,\n type: group.type,\n doc: group.doc ?? '',\n ...(group.timeout !== undefined ? { timeout: group.timeout } : {}),\n events,\n groups: {},\n };\n groupMap.set(group, parsed);\n\n if (group.groups) {\n for (const [, value] of Object.entries(group.groups)) {\n if (isEventGroup(value)) {\n stack.push(value);\n }\n }\n }\n }\n\n // Second pass: wire up parent-child group relationships\n const wireStack: EventGroupLike[] = [rootGroup];\n while (wireStack.length > 0) {\n const group = wireStack.pop()!;\n const parsed = groupMap.get(group)!;\n if (group.groups) {\n for (const [name, value] of Object.entries(group.groups)) {\n if (isEventGroup(value)) {\n parsed.groups[name] = groupMap.get(value)!;\n wireStack.push(value);\n }\n }\n }\n }\n\n return groupMap.get(rootGroup)!;\n}\n/* eslint-enable max-lines-per-function, complexity, max-depth */\n\n/**\n * Iteratively collect all events from a group (including nested groups) into a flat list.\n * Uses a Set of event keys for deduplication.\n */\nfunction collectEventsFromGroup(rootGroup: ParsedEventGroup, seen: Set<string>): EventDefinition[] {\n const events: EventDefinition[] = [];\n const stack: ParsedEventGroup[] = [rootGroup];\n\n while (stack.length > 0) {\n const group = stack.pop()!;\n for (const event of Object.values(group.events)) {\n if (!seen.has(event.key)) {\n seen.add(event.key);\n events.push(event);\n }\n }\n for (const nestedGroup of Object.values(group.groups)) {\n stack.push(nestedGroup);\n }\n }\n\n return events;\n}\n\n/**\n * Parse an events file by compiling it via esbuild and inspecting exports.\n *\n * **Security note:** This function dynamically imports a user-authored TypeScript\n * file, which executes arbitrary code. This is acceptable for a CLI tool that\n * the user invokes locally, but callers must never pass untrusted paths.\n *\n * @param filePath - Path to the TypeScript events file to parse\n * @returns Parsed event tree containing extracted events, groups, and any parse errors\n */\nexport async function parseEventsFile(filePath: string): Promise<ParsedEventTree> {\n const absolutePath = path.resolve(filePath);\n const events: EventDefinition[] = [];\n const groups: ParsedEventGroup[] = [];\n const errors: ValidationError[] = [];\n const seen = new Set<string>();\n\n const mod = await importTsModule(absolutePath);\n\n for (const [exportName, value] of Object.entries(mod)) {\n if (isEventGroup(value)) {\n const parsed = convertGroup(value);\n groups.push(parsed);\n events.push(...collectEventsFromGroup(parsed, seen));\n } else if (isEventDefinition(value)) {\n if (!seen.has(value.key)) {\n seen.add(value.key);\n events.push(cleanEvent(value));\n }\n } else if (looksLikeEvent(value)) {\n errors.push({\n type: 'parse-error',\n message: `Export \"${exportName}\" looks like an event definition but is missing required properties (key, level, message).`,\n });\n }\n }\n\n return { events, groups, errors };\n}\n","/**\n * Global constants used throughout Chronicler\n */\n\n/**\n * Log level priority mapping\n * Lower numbers = higher priority/severity\n */\nexport const LOG_LEVELS = {\n fatal: 0, // System is unusable\n critical: 1, // Critical conditions requiring immediate attention\n alert: 2, // Action must be taken immediately\n error: 3, // Error conditions\n warn: 4, // Warning conditions\n audit: 5, // Audit trail events (compliance, security)\n info: 6, // Informational messages\n debug: 7, // Debug-level messages\n trace: 8, // Trace-level messages (very verbose)\n} as const;\n\n/**\n * Union of all valid log level names, derived from {@link LOG_LEVELS}.\n */\nexport type LogLevel = keyof typeof LOG_LEVELS;\n\n/**\n * All required log levels that backends must implement.\n * Derived from LOG_LEVELS keys to prevent drift.\n */\nexport const DEFAULT_REQUIRED_LEVELS = Object.keys(LOG_LEVELS) as readonly LogLevel[];\n\n/**\n * Default correlation timeout in milliseconds (5 minutes)\n */\nexport const DEFAULT_CORRELATION_TIMEOUT_MS = 5 * 60 * 1000;\n\n/**\n * Root fork ID for the base chronicle instance\n */\nexport const ROOT_FORK_ID = '0';\n\n/**\n * Separator used in hierarchical fork IDs\n * @example '1.1', '1.2.3'\n */\nexport const FORK_ID_SEPARATOR = '.';\n\n/**\n * Default maximum number of context keys per ContextStore\n */\nexport const DEFAULT_MAX_CONTEXT_KEYS = 100;\n\n/**\n * Default maximum fork nesting depth\n */\nexport const DEFAULT_MAX_FORK_DEPTH = 10;\n\n/**\n * Default maximum number of active (uncompleted) correlations\n */\nexport const DEFAULT_MAX_ACTIVE_CORRELATIONS = 1000;\n","/** Reserved top-level field names that cannot be used in user context or metadata. */\nexport const RESERVED_TOP_LEVEL_FIELDS = [\n 'eventKey',\n 'level',\n 'message',\n 'correlationId',\n 'forkId',\n 'timestamp',\n 'fields',\n '_validation',\n] as const;\n\nexport type ReservedTopLevelField = (typeof RESERVED_TOP_LEVEL_FIELDS)[number];\n\n/** Set for O(1) lookup during validation. */\nconst TOP_LEVEL_SET = new Set<string>(RESERVED_TOP_LEVEL_FIELDS);\n\n/**\n * Check if a key is a reserved top-level field.\n *\n * @param key - Field name to check against the reserved set\n * @returns True if the key is reserved and must not be used in user context or metadata\n */\nexport const isReservedTopLevelField = (key: string): key is ReservedTopLevelField =>\n TOP_LEVEL_SET.has(key);\n\n/**\n * Check a record for reserved keys and return array of violations\n * @param record - Object to check\n * @returns Array of reserved keys found in the record\n */\nexport const assertNoReservedKeys = (record: Record<string, unknown>): string[] => {\n const invalid: string[] = [];\n for (const key of Object.keys(record)) {\n if (isReservedTopLevelField(key)) {\n invalid.push(key);\n }\n }\n return invalid;\n};\n","/**\n * Validation rules for event definitions\n */\n\nimport { DEFAULT_REQUIRED_LEVELS } from '../../core/constants';\nimport type { EventDefinition } from '../../core/events';\nimport { isReservedTopLevelField } from '../../core/reserved';\nimport type { ParsedEventGroup, ParsedEventTree, ValidationError } from '../types';\n\nconst VALID_LEVELS = new Set<string>(DEFAULT_REQUIRED_LEVELS);\n\n/**\n * Validate parsed event tree\n */\nexport function validateEventTree(tree: ParsedEventTree): ValidationError[] {\n const errors: ValidationError[] = [...tree.errors];\n\n // Validate each event\n tree.events.forEach((event) => {\n errors.push(...validateEvent(event));\n });\n\n // Validate each group\n tree.groups.forEach((group) => {\n errors.push(...validateGroup(group));\n });\n\n return errors;\n}\n\nconst makeError = (type: ValidationError['type'], message: string): ValidationError => ({\n type,\n message,\n});\n\n/**\n * Validate a single event definition\n */\nfunction validateEvent(event: EventDefinition): ValidationError[] {\n const errors: ValidationError[] = [];\n\n if (event.key.startsWith('chronicler.')) {\n errors.push(\n makeError(\n 'reserved-prefix',\n `Event key \"${event.key}\" uses reserved prefix \"chronicler.\". This prefix is reserved for internal Chronicler system events.`,\n ),\n );\n }\n\n if (!VALID_LEVELS.has(event.level)) {\n errors.push(\n makeError(\n 'invalid-level',\n `Invalid log level \"${event.level}\" in event \"${event.key}\". Valid levels: ${DEFAULT_REQUIRED_LEVELS.join(', ')}`,\n ),\n );\n }\n\n if (!event.doc) {\n errors.push(makeError('missing-doc', `Event \"${event.key}\" is missing a \"doc\" description`));\n }\n\n if (event.fields) {\n for (const fieldName of Object.keys(event.fields)) {\n if (isReservedTopLevelField(fieldName)) {\n errors.push(\n makeError(\n 'reserved-field',\n `Field \"${fieldName}\" in event \"${event.key}\" is a reserved field name`,\n ),\n );\n }\n }\n }\n\n return errors;\n}\n\n/**\n * Validate event group and its hierarchy (iterative)\n */\n// eslint-disable-next-line complexity -- Accepted deviation: iterative group traversal with multiple validation checks\nfunction validateGroup(rootGroup: ParsedEventGroup, parentKey = ''): ValidationError[] {\n const errors: ValidationError[] = [];\n const stack: { group: ParsedEventGroup; parentKey: string }[] = [{ group: rootGroup, parentKey }];\n\n while (stack.length > 0) {\n const { group, parentKey: parent } = stack.pop()!;\n const expectedPrefix = parent ? `${parent}.` : '';\n\n if (parent && !group.key.startsWith(expectedPrefix)) {\n errors.push(\n makeError('key-path', `Group key \"${group.key}\" should start with \"${expectedPrefix}\"`),\n );\n }\n\n for (const [name, event] of Object.entries(group.events)) {\n const expectedKey = `${group.key}.${name}`;\n if (event.key !== expectedKey) {\n errors.push(\n makeError(\n 'key-path',\n `Event key \"${event.key}\" should be \"${expectedKey}\" based on its position in the hierarchy`,\n ),\n );\n }\n errors.push(...validateEvent(event));\n }\n\n if (group.type === 'correlation' && group.timeout !== undefined && group.timeout < 0) {\n errors.push(\n makeError(\n 'invalid-timeout',\n `Correlation group \"${group.key}\" has invalid timeout: ${group.timeout}. Must be non-negative.`,\n ),\n );\n }\n\n for (const nestedGroup of Object.values(group.groups)) {\n stack.push({ group: nestedGroup, parentKey: group.key });\n }\n }\n\n return errors;\n}\n\n/**\n * Format validation errors for display\n */\nexport function formatErrors(errors: ValidationError[]): string {\n if (errors.length === 0) {\n return 'No errors found.';\n }\n\n const lines = errors.map((error) => {\n return ` ${error.type}: ${error.message}`;\n });\n\n return `Found ${errors.length} error(s):\\n${lines.join('\\n')}`;\n}\n","/**\n * Chronicler CLI\n */\n\nimport path from 'node:path';\n\nimport { Command } from 'commander';\n\nimport type { ChroniclerCliConfig } from './config';\nimport { loadConfig, validateEventsFile } from './config-loader';\nimport { generateDocs } from './generator/docs-generator';\nimport { parseEventsFile } from './parser/runtime-parser';\nimport { formatErrors, validateEventTree } from './parser/validator';\nimport type { ParsedEventTree, ValidationError } from './types';\n\nconst program = new Command();\n\nprogram\n .name('@ubercode/chronicler')\n .description('Chronicler CLI for event validation and documentation generation')\n .version('0.1.0');\n\nprogram\n .command('validate')\n .description('Validate event definitions')\n .option('-v, --verbose', 'Show detailed validation information')\n .option('--json', 'Output results as JSON')\n .option('--config <path>', 'Path to config file (default: chronicler.config.ts)')\n .action(async (options: { verbose?: boolean; json?: boolean; config?: string }) => {\n try {\n await runValidate(options);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : 'Unknown error');\n process.exit(1);\n }\n });\n\nprogram\n .command('docs')\n .description('Generate documentation from event definitions')\n .option('-f, --format <format>', 'Output format (markdown or json)', 'markdown')\n .option('-o, --output <path>', 'Output file path')\n .option('--config <path>', 'Path to config file (default: chronicler.config.ts)')\n .action(async (options: { format?: string; output?: string; config?: string }) => {\n try {\n await runDocs(options);\n } catch (error) {\n console.error('Error:', error instanceof Error ? error.message : 'Unknown error');\n process.exit(1);\n }\n });\n\n/** Derive the working directory from a config file path, or undefined for process.cwd(). */\nfunction resolveCwd(configPath?: string): string | undefined {\n return configPath ? path.dirname(path.resolve(configPath)) : undefined;\n}\n\n/** Format validation results as JSON and exit. */\nfunction printValidateJson(tree: ParsedEventTree, errors: ValidationError[], elapsed: number) {\n const result = {\n success: errors.length === 0,\n eventCount: tree.events.length,\n groupCount: tree.groups.length,\n errorCount: errors.length,\n errors: errors.map((e) => ({ type: e.type, message: e.message })),\n elapsedMs: elapsed,\n };\n console.log(JSON.stringify(result, null, 2));\n process.exit(errors.length > 0 ? 1 : 0);\n}\n\n/** Print human-readable success summary and exit. */\nfunction printValidateSuccess(tree: ParsedEventTree, verbose: boolean, elapsed: number) {\n console.log('\\nāœ… All event definitions are valid!');\n if (verbose) {\n console.log(`\\nšŸ“Š Summary:`);\n console.log(` Events: ${tree.events.length}`);\n console.log(` Groups: ${tree.groups.length}`);\n console.log(` Errors: 0`);\n }\n console.log(`ā±ļø Completed in ${elapsed}ms`);\n process.exit(0);\n}\n\nasync function runValidate(options: { verbose?: boolean; json?: boolean; config?: string }) {\n const startTime = Date.now();\n const log = (msg: string) => !options.json && console.log(msg);\n\n log('šŸ” Loading configuration...');\n const config = await loadConfig(resolveCwd(options.config));\n\n if (options.verbose && !options.json) {\n console.log(` Events file: ${config.eventsFile}`);\n }\n\n log('šŸ“‚ Validating events file exists...');\n validateEventsFile(config);\n\n log(`šŸ“– Parsing ${config.eventsFile}...`);\n const tree = await parseEventsFile(config.eventsFile);\n\n if (options.verbose && !options.json) {\n console.log(` Found ${tree.events.length} event definition(s)`);\n console.log(` Found ${tree.groups.length} group(s)`);\n } else {\n log(` Found ${tree.events.length} event(s)`);\n }\n\n const errors = validateEventTree(tree);\n const elapsed = Date.now() - startTime;\n\n if (options.json) return printValidateJson(tree, errors, elapsed);\n\n if (errors.length > 0) {\n console.error('\\nāŒ Validation failed:\\n');\n console.error(formatErrors(errors));\n console.error(`\\nā±ļø Completed in ${elapsed}ms`);\n process.exit(1);\n }\n\n printValidateSuccess(tree, options.verbose ?? false, elapsed);\n}\n\n/** Merge CLI flags with config-file docs options, validating the format. */\nfunction resolveDocsOptions(\n config: { docs?: { format?: string; outputPath?: string } },\n options: { format?: string; output?: string },\n): { format: 'markdown' | 'json'; outputPath: string } {\n const VALID_FORMATS = ['markdown', 'json'] as const;\n let format = config.docs?.format ?? 'markdown';\n let outputPath = config.docs?.outputPath ?? './docs/chronicler-events.md';\n\n if (options.format) {\n if (!VALID_FORMATS.includes(options.format as (typeof VALID_FORMATS)[number])) {\n console.error(\n `Error: Invalid format \"${options.format}\". Must be one of: ${VALID_FORMATS.join(', ')}`,\n );\n process.exit(1);\n }\n format = options.format;\n }\n if (options.output) outputPath = options.output;\n\n return { format: format as 'markdown' | 'json', outputPath };\n}\n\nasync function runDocs(options: { format?: string; output?: string; config?: string }) {\n const startTime = Date.now();\n\n console.log('šŸ” Loading configuration...');\n const loadedConfig = await loadConfig(resolveCwd(options.config));\n const { format, outputPath } = resolveDocsOptions(loadedConfig, options);\n const config: ChroniclerCliConfig = { ...loadedConfig, docs: { format, outputPath } };\n\n console.log(`šŸ“‚ Validating events file exists...`);\n validateEventsFile(config);\n\n console.log(`šŸ“– Parsing ${config.eventsFile}...`);\n const tree = await parseEventsFile(config.eventsFile);\n console.log(` Found ${tree.events.length} event(s)`);\n\n const errors = validateEventTree(tree);\n if (errors.length > 0) {\n console.error('\\nāš ļø Validation warnings found:\\n');\n console.error(formatErrors(errors));\n console.error('\\nProceeding with documentation generation...\\n');\n }\n\n console.log(`šŸ“ Generating ${format} documentation...`);\n generateDocs(tree, config);\n\n const elapsed = Date.now() - startTime;\n console.log(`āœ… Documentation generated successfully!`);\n console.log(` Output: ${outputPath}`);\n console.log(` Format: ${format}`);\n console.log(` Events documented: ${tree.events.length}`);\n console.log(`ā±ļø Completed in ${elapsed}ms`);\n process.exit(0);\n}\n\nprogram.parse();\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ubercode/chronicler",
3
- "version": "1.0.3",
3
+ "version": "1.0.4",
4
4
  "description": "Type-safe structured logging with event definitions, correlations, and field validation for Node.js",
5
5
  "keywords": [
6
6
  "logging",
@@ -106,7 +106,12 @@
106
106
  },
107
107
  "dependencies": {
108
108
  "commander": "14.0.2",
109
- "tsx": "^4.20.6"
109
+ "esbuild": "^0.27.3"
110
110
  },
111
- "packageManager": "pnpm@10.18.0"
111
+ "packageManager": "pnpm@10.18.0",
112
+ "pnpm": {
113
+ "onlyBuiltDependencies": [
114
+ "esbuild"
115
+ ]
116
+ }
112
117
  }