{"version":3,"sources":["../../../src/errors/errors.ts","../../../src/utils/logger.ts","../../../src/utils/file-system-adapter.ts","../../../src/utils/config-validator.ts","../../../src/utils/config.ts","../../../src/utils/id-generator.ts"],"names":["chalk","winston","path","fs","createReadStream","createWriteStream","load","dump","customAlphabet"],"mappings":"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","file":"index.cjs","sourcesContent":["// Third-party imports\nimport chalk from 'chalk';\n\n// Utility imports\nimport { logger } from '../utils/logger.js';\n\n// Base error class for all issue-related errors\nexport class IssueError extends Error {\n  constructor(\n    message: string,\n    public code: string\n  ) {\n    super(message);\n    this.name = 'IssueError';\n  }\n}\n\n// Specific error classes\nexport class FileNotFoundError extends IssueError {\n  constructor(file: string) {\n    super(\n      `Could not find file: ${chalk.cyan(file)}\\n` +\n      `Make sure you're in the correct directory and the file exists.`,\n      'FILE_NOT_FOUND'\n    );\n  }\n}\n\nexport class InvalidFilenameError extends IssueError {\n  constructor(filename: string) {\n    super(\n      `Invalid filename format: ${chalk.cyan(filename)}\\n` +\n      `Expected format for active items: {id}-{type}-{state}[-plan-{planid}].md\\n` +\n      `Expected format for archived items: {reason}-{type}-{id}.md`,\n      'INVALID_FILENAME'\n    );\n  }\n}\n\nexport class InvalidTargetError extends IssueError {\n  constructor(target: string, validTypes: readonly string[], validStates: readonly string[]) {\n    super(\n      `Invalid target: ${chalk.cyan(target)}\\n` +\n      `Must be one of:\\n` +\n      `  Types: ${validTypes.map(t => chalk.cyan(t)).join(', ')}\\n` +\n      `  States: ${validStates.map(s => chalk.cyan(s)).join(', ')}`,\n      'INVALID_TARGET'\n    );\n  }\n}\n\nexport class FileExistsError extends IssueError {\n  constructor(file: string) {\n    super(\n      `File already exists: ${chalk.cyan(file)}\\n` +\n      `Use a different name or remove the existing file first.`,\n      'FILE_EXISTS'\n    );\n  }\n}\n\nexport class TemplateNotFoundError extends IssueError {\n  constructor(type: string, validTypes: readonly string[]) {\n    super(\n      `Template not found: ${chalk.cyan(type)}\\n` +\n      `Available templates: ${validTypes.map(t => chalk.cyan(t)).join(', ')}`,\n      'TEMPLATE_NOT_FOUND'\n    );\n  }\n}\n\nexport class InvalidIssueTypeError extends IssueError {\n  constructor(type: string, validTypes: readonly string[]) {\n    super(\n      `Invalid issue type: ${chalk.red(type)}. Valid types are: ${validTypes.map(t => chalk.green(t)).join(', ')}`,\n      'INVALID_TYPE'\n    );\n  }\n}\n\nexport class IdCollisionError extends IssueError {\n  constructor(id: string) {\n    super(\n      `A file with ID ${chalk.red(id)} already exists in the inbox`,\n      'ID_COLLISION'\n    );\n  }\n}\n\nexport class FrontmatterError extends IssueError {\n  constructor(message: string) {\n    super(\n      `Frontmatter error: ${chalk.red(message)}`,\n      'INVALID_FRONTMATTER'\n    );\n  }\n}\n\nexport class ContentError extends IssueError {\n  constructor(message: string) {\n    super(\n      `Content error: ${chalk.red(message)}`,\n      'CONTENT_ERROR'\n    );\n  }\n}\n\nexport class InvalidStateError extends IssueError {\n  constructor(from: string, to: string) {\n    super(\n      `Invalid state transition from ${chalk.red(from)} to ${chalk.red(to)}`,\n      'INVALID_STATE_TRANSITION'\n    );\n  }\n}\n\nexport class StateTransitionError extends IssueError {\n  constructor(from: string, to: string, reason: string) {\n    super(\n      `Cannot transition from ${chalk.red(from)} to ${chalk.red(to)}: ${reason}`,\n      'STATE_TRANSITION_ERROR'\n    );\n  }\n}\n\n// Error handling utility\nexport function handleError(error: unknown): never {\n  if (error instanceof IssueError) {\n    logger.error(error.message);\n    process.exit(1);\n  }\n  \n  if (error instanceof Error) {\n    logger.error(error.message);\n    process.exit(1);\n  }\n  \n  logger.error('An unknown error occurred');\n  process.exit(1);\n} ","import winston from 'winston';\nimport chalk from 'chalk';\nimport { IssueError, FileNotFoundError, InvalidFilenameError, InvalidTargetError, FileExistsError, handleError } from '../errors/errors.js';\n\n// Define our custom logger interface\nexport interface CustomLogger extends winston.Logger {\n  success(message: any, ...meta: any[]): winston.Logger;\n  debug(message: any, ...meta: any[]): winston.Logger;\n}\n\nconst { format, createLogger, transports } = winston;\nconst { combine, timestamp, printf } = format;\n\n// Custom format for different log levels\nconst customFormat = printf((info: winston.Logform.TransformableInfo) => {\n  const ts = new Date(info.timestamp?.toString() || Date.now()).toLocaleTimeString();\n  \n  switch (info.level) {\n    case 'error':\n      return `${chalk.gray(ts)} ${chalk.red('✖')} ${chalk.red(info.message)}`;\n    case 'warn':\n      return `${chalk.gray(ts)} ${chalk.yellow('⚠')} ${chalk.yellow(info.message)}`;\n    case 'info':\n      return `${chalk.gray(ts)} ${chalk.blue('ℹ')} ${info.message}`;\n    case 'debug':\n      return `${chalk.gray(ts)} ${chalk.gray('🔍')} ${chalk.gray(info.message)}`;\n    case 'success':\n      return `${chalk.gray(ts)} ${chalk.green('✔')} ${chalk.green(info.message)}`;\n    default:\n      return `${chalk.gray(ts)} ${info.message}`;\n  }\n});\n\n// Create custom success level\nconst customLevels = {\n  levels: {\n    error: 0,\n    warn: 1,\n    info: 2,\n    debug: 3,\n    success: 4\n  },\n  colors: {\n    error: 'red',\n    warn: 'yellow',\n    info: 'blue',\n    debug: 'gray',\n    success: 'green'\n  }\n};\n\n// Create a filter to completely silence debug messages unless explicitly enabled\nconst silenceDebug = format((info) => {\n  if (info.level === 'debug' && !process.env.DEBUG_ENABLED) {\n    return false;\n  }\n  return info;\n});\n\n// Create the logger with silent debug by default\nconst baseLogger = createLogger({\n  levels: customLevels.levels,\n  format: combine(\n    silenceDebug(),\n    timestamp(),\n    customFormat\n  ),\n  transports: [\n    new transports.Console({\n      level: 'info'\n    })\n  ]\n});\n\n// Add success method to match our interface\n(baseLogger as any).success = baseLogger.info;\n\nexport const logger = baseLogger as CustomLogger;\n\n// Add colors to winston\nwinston.addColors(customLevels.colors);\n\n// Function to configure logger based on debug flag\nexport function configureLogger(debug: boolean = false) {\n  process.env.DEBUG_ENABLED = debug ? 'true' : '';\n  const level = debug ? 'debug' : 'info';\n  logger.transports.forEach(transport => {\n    if (transport instanceof winston.transports.Console) {\n      transport.level = level;\n    }\n  });\n}\n\n// Re-export error types for convenience\nexport { IssueError, FileNotFoundError, InvalidFilenameError, InvalidTargetError, FileExistsError, handleError }; ","import { createReadStream, createWriteStream } from 'fs';\nimport { promises as fs } from 'fs';\nimport path from 'path';\nimport { PathnameService } from '../services/pathname-service.js';\nimport { logger } from '../utils/logger.js';\n\nexport interface FileSystemAdapter {\n  readFile(path: string): Promise<string>;\n  writeFile(path: string, data: string): Promise<void>;\n  exists(path: string): Promise<boolean>;\n  pathExists(path: string): Promise<boolean>;\n  ensureDir(path: string): Promise<void>;\n  readdir(path: string): Promise<string[]>;\n  move(src: string, dest: string): Promise<void>;\n  remove(path: string): Promise<void>;\n  createReadStream(path: string): NodeJS.ReadableStream;\n  createWriteStream(path: string): NodeJS.WritableStream;\n  stat(path: string): Promise<{ isDirectory(): boolean }>;\n  rename(oldPath: string, newPath: string): Promise<void>;\n  mkdtemp(prefix: string): Promise<string>;\n  rm(path: string, options: { recursive?: boolean; force?: boolean }): Promise<void>;\n}\n\n// Real filesystem implementation\nexport const realFileSystemAdapter: FileSystemAdapter = {\n  async readFile(path: string): Promise<string> {\n    return fs.readFile(path, 'utf8');\n  },\n\n  async writeFile(path: string, data: string): Promise<void> {\n    return fs.writeFile(path, data, 'utf8');\n  },\n\n  async exists(path: string): Promise<boolean> {\n    try {\n      await fs.access(path);\n      return true;\n    } catch {\n      return false;\n    }\n  },\n\n  async pathExists(path: string): Promise<boolean> {\n    return this.exists(path);\n  },\n\n  async ensureDir(path: string): Promise<void> {\n    await fs.mkdir(path, { recursive: true });\n  },\n\n  async readdir(path: string): Promise<string[]> {\n    return fs.readdir(path);\n  },\n\n  async move(src: string, dest: string): Promise<void> {\n    await fs.rename(src, dest);\n  },\n\n  async remove(path: string): Promise<void> {\n    await fs.unlink(path);\n  },\n\n  createReadStream(path: string): NodeJS.ReadableStream {\n    return createReadStream(path);\n  },\n\n  createWriteStream(path: string): NodeJS.WritableStream {\n    return createWriteStream(path);\n  },\n\n  async stat(path: string): Promise<{ isDirectory(): boolean }> {\n    const stats = await fs.stat(path);\n    return {\n      isDirectory: () => stats.isDirectory()\n    };\n  },\n\n  async rename(oldPath: string, newPath: string): Promise<void> {\n    await fs.rename(oldPath, newPath);\n  },\n\n  async mkdtemp(prefix: string): Promise<string> {\n    return fs.mkdtemp(path.join(prefix, ''));\n  },\n\n  async rm(path: string, options: { recursive?: boolean; force?: boolean }): Promise<void> {\n    await fs.rm(path, options);\n  }\n};\n\n/**\n * Wraps a FileSystemAdapter to handle path resolution relative to a root directory.\n * This ensures all paths passed to the underlying adapter are properly prefixed with the root directory.\n */\nexport class RootedFileSystemAdapter implements FileSystemAdapter {\n  constructor(\n    private fs: FileSystemAdapter,\n    private rootDir: string,\n    private pathnameService?: PathnameService\n  ) {\n    // Ensure rootDir is absolute and normalized\n    this.rootDir = path.resolve(rootDir);\n    logger.debug('RootedFileSystemAdapter initialized with rootDir:', this.rootDir);\n  }\n\n  private resolvePath(filePath: string): string {\n    // If pathname service is available, use it to canonicalize the path\n    if (this.pathnameService) {\n      filePath = this.pathnameService.toCanonicalPath(filePath);\n    }\n\n    // Normalize the input path\n    const normalizedPath = path.normalize(filePath);\n    \n    // If it's already absolute\n    if (path.isAbsolute(normalizedPath)) {\n      // If it's already under our root dir, return it as is\n      if (normalizedPath.startsWith(this.rootDir)) {\n        return normalizedPath;\n      }\n      \n      // For any other absolute path, get just the relative portion\n      const projectRoot = path.resolve(process.cwd());\n      let relativePath;\n      \n      if (normalizedPath.startsWith(projectRoot)) {\n        // Get path relative to project root\n        relativePath = path.relative(projectRoot, normalizedPath);\n      } else {\n        // For paths outside project root, use the path relative to root directory\n        relativePath = path.relative('/', normalizedPath);\n      }\n      \n      // Remove any leading directory components that match our root dir structure\n      const rootParts = this.rootDir.split(path.sep).filter(Boolean);\n      const pathParts = relativePath.split(path.sep).filter(Boolean);\n      \n      // Find where the paths diverge\n      let i = 0;\n      while (i < rootParts.length && i < pathParts.length && rootParts[i] === pathParts[i]) {\n        i++;\n      }\n      \n      // Use only the unique part of the path\n      const uniquePath = pathParts.slice(i).join(path.sep);\n      \n      return path.join(this.rootDir, uniquePath);\n    }\n    \n    // For relative paths, just join with root\n    return path.join(this.rootDir, normalizedPath);\n  }\n\n  async readFile(filePath: string): Promise<string> {\n    return this.fs.readFile(this.resolvePath(filePath));\n  }\n\n  async writeFile(filePath: string, content: string): Promise<void> {\n    return this.fs.writeFile(this.resolvePath(filePath), content);\n  }\n\n  async exists(filePath: string): Promise<boolean> {\n    return this.fs.exists(this.resolvePath(filePath));\n  }\n\n  async pathExists(filePath: string): Promise<boolean> {\n    return this.fs.pathExists(this.resolvePath(filePath));\n  }\n\n  async ensureDir(dirPath: string): Promise<void> {\n    return this.fs.ensureDir(this.resolvePath(dirPath));\n  }\n\n  async readdir(dirPath: string): Promise<string[]> {\n    return this.fs.readdir(this.resolvePath(dirPath));\n  }\n\n  async move(src: string, dest: string): Promise<void> {\n    return this.fs.move(this.resolvePath(src), this.resolvePath(dest));\n  }\n\n  async remove(filePath: string): Promise<void> {\n    return this.fs.remove(this.resolvePath(filePath));\n  }\n\n  createReadStream(filePath: string): NodeJS.ReadableStream {\n    return this.fs.createReadStream(this.resolvePath(filePath));\n  }\n\n  createWriteStream(filePath: string): NodeJS.WritableStream {\n    return this.fs.createWriteStream(this.resolvePath(filePath));\n  }\n\n  async stat(filePath: string): Promise<{ isDirectory(): boolean }> {\n    return this.fs.stat(this.resolvePath(filePath));\n  }\n\n  async rename(oldPath: string, newPath: string): Promise<void> {\n    return this.fs.rename(this.resolvePath(oldPath), this.resolvePath(newPath));\n  }\n\n  async mkdtemp(prefix: string): Promise<string> {\n    return this.fs.mkdtemp(this.resolvePath(prefix));\n  }\n\n  async rm(path: string, options: { recursive?: boolean; force?: boolean }): Promise<void> {\n    return this.fs.rm(this.resolvePath(path), options);\n  }\n} ","import { ValidationResult } from '../types.js';\nimport { LlmailConfig, ResolvedConfig } from './config.js';\n\n/**\n * Validates llmail configuration.\n * This is a focused utility that only handles config validation.\n * It ensures the config has the required structure and valid values.\n */\nexport class ConfigValidator {\n  /**\n   * Validate raw llmail configuration\n   */\n  validateConfig(config: LlmailConfig): ValidationResult {\n    const errors: string[] = [];\n\n    // Validate required arrays\n    if (!Array.isArray(config.types_list)) {\n      errors.push('types_list must be an array');\n    }\n\n    // Validate array contents if present\n    if (config.types_list?.some(type => typeof type !== 'string' || !type.match(/^[a-z0-9]+$/))) {\n      errors.push('types_list must contain only lowercase alphanumeric strings without hyphens');\n    }\n    if (config.active_states?.some(state => typeof state !== 'string' || !state.match(/^[a-z0-9]+$/))) {\n      errors.push('active_states must contain only lowercase alphanumeric strings without hyphens');\n    }\n    if (config.inactive_reasons?.some(reason => typeof reason !== 'string' || !reason.match(/^[a-z0-9]+$/))) {\n      errors.push('inactive_reasons must contain only lowercase alphanumeric strings without hyphens');\n    }\n\n    // Check for overlapping states if both arrays are present\n    if (config.active_states?.length > 0 && config.inactive_reasons?.length > 0) {\n      const activeStates = new Set(config.active_states);\n      for (const reason of config.inactive_reasons) {\n        if (activeStates.has(reason)) {\n          errors.push('States cannot be both active and inactive');\n          break;\n        }\n      }\n    }\n\n    // Validate required paths\n    if (!config.issues_dir) {\n      errors.push('issues_dir is required');\n    }\n    if (!config.inbox_dir) {\n      errors.push('inbox_dir is required');\n    }\n\n    // Validate plugins if present\n    if (config.plugins !== undefined) {\n      if (typeof config.plugins === 'string') {\n        // Single plugin string format\n        if (!config.plugins.match(/^[a-z0-9-]+$/)) {\n          errors.push('Plugin name must be lowercase alphanumeric with hyphens');\n        }\n      } else if (Array.isArray(config.plugins)) {\n        // Array format\n        for (const plugin of config.plugins) {\n          if (typeof plugin === 'string') {\n            // String array format\n            if (!plugin.match(/^[a-z0-9-]+$/)) {\n              errors.push('Plugin names must be lowercase alphanumeric with hyphens');\n            }\n          } else if (typeof plugin === 'object' && plugin !== null) {\n            // Object format with config\n            if (!plugin.name?.match(/^[a-z0-9-]+$/)) {\n              errors.push('Plugin names must be lowercase alphanumeric with hyphens');\n            }\n            if (plugin.config !== undefined && (typeof plugin.config !== 'object' || plugin.config === null)) {\n              errors.push('Plugin config must be an object');\n            }\n          } else {\n            errors.push('Invalid plugin configuration format');\n          }\n        }\n      } else {\n        errors.push('Invalid plugins configuration format');\n      }\n    }\n\n    return {\n      valid: errors.length === 0,\n      errors,\n      warnings: []\n    };\n  }\n\n  /**\n   * Validate resolved configuration\n   * This is used after the config has been normalized and paths resolved\n   */\n  validateResolvedConfig(config: ResolvedConfig): ValidationResult {\n    const errors: string[] = [];\n\n    // Validate required arrays are present\n    if (!Array.isArray(config.types_list)) {\n      errors.push('Resolved config must have types_list array');\n    }\n    if (!Array.isArray(config.active_states)) {\n      errors.push('Resolved config must have active_states array');\n    }\n    if (!Array.isArray(config.inactive_reasons)) {\n      errors.push('Resolved config must have inactive_reasons array');\n    }\n\n    // Validate required paths are absolute\n    if (!config.issues_dir?.startsWith('/')) {\n      errors.push('Resolved issues_dir must be absolute path');\n    }\n    if (!config.inbox_dir?.startsWith('/')) {\n      errors.push('Resolved inbox_dir must be absolute path');\n    }\n\n    return {\n      valid: errors.length === 0,\n      errors,\n      warnings: []\n    };\n  }\n} ","import fs from 'fs-extra';\nimport path from 'path';\nimport { dump, load } from 'js-yaml';\nimport { FileSystemAdapter } from './file-system-adapter.js';\nimport { ConfigValidator } from './config-validator.js';\n\n/**\n * Core LLMail configuration interface.\n * All paths are relative to the config file location.\n */\nexport interface LlmailConfig {\n  types_list: string[];\n  active_states: string[];\n  inactive_reasons: string[];\n  issues_dir: string;\n  inbox_dir: string;\n  type_dirs?: string[];\n  plugins?: string | string[] | Array<{\n    name: string;\n    config?: Record<string, any>;\n  }>;\n}\n\nexport type ResolvedConfig = LlmailConfig;\n\nconst defaultConfig: LlmailConfig = {\n  types_list: [],\n  active_states: [],\n  inactive_reasons: [],\n  issues_dir: 'issues',\n  inbox_dir: 'inbox'  // Changed to be relative to root\n};\n\n/**\n * Normalize paths in config.\n * All paths in the config should remain relative to the config file location.\n */\nfunction normalizeConfigPaths(config: LlmailConfig): LlmailConfig {\n  // Normalize paths but keep them relative\n  return {\n    ...config,\n    issues_dir: path.normalize(config.issues_dir),\n    inbox_dir: path.normalize(config.inbox_dir)\n  };\n}\n\n/**\n * Load and validate config from a file\n */\nexport async function loadConfigFromFile(fs: FileSystemAdapter, configPath: string, rootDir: string): Promise<LlmailConfig> {\n  const exists = await fs.exists(configPath);\n  \n  if (!exists) {\n    // Return default config with normalized paths\n    return normalizeConfigPaths(defaultConfig);\n  }\n\n  try {\n    const content = await fs.readFile(configPath);\n    let config: any;\n    \n    try {\n      config = load(content) as LlmailConfig;\n    } catch (err) {\n      throw new Error('Failed to load config');\n    }\n\n    // Merge with defaults, ensuring default types are preserved\n    const mergedConfig = {\n      ...defaultConfig,\n      ...config,\n      // Don't merge arrays - use config values if present, otherwise use defaults\n      types_list: config.types_list || defaultConfig.types_list,\n      active_states: config.active_states || defaultConfig.active_states,\n      inactive_reasons: config.inactive_reasons || defaultConfig.inactive_reasons\n    };\n\n    // Validate config\n    const validator = new ConfigValidator();\n    const result = validator.validateConfig(mergedConfig);\n    if (!result.valid) {\n      throw new Error(`Invalid config: ${result.errors[0]}`);\n    }\n\n    // Normalize paths but keep them relative\n    return normalizeConfigPaths(mergedConfig);\n  } catch (err) {\n    if (err instanceof Error) {\n      throw err;\n    }\n    throw new Error('Failed to load config');\n  }\n}\n\n/**\n * Load llmail config from the default location or specified path\n */\nexport async function loadLlmailConfig(fs: FileSystemAdapter, rootDir: string = process.cwd(), configPath?: string): Promise<LlmailConfig> {\n  const resolvedConfigPath = configPath || path.join(rootDir, 'llmail.yaml');\n  try {\n    return await loadConfigFromFile(fs, resolvedConfigPath, rootDir);\n  } catch (err) {\n    // If config file doesn't exist or can't be loaded, return defaults with normalized paths\n    return normalizeConfigPaths(defaultConfig);\n  }\n}\n\n/**\n * Save config to the default location\n */\nexport async function saveLlmailConfig(fs: FileSystemAdapter, config: LlmailConfig, configPath: string): Promise<void> {\n  const yamlContent = dump(normalizeConfigPaths(config));\n  \n  // Ensure the directory exists\n  const configDir = path.dirname(configPath);\n  await fs.ensureDir(configDir);\n  \n  await fs.writeFile(configPath, yamlContent);\n} ","import { customAlphabet } from 'nanoid';\n\n// Only use lowercase alphanumeric characters for IDs\nconst ALPHABET = '0123456789abcdefghijklmnopqrstuvwxyz';\nconst ID_LENGTH = 4;\n\n// Create a nanoid generator with our custom alphabet\nexport const generateId = customAlphabet(ALPHABET, ID_LENGTH); "]}