@grunnverk/kodrdriv 1.5.12 → 1.5.13-dev.20260202025333.c246a52

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/constants.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import os from 'os';
2
2
  import path from 'path';
3
3
 
4
- /** Version string populated at build time with git and system information */ const VERSION = '1.5.12 (HEAD/79c9ab4 T:v1.5.12 2026-01-31 16:25:34 -0800) linux x64 v24.13.0';
4
+ /** Version string populated at build time with git and system information */ const VERSION = '1.5.13-dev.20260202025333.c246a52 (working/c246a52 2026-02-01 18:53:20 -0800) linux x64 v24.13.0';
5
5
  /** The program name used in CLI help and error messages */ const PROGRAM_NAME = 'kodrdriv';
6
6
  const DEFAULT_OVERRIDES = false;
7
7
  const DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS = 'YYYY-MM-DD-HHmmss.SSS';
package/dist/logging.js CHANGED
@@ -159,7 +159,14 @@ const logger = winston.createLogger({
159
159
  },
160
160
  transports: createTransports('info')
161
161
  });
162
+ // Track if logger is closing or closed to prevent write-after-end errors
163
+ let isLoggerClosing = false;
164
+ let isLoggerClosed = false;
162
165
  const setLogLevel = (level)=>{
166
+ // Don't reconfigure if logger is closing or closed
167
+ if (isLoggerClosing || isLoggerClosed) {
168
+ return;
169
+ }
163
170
  // Reconfigure the existing logger instead of creating a new one
164
171
  logger.configure({
165
172
  level,
@@ -176,15 +183,22 @@ const getLogger = ()=>logger;
176
183
  * This should be called before process exit to ensure all logs are flushed
177
184
  * and file handles are properly closed.
178
185
  */ const closeLogger = async ()=>{
179
- return new Promise((resolve)=>{
180
- // Close all transports
181
- logger.close();
182
- // Give transports a moment to finish closing
183
- // Winston's close() is synchronous but file handles may need a tick to release
184
- setImmediate(()=>{
185
- resolve();
186
- });
187
- });
186
+ // Prevent multiple close attempts
187
+ if (isLoggerClosing || isLoggerClosed) {
188
+ return;
189
+ }
190
+ isLoggerClosing = true;
191
+ try {
192
+ // In winston 3.x, close() returns a Promise that resolves when all transports are closed
193
+ // and all pending writes are completed
194
+ await logger.close();
195
+ isLoggerClosed = true;
196
+ } catch (error) {
197
+ // If close fails (e.g., write-after-end), mark as closed anyway to prevent further attempts
198
+ isLoggerClosed = true;
199
+ // Silently ignore close errors - the logger is effectively closed
200
+ // This prevents write-after-end errors from propagating
201
+ }
188
202
  };
189
203
 
190
204
  export { closeLogger, getLogger, setLogLevel };
@@ -1 +1 @@
1
- {"version":3,"file":"logging.js","sources":["../src/logging.ts"],"sourcesContent":["import winston from 'winston';\n// eslint-disable-next-line no-restricted-imports\nimport * as fs from 'fs';\nimport path from 'path';\nimport { DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS, PROGRAM_NAME, DEFAULT_OUTPUT_DIRECTORY } from './constants';\n\nexport interface LogContext {\n [key: string]: any;\n}\n\n// Track if debug directory has been ensured for this session\nlet debugDirectoryEnsured = false;\n\nconst ensureDebugDirectory = () => {\n if (debugDirectoryEnsured) return;\n\n const debugDir = path.join(DEFAULT_OUTPUT_DIRECTORY, 'debug');\n\n try {\n fs.mkdirSync(debugDir, { recursive: true });\n debugDirectoryEnsured = true;\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(`Failed to create debug directory ${debugDir}:`, error);\n }\n};\n\nconst generateDebugLogFilename = () => {\n const now = new Date();\n const timestamp = now.toISOString()\n .replace(/[-:]/g, '')\n .replace(/\\./g, '')\n .replace('T', '-')\n .replace('Z', '');\n\n return `${timestamp}-debug.log`;\n};\n\nconst createTransports = (level: string) => {\n const transports: winston.transport[] = [];\n\n // When running as MCP server, NEVER add console transports as they interfere with the protocol\n // All output must go through log capture mechanism instead\n const isMcpServer = process.env.KODRDRIV_MCP_SERVER === 'true';\n\n if (!isMcpServer) {\n // Always add console transport for info level and above (only when NOT in MCP mode)\n if (level === 'info') {\n transports.push(\n new winston.transports.Console({\n format: winston.format.combine(\n winston.format.colorize(),\n winston.format.printf(({ level, message, dryRun }): string => {\n const dryRunPrefix = dryRun ? '🔍 DRY RUN: ' : '';\n // For info level messages, don't show the level prefix\n if (level.includes('info')) {\n return `${dryRunPrefix}${String(message)}`;\n }\n // For warn, error, etc., show the level prefix\n return `${level}: ${dryRunPrefix}${String(message)}`;\n })\n )\n })\n );\n } else {\n // For debug/verbose levels, add console transport that shows info and above\n transports.push(\n new winston.transports.Console({\n level: 'info', // Show info, warn, and error on console\n format: winston.format.combine(\n winston.format.colorize(),\n winston.format.printf(({ timestamp, level, message, dryRun, ...meta }): string => {\n // For info level messages, use simpler format without timestamp\n if (level.includes('info')) {\n const dryRunPrefix = dryRun ? '🔍 DRY RUN: ' : '';\n return `${dryRunPrefix}${String(message)}`;\n }\n\n // Filter out winston internal metadata\n const filteredMeta = Object.keys(meta).reduce((acc, key) => {\n if (!['level', 'message', 'timestamp', 'dryRun', 'service', 'splat', 'Symbol(level)', 'Symbol(message)'].includes(key)) {\n acc[key] = meta[key];\n }\n return acc;\n }, {} as Record<string, any>);\n\n const metaStr = Object.keys(filteredMeta).length ? ` ${JSON.stringify(filteredMeta, null, 2)}` : '';\n const dryRunPrefix = dryRun ? '🔍 DRY RUN: ' : '';\n return `${timestamp} ${level}: ${dryRunPrefix}${String(message)}${metaStr}`;\n })\n )\n })\n );\n }\n }\n\n // Add file transport for debug levels (debug and silly)\n if (level === 'debug' || level === 'silly') {\n ensureDebugDirectory();\n\n const debugLogPath = path.join(DEFAULT_OUTPUT_DIRECTORY, 'debug', generateDebugLogFilename());\n\n transports.push(\n new winston.transports.File({\n filename: debugLogPath,\n level: 'debug', // Capture debug and above in the file\n format: winston.format.combine(\n winston.format.timestamp({ format: DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS }),\n winston.format.errors({ stack: true }),\n winston.format.splat(),\n winston.format.printf(({ timestamp, level, message, service, ...meta }) => {\n // Filter out winston internal metadata and properly format remaining meta\n const filteredMeta = Object.keys(meta).reduce((acc, key) => {\n // Skip internal winston fields\n if (!['level', 'message', 'timestamp', 'splat', 'Symbol(level)', 'Symbol(message)'].includes(key)) {\n acc[key] = meta[key];\n }\n return acc;\n }, {} as Record<string, any>);\n\n const metaStr = Object.keys(filteredMeta).length\n ? ` ${JSON.stringify(filteredMeta, null, 2)}`\n : '';\n const serviceStr = service ? ` [${service}]` : '';\n return `${timestamp}${serviceStr} ${level}: ${message}${metaStr}`;\n })\n )\n })\n );\n }\n\n return transports;\n};\n\nconst createFormat = (level: string) => {\n const baseFormats = [\n winston.format.errors({ stack: true }),\n winston.format.splat(),\n ];\n\n if (level === 'info') {\n return winston.format.combine(\n ...baseFormats,\n winston.format.printf(({ message, dryRun, ..._meta }): string => {\n // Auto-format dry-run messages\n if (dryRun) {\n return `🔍 DRY RUN: ${message}`;\n }\n return String(message);\n })\n );\n }\n\n return winston.format.combine(\n winston.format.timestamp({ format: DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS }),\n ...baseFormats,\n winston.format.printf(({ timestamp, level, message, dryRun, ...meta }): string => {\n // Filter out winston internal metadata\n const filteredMeta = Object.keys(meta).reduce((acc, key) => {\n if (!['level', 'message', 'timestamp', 'dryRun', 'service', 'splat', 'Symbol(level)', 'Symbol(message)'].includes(key)) {\n acc[key] = meta[key];\n }\n return acc;\n }, {} as Record<string, any>);\n\n const metaStr = Object.keys(filteredMeta).length ? ` ${JSON.stringify(filteredMeta, null, 2)}` : '';\n const dryRunPrefix = dryRun ? '🔍 DRY RUN: ' : '';\n return `${timestamp} ${level}: ${dryRunPrefix}${String(message)}${metaStr}`;\n })\n );\n};\n\n// Create the logger instance once\nconst logger = winston.createLogger({\n level: 'info',\n format: createFormat('info'),\n defaultMeta: { service: PROGRAM_NAME },\n transports: createTransports('info'),\n});\n\nexport const setLogLevel = (level: string) => {\n // Reconfigure the existing logger instead of creating a new one\n logger.configure({\n level,\n format: createFormat(level),\n defaultMeta: { service: PROGRAM_NAME },\n transports: createTransports(level),\n });\n};\n\nexport const getLogger = () => logger;\n\n/**\n * Get a logger that automatically formats messages for dry-run mode\n */\nexport const getDryRunLogger = (isDryRun: boolean) => {\n if (!isDryRun) {\n return logger;\n }\n\n // Return a wrapper that adds dry-run context to all log calls\n return {\n info: (message: string, ...args: any[]) => logger.info(message, { dryRun: true }, ...args),\n warn: (message: string, ...args: any[]) => logger.warn(message, { dryRun: true }, ...args),\n error: (message: string, ...args: any[]) => logger.error(message, { dryRun: true }, ...args),\n debug: (message: string, ...args: any[]) => logger.debug(message, { dryRun: true }, ...args),\n verbose: (message: string, ...args: any[]) => logger.verbose(message, { dryRun: true }, ...args),\n silly: (message: string, ...args: any[]) => logger.silly(message, { dryRun: true }, ...args),\n };\n};\n\n/**\n * Close all logger transports and wait for them to finish writing.\n * This should be called before process exit to ensure all logs are flushed\n * and file handles are properly closed.\n */\nexport const closeLogger = async (): Promise<void> => {\n return new Promise((resolve) => {\n // Close all transports\n logger.close();\n\n // Give transports a moment to finish closing\n // Winston's close() is synchronous but file handles may need a tick to release\n setImmediate(() => {\n resolve();\n });\n });\n};\n"],"names":["debugDirectoryEnsured","ensureDebugDirectory","debugDir","path","join","DEFAULT_OUTPUT_DIRECTORY","fs","mkdirSync","recursive","error","console","generateDebugLogFilename","now","Date","timestamp","toISOString","replace","createTransports","level","transports","isMcpServer","process","env","KODRDRIV_MCP_SERVER","push","winston","Console","format","combine","colorize","printf","message","dryRun","dryRunPrefix","includes","String","meta","filteredMeta","Object","keys","reduce","acc","key","metaStr","length","JSON","stringify","debugLogPath","File","filename","DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS","errors","stack","splat","service","serviceStr","createFormat","baseFormats","_meta","logger","createLogger","defaultMeta","PROGRAM_NAME","setLogLevel","configure","getLogger","closeLogger","Promise","resolve","close","setImmediate"],"mappings":"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"}
1
+ {"version":3,"file":"logging.js","sources":["../src/logging.ts"],"sourcesContent":["import winston from 'winston';\n// eslint-disable-next-line no-restricted-imports\nimport * as fs from 'fs';\nimport path from 'path';\nimport { DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS, PROGRAM_NAME, DEFAULT_OUTPUT_DIRECTORY } from './constants';\n\nexport interface LogContext {\n [key: string]: any;\n}\n\n// Track if debug directory has been ensured for this session\nlet debugDirectoryEnsured = false;\n\nconst ensureDebugDirectory = () => {\n if (debugDirectoryEnsured) return;\n\n const debugDir = path.join(DEFAULT_OUTPUT_DIRECTORY, 'debug');\n\n try {\n fs.mkdirSync(debugDir, { recursive: true });\n debugDirectoryEnsured = true;\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(`Failed to create debug directory ${debugDir}:`, error);\n }\n};\n\nconst generateDebugLogFilename = () => {\n const now = new Date();\n const timestamp = now.toISOString()\n .replace(/[-:]/g, '')\n .replace(/\\./g, '')\n .replace('T', '-')\n .replace('Z', '');\n\n return `${timestamp}-debug.log`;\n};\n\nconst createTransports = (level: string) => {\n const transports: winston.transport[] = [];\n\n // When running as MCP server, NEVER add console transports as they interfere with the protocol\n // All output must go through log capture mechanism instead\n const isMcpServer = process.env.KODRDRIV_MCP_SERVER === 'true';\n\n if (!isMcpServer) {\n // Always add console transport for info level and above (only when NOT in MCP mode)\n if (level === 'info') {\n transports.push(\n new winston.transports.Console({\n format: winston.format.combine(\n winston.format.colorize(),\n winston.format.printf(({ level, message, dryRun }): string => {\n const dryRunPrefix = dryRun ? '🔍 DRY RUN: ' : '';\n // For info level messages, don't show the level prefix\n if (level.includes('info')) {\n return `${dryRunPrefix}${String(message)}`;\n }\n // For warn, error, etc., show the level prefix\n return `${level}: ${dryRunPrefix}${String(message)}`;\n })\n )\n })\n );\n } else {\n // For debug/verbose levels, add console transport that shows info and above\n transports.push(\n new winston.transports.Console({\n level: 'info', // Show info, warn, and error on console\n format: winston.format.combine(\n winston.format.colorize(),\n winston.format.printf(({ timestamp, level, message, dryRun, ...meta }): string => {\n // For info level messages, use simpler format without timestamp\n if (level.includes('info')) {\n const dryRunPrefix = dryRun ? '🔍 DRY RUN: ' : '';\n return `${dryRunPrefix}${String(message)}`;\n }\n\n // Filter out winston internal metadata\n const filteredMeta = Object.keys(meta).reduce((acc, key) => {\n if (!['level', 'message', 'timestamp', 'dryRun', 'service', 'splat', 'Symbol(level)', 'Symbol(message)'].includes(key)) {\n acc[key] = meta[key];\n }\n return acc;\n }, {} as Record<string, any>);\n\n const metaStr = Object.keys(filteredMeta).length ? ` ${JSON.stringify(filteredMeta, null, 2)}` : '';\n const dryRunPrefix = dryRun ? '🔍 DRY RUN: ' : '';\n return `${timestamp} ${level}: ${dryRunPrefix}${String(message)}${metaStr}`;\n })\n )\n })\n );\n }\n }\n\n // Add file transport for debug levels (debug and silly)\n if (level === 'debug' || level === 'silly') {\n ensureDebugDirectory();\n\n const debugLogPath = path.join(DEFAULT_OUTPUT_DIRECTORY, 'debug', generateDebugLogFilename());\n\n transports.push(\n new winston.transports.File({\n filename: debugLogPath,\n level: 'debug', // Capture debug and above in the file\n format: winston.format.combine(\n winston.format.timestamp({ format: DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS }),\n winston.format.errors({ stack: true }),\n winston.format.splat(),\n winston.format.printf(({ timestamp, level, message, service, ...meta }) => {\n // Filter out winston internal metadata and properly format remaining meta\n const filteredMeta = Object.keys(meta).reduce((acc, key) => {\n // Skip internal winston fields\n if (!['level', 'message', 'timestamp', 'splat', 'Symbol(level)', 'Symbol(message)'].includes(key)) {\n acc[key] = meta[key];\n }\n return acc;\n }, {} as Record<string, any>);\n\n const metaStr = Object.keys(filteredMeta).length\n ? ` ${JSON.stringify(filteredMeta, null, 2)}`\n : '';\n const serviceStr = service ? ` [${service}]` : '';\n return `${timestamp}${serviceStr} ${level}: ${message}${metaStr}`;\n })\n )\n })\n );\n }\n\n return transports;\n};\n\nconst createFormat = (level: string) => {\n const baseFormats = [\n winston.format.errors({ stack: true }),\n winston.format.splat(),\n ];\n\n if (level === 'info') {\n return winston.format.combine(\n ...baseFormats,\n winston.format.printf(({ message, dryRun, ..._meta }): string => {\n // Auto-format dry-run messages\n if (dryRun) {\n return `🔍 DRY RUN: ${message}`;\n }\n return String(message);\n })\n );\n }\n\n return winston.format.combine(\n winston.format.timestamp({ format: DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS }),\n ...baseFormats,\n winston.format.printf(({ timestamp, level, message, dryRun, ...meta }): string => {\n // Filter out winston internal metadata\n const filteredMeta = Object.keys(meta).reduce((acc, key) => {\n if (!['level', 'message', 'timestamp', 'dryRun', 'service', 'splat', 'Symbol(level)', 'Symbol(message)'].includes(key)) {\n acc[key] = meta[key];\n }\n return acc;\n }, {} as Record<string, any>);\n\n const metaStr = Object.keys(filteredMeta).length ? ` ${JSON.stringify(filteredMeta, null, 2)}` : '';\n const dryRunPrefix = dryRun ? '🔍 DRY RUN: ' : '';\n return `${timestamp} ${level}: ${dryRunPrefix}${String(message)}${metaStr}`;\n })\n );\n};\n\n// Create the logger instance once\nconst logger = winston.createLogger({\n level: 'info',\n format: createFormat('info'),\n defaultMeta: { service: PROGRAM_NAME },\n transports: createTransports('info'),\n});\n\n// Track if logger is closing or closed to prevent write-after-end errors\nlet isLoggerClosing = false;\nlet isLoggerClosed = false;\n\nexport const setLogLevel = (level: string) => {\n // Don't reconfigure if logger is closing or closed\n if (isLoggerClosing || isLoggerClosed) {\n return;\n }\n // Reconfigure the existing logger instead of creating a new one\n logger.configure({\n level,\n format: createFormat(level),\n defaultMeta: { service: PROGRAM_NAME },\n transports: createTransports(level),\n });\n};\n\nexport const getLogger = () => logger;\n\n/**\n * Get a logger that automatically formats messages for dry-run mode\n */\nexport const getDryRunLogger = (isDryRun: boolean) => {\n if (!isDryRun) {\n return logger;\n }\n\n // Return a wrapper that adds dry-run context to all log calls\n return {\n info: (message: string, ...args: any[]) => logger.info(message, { dryRun: true }, ...args),\n warn: (message: string, ...args: any[]) => logger.warn(message, { dryRun: true }, ...args),\n error: (message: string, ...args: any[]) => logger.error(message, { dryRun: true }, ...args),\n debug: (message: string, ...args: any[]) => logger.debug(message, { dryRun: true }, ...args),\n verbose: (message: string, ...args: any[]) => logger.verbose(message, { dryRun: true }, ...args),\n silly: (message: string, ...args: any[]) => logger.silly(message, { dryRun: true }, ...args),\n };\n};\n\n/**\n * Close all logger transports and wait for them to finish writing.\n * This should be called before process exit to ensure all logs are flushed\n * and file handles are properly closed.\n */\nexport const closeLogger = async (): Promise<void> => {\n // Prevent multiple close attempts\n if (isLoggerClosing || isLoggerClosed) {\n return;\n }\n\n isLoggerClosing = true;\n\n try {\n // In winston 3.x, close() returns a Promise that resolves when all transports are closed\n // and all pending writes are completed\n await logger.close();\n isLoggerClosed = true;\n } catch (error: any) {\n // If close fails (e.g., write-after-end), mark as closed anyway to prevent further attempts\n isLoggerClosed = true;\n // Silently ignore close errors - the logger is effectively closed\n // This prevents write-after-end errors from propagating\n }\n};\n"],"names":["debugDirectoryEnsured","ensureDebugDirectory","debugDir","path","join","DEFAULT_OUTPUT_DIRECTORY","fs","mkdirSync","recursive","error","console","generateDebugLogFilename","now","Date","timestamp","toISOString","replace","createTransports","level","transports","isMcpServer","process","env","KODRDRIV_MCP_SERVER","push","winston","Console","format","combine","colorize","printf","message","dryRun","dryRunPrefix","includes","String","meta","filteredMeta","Object","keys","reduce","acc","key","metaStr","length","JSON","stringify","debugLogPath","File","filename","DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS","errors","stack","splat","service","serviceStr","createFormat","baseFormats","_meta","logger","createLogger","defaultMeta","PROGRAM_NAME","isLoggerClosing","isLoggerClosed","setLogLevel","configure","getLogger","closeLogger","close"],"mappings":"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"}
@@ -13915,7 +13915,7 @@ import path2 from "path";
13915
13915
  // src/constants.ts
13916
13916
  import os from "os";
13917
13917
  import path from "path";
13918
- var VERSION = "1.5.12 (HEAD/79c9ab4 T:v1.5.12 2026-01-31 16:25:34 -0800) linux x64 v24.13.0";
13918
+ var VERSION = "1.5.13-dev.20260202025333.c246a52 (working/c246a52 2026-02-01 18:53:20 -0800) linux x64 v24.13.0";
13919
13919
  var PROGRAM_NAME = "kodrdriv";
13920
13920
  var DATE_FORMAT_YEAR_MONTH_DAY_HOURS_MINUTES_SECONDS_MILLISECONDS = "YYYY-MM-DD-HHmmss.SSS";
13921
13921
  var DEFAULT_OUTPUT_DIRECTORY = "output/kodrdriv";