{"version":3,"sources":["../../../src/utils/logger.ts","../../../src/utils/doc-sections.ts","../../../src/services/issue-service.ts"],"names":["winston","chalk","load","dump","DEFAULT_SCHEMA","path","_a","timestamp","join"],"mappings":"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","file":"issue-service.cjs","sourcesContent":["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 { load, dump } from 'js-yaml';\n\nexport interface DocSections {\n  frontmatter: string;\n  frontmatterObj: Record<string, any>;\n  content: string;\n  xml: string;\n}\n\nconst YAML_DUMP_OPTIONS = {\n  lineWidth: -1,\n  noRefs: true,\n  sortKeys: true\n};\n\n// Regex to match XML blocks at the bottom of the file\nconst XML_CONTAINER_REGEX = /<XML>([\\s\\S]*?)<\\/XML>/gi;\n\n// Regex to match frontmatter section\nconst FRONTMATTER_REGEX = /^---\\n([\\s\\S]*?)\\n---\\n([\\s\\S]*)$/;\n\nexport function parseDocSections(fileString: string): DocSections {\n  // First try to extract frontmatter\n  const frontmatterMatch = fileString.match(FRONTMATTER_REGEX);\n  let frontmatterRaw = '';\n  let frontmatterObj: Record<string, any> = {};\n  let contentSection = fileString;\n  let xmlSection = '';\n\n  if (!frontmatterMatch) {\n    // No frontmatter, look for XML blocks in the entire file\n    const xmlMatches = [...contentSection.matchAll(XML_CONTAINER_REGEX)];\n    if (xmlMatches.length > 0) {\n      // Combine all XML content\n      xmlSection = xmlMatches.map(m => m[1].trim()).join('\\n\\n');\n      // Remove all XML blocks from content\n      contentSection = contentSection.replace(XML_CONTAINER_REGEX, '').trim();\n    } else {\n      contentSection = fileString.trim();\n    }\n  } else {\n    frontmatterRaw = frontmatterMatch[1];\n    const rest = frontmatterMatch[2];\n\n    try {\n      frontmatterObj = load(frontmatterRaw) || {};\n    } catch {\n      // If invalid YAML, frontmatterObj remains {}\n    }\n\n    // Look for XML blocks in the rest of the content\n    const xmlMatches = [...rest.matchAll(XML_CONTAINER_REGEX)];\n    if (xmlMatches.length > 0) {\n      // Combine all XML content\n      xmlSection = xmlMatches.map(m => m[1].trim()).join('\\n\\n');\n      // Remove all XML blocks from content\n      contentSection = rest.replace(XML_CONTAINER_REGEX, '').trim();\n    } else {\n      contentSection = rest.trim();\n    }\n  }\n\n  return {\n    frontmatter: frontmatterRaw.trim(),\n    frontmatterObj,\n    content: contentSection,\n    xml: xmlSection\n  };\n}\n\nexport function rebuildDocSections(sections: DocSections): string {\n  const frontmatterStr = dump(sections.frontmatterObj, YAML_DUMP_OPTIONS);\n  let result = '';\n\n  // Add frontmatter if we have any frontmatter object properties\n  if (Object.keys(sections.frontmatterObj).length > 0) {\n    result += `---\\n${frontmatterStr}---\\n\\n`;\n  }\n\n  // Add content if present\n  if (sections.content) {\n    result += `${sections.content.trim()}\\n`;\n    // Only add extra newline if we have XML content\n    if (sections.xml) {\n      result += '\\n';\n    }\n  }\n\n  // Add XML section if present\n  if (sections.xml) {\n    result += `<XML>\\n${sections.xml.trim()}\\n</XML>\\n`;\n  }\n\n  return result;\n}\n\nexport function ensureTimestamps(meta: Record<string, any>): void {\n  const now = new Date().toISOString();\n  if (!meta.created) {\n    meta.created = now;\n  }\n  meta.updated = now;\n} ","import { FrontmatterMetadata, ValidationResult } from '../types.js';\nimport { FileSystemAdapter } from '../utils/file-system-adapter.js';\nimport { PathnameService } from './pathname-service.js';\nimport { load, dump, DEFAULT_SCHEMA, DumpOptions } from 'js-yaml';\nimport path from 'path';\nimport { logger } from '../utils/logger.js';\nimport { IntentService } from './intent-service.js';\nimport { FileService } from './file-service.js';\nimport { FileFormatValidator } from '../validation/file-format-validator.js';\nimport { MetadataFormatValidator } from '../validation/metadata-format-validator.js';\nimport { FileSystemValidator } from '../validation/file-system-validator.js';\nimport { ResolvedConfig } from '../utils/config.js';\nimport { PluginService } from './plugin-service.js';\nimport { parseDocSections, rebuildDocSections } from '../utils/doc-sections.js';\nimport { join } from 'path';\n\ninterface UpdateMetadata {\n  author?: string;\n  reason?: string;\n  [key: string]: string | undefined;\n}\n\ninterface UpdateOptions {\n  id: string;\n  content: string;\n  metadata?: UpdateMetadata;\n  time?: boolean;\n}\n\ninterface XMLOptions {\n  id: string;\n  tagName: string;\n  content: string;\n  metadata?: Record<string, string>;\n  time?: boolean;\n}\n\nexport class IssueService {\n  private readonly FRONTMATTER_REGEX = /^---\\n([\\s\\S]*?\\n)---\\n([\\s\\S]*)$/;\n\n  // YAML dump options for consistent frontmatter formatting\n  private readonly YAML_DUMP_OPTIONS: DumpOptions = {\n    lineWidth: -1,\n    noRefs: true,\n    schema: DEFAULT_SCHEMA,\n    styles: {\n      '!!null': 'lowercase',\n      '!!bool': 'lowercase',\n      '!!str': 'double'\n    },\n    quotingType: '\"' as const,\n    forceQuotes: true\n  };\n\n  private config: ResolvedConfig;\n  private pathnameService: PathnameService;\n  private fs: FileSystemAdapter;\n  private intentService: IntentService;\n  private fileService: FileService;\n  private fileFormatValidator: FileFormatValidator;\n  private metadataValidator: MetadataFormatValidator;\n  private fileSystemValidator: FileSystemValidator;\n  private pluginService?: PluginService;\n\n  constructor(\n    pathnameService: PathnameService,\n    fs: FileSystemAdapter,\n    intentService: IntentService,\n    fileService: FileService,\n    fileFormatValidator: FileFormatValidator,\n    metadataValidator: MetadataFormatValidator,\n    fileSystemValidator: FileSystemValidator,\n    pluginService?: PluginService\n  ) {\n    this.pathnameService = pathnameService;\n    this.fs = fs;\n    this.intentService = intentService;\n    this.fileService = fileService;\n    this.fileFormatValidator = fileFormatValidator;\n    this.metadataValidator = metadataValidator;\n    this.fileSystemValidator = fileSystemValidator;\n    this.pluginService = pluginService;\n    this.config = pathnameService.getConfig();\n  }\n\n  fileMethods = {\n    writeNewFile: async (metadata: FrontmatterMetadata, content: string = ''): Promise<string> => {\n      // Clean and validate metadata\n      const cleanedMeta = this.metadataValidator.cleanMetadata(metadata);\n      const validation = this.validateMetadata(cleanedMeta);\n      if (!validation.valid) {\n        throw new Error(validation.errors.join(', '));\n      }\n\n      // Create document sections\n      const sections = {\n        frontmatter: dump({\n          ...cleanedMeta,\n          created: new Date().toISOString()\n        }, this.YAML_DUMP_OPTIONS),\n        frontmatterObj: {\n          ...cleanedMeta,\n          created: new Date().toISOString()\n        },\n        content: content.trim(),\n        xml: ''\n      };\n\n      // Build the document\n      const fullContent = rebuildDocSections(sections);\n\n      // Get path based on metadata\n      const location = this.pathnameService.deriveFileLocation(cleanedMeta);\n      const filePath = path.join(location.dirname, location.basename);\n\n      // Ensure target directory exists\n      await this.fileService.ensureDir(location.dirname);\n\n      // Write file atomically\n      await this.fileService.writeFile(filePath, fullContent);\n      \n      return filePath;\n    },\n\n    saveAndMoveFile: async (filePath: string, metadata: FrontmatterMetadata): Promise<string> => {\n      // Let IntentService interpret the metadata\n      const interpretedMeta = this.intentService.interpretMetadata(metadata);\n\n      // Clean and validate the transition\n      const currentMeta = await this.frontmatterMethods.getFrontmatterMetadata(filePath);\n      \n      const updatedMeta = this.intentService.cleanStateTransition(currentMeta || metadata, interpretedMeta);\n\n      // Get new path based on interpreted metadata\n      const location = this.pathnameService.deriveFileLocation(updatedMeta);\n      const newPath = path.join(location.dirname, location.basename);\n\n      // Read current content and update frontmatter\n      const content = await this.fileService.readFile(filePath);\n      const newContent = this.frontmatterMethods.updateFrontmatter(content, updatedMeta);\n\n      // Normalize paths before comparison\n      const normalizedNewPath = path.normalize(newPath);\n      const normalizedFilePath = path.normalize(filePath);\n\n      // If path is changing, use atomic move which will handle cleanup\n      if (normalizedNewPath !== normalizedFilePath) {\n        await this.fileService.atomicMove(filePath, newPath, newContent);\n      } else {\n        // Otherwise just update content in place\n        await this.fileService.writeFile(filePath, newContent);\n      }\n\n      return newPath;\n    },\n\n    moveFileWithMetadata: async (sourcePath: string, targetPath: string, metadata: FrontmatterMetadata): Promise<void> => {\n      // Get current metadata\n      const currentMeta = await this.frontmatterMethods.getFrontmatterMetadata(sourcePath);\n      if (!currentMeta) {\n        throw new Error('No frontmatter found');\n      }\n\n      // Merge with new metadata (new values take precedence)\n      const mergedMeta = {\n        ...currentMeta,  // Start with all current metadata\n        ...metadata,     // Override with new metadata\n        created: currentMeta.created  // Always preserve created timestamp\n      };\n\n      // Let IntentService interpret the metadata\n      const interpretedMeta = this.intentService.interpretMetadata(mergedMeta);\n      \n      // Clean and validate metadata before move\n      const cleanedMeta = this.metadataValidator.cleanMetadata(interpretedMeta);\n      const validation = this.validateMetadata(cleanedMeta);\n      if (!validation.valid) {\n        throw new Error(`Invalid metadata: ${validation.errors.join(', ')}`);\n      }\n\n      // Read current content and update frontmatter\n      const content = await this.fileService.readFile(sourcePath);\n      \n      // Ensure we preserve the state in the frontmatter only if it exists\n      const frontmatterToWrite = {\n        ...cleanedMeta,\n        ...('state' in metadata && { state: metadata.state })  // Only preserve state if it exists as a property\n      };\n      const newContent = this.frontmatterMethods.updateFrontmatter(content, frontmatterToWrite);\n      \n      // Get target path based on metadata\n      const location = this.pathnameService.deriveFileLocation(cleanedMeta);\n      const derivedTargetPath = path.join(location.dirname, location.basename);\n      \n      // Use derived path if no target path is provided\n      const finalTargetPath = targetPath || derivedTargetPath;\n\n      // Normalize paths for comparison\n      const normalizedSource = path.normalize(sourcePath);\n      const normalizedTarget = path.normalize(finalTargetPath);\n\n      // Perform atomic move with backup\n      await this.fileService.withBackup(normalizedSource, async () => {\n        if (normalizedSource !== normalizedTarget) {\n          await this.fileService.atomicMove(normalizedSource, normalizedTarget, newContent);\n        } else {\n          await this.fileService.writeFile(normalizedSource, newContent);\n        }\n      });\n    },\n\n    findFilesByState: async (state: string): Promise<string[]> => {\n      // Let IntentService determine valid paths and state interpretation\n      const stateInfo = this.intentService.interpretState(state);\n      const paths = this.pathnameService.getPossiblePathsForState(state);\n      \n      const files = await this.fileService.findFiles((f) => f.endsWith('.md'), paths);\n      const results: string[] = [];\n      \n      for (const file of files) {\n        const meta = await this.frontmatterMethods.getFrontmatterMetadata(file);\n        if (!meta) continue;\n        \n        // Special handling for inbox state\n        if (state === 'inbox') {\n          // For inbox, we only care about the file location and active status\n          const normalizedFile = path.normalize(file);\n          const normalizedInbox = path.normalize(this.config.inbox_dir);\n          \n          if (normalizedFile.startsWith(normalizedInbox) && meta.active === true) {\n            results.push(file);\n          }\n          continue;\n        }\n        \n        // For other states, let IntentService determine if file matches\n        if (this.intentService.matchesState(meta, stateInfo)) {\n          // Get canonical path based on metadata\n          const location = this.pathnameService.deriveFileLocation(meta);\n          const canonicalPath = path.join(location.dirname, location.basename);\n          \n          // Normalize paths for comparison\n          const normalizedFile = path.normalize(file);\n          const normalizedCanonical = path.normalize(canonicalPath);\n          \n          // Only add if the file is in the correct location\n          if (normalizedFile === normalizedCanonical) {\n            results.push(canonicalPath);\n          }\n        }\n      }\n      return results;\n    },\n\n    getMetadataFromPath: async (filePath: string): Promise<FrontmatterMetadata | null> => {\n      try {\n        const content = await this.fileService.readFile(filePath);\n        const frontmatter = await this.frontmatterMethods.parseFrontmatter(content);\n        if (!frontmatter) {\n          return null;\n        }\n        return frontmatter as FrontmatterMetadata;\n      } catch (error: any) {\n        // Only catch \"file not found\" errors\n        if (error.message === 'File not found') {\n          return null;\n        }\n        throw error;\n      }\n    },\n\n    findFileById: async (id: string): Promise<string | undefined> => {\n      const searchDirs = this.pathnameService.getPossiblePathsForId(id);\n      \n      const matches: { path: string; meta: FrontmatterMetadata | null }[] = [];\n      const errors: { path: string; error: Error }[] = [];\n      \n      for (const dir of searchDirs) {\n        const filesInDir = await this.fileService.findFiles((f) => f.endsWith('.md'), [dir]);\n        \n        for (const file of filesInDir) {\n          if (!this.pathnameService.matchesId(path.basename(file), id)) {\n            continue;\n          }\n\n          try {\n            const meta = await this.fileMethods.getMetadataFromPath(file);\n            \n            // Skip files with no metadata or no ID\n            if (!meta || !meta.id) {\n              continue;\n            }\n\n            // If metadata exists and has an ID, it must match exactly\n            if (meta.id.toLowerCase() !== id.toLowerCase()) {\n              // Throw immediately if IDs don't match\n              throw new Error(`System integrity error: File ${file} has ID that does not match filename (${meta.id} vs ${id})`);\n            }\n            matches.push({ path: file, meta });\n          } catch (error: any) {\n            // Always rethrow system integrity errors\n            if (error.message.includes('System integrity error')) {\n              throw error;\n            }\n            errors.push({ path: file, error });\n          }\n        }\n      }\n\n      if (errors.length > 0) {\n        const errorDetails = errors.map(e => `${e.path} (${e.error.message})`).join(', ');\n        throw new Error(`System integrity error: Failed to parse metadata in files: ${errorDetails}`);\n      }\n\n      // Only consider matches where metadata ID matches exactly if present\n      const validMatches = matches.filter(m => !m.meta?.id || m.meta.id.toLowerCase() === id.toLowerCase());\n\n      if (validMatches.length > 1) {\n        const foundFiles = validMatches.map(m => m.path).join(', ');\n        throw new Error(`System integrity error: Multiple files found for ID ${id}: ${foundFiles}`);\n      }\n\n      return validMatches[0]?.path;\n    },\n\n    findFilesByType: async (type: string): Promise<string[]> => {\n      const paths = this.pathnameService.getPossiblePathsForType(type);\n      const files = await this.fileService.findFiles((f) => f.endsWith('.md'), paths);\n      const results: string[] = [];\n      for (const file of files) {\n        const meta = await this.fileMethods.getMetadataFromPath(file);\n        if (meta?.type === type) {\n          results.push(file);\n        }\n      }\n      return results;\n    }\n  };\n\n  frontmatterMethods = {\n    parseFrontmatter: async (content: string): Promise<Record<string, any> | null> => {\n      // Use doc-sections to parse the content\n      const sections = parseDocSections(content);\n      return sections.frontmatterObj || null;\n    },\n\n    updateFrontmatter: (content: string, frontmatter: FrontmatterMetadata): string => {\n      // Parse the document using doc-sections\n      const sections = parseDocSections(content);\n      \n      // Update the frontmatter object\n      sections.frontmatterObj = frontmatter;\n      sections.frontmatter = dump(frontmatter, this.YAML_DUMP_OPTIONS);\n\n      // Rebuild the document with the new frontmatter\n      return rebuildDocSections(sections);\n    },\n\n    createFrontmatter: async (metadata: FrontmatterMetadata): Promise<string> => {\n      const frontmatter = {\n        ...metadata,\n        created: new Date().toISOString()\n      };\n\n      // Create a new document with only frontmatter\n      const sections = {\n        frontmatter: dump(frontmatter, this.YAML_DUMP_OPTIONS),\n        frontmatterObj: frontmatter,\n        content: '',\n        xml: ''\n      };\n\n      // Build the document\n      return rebuildDocSections(sections);\n    },\n\n    getFrontmatterMetadata: async (filePath: string): Promise<FrontmatterMetadata | null> => {\n      try {\n        const content = await this.fileService.readFile(filePath);\n        const sections = parseDocSections(content);\n        // Return null if there is no frontmatter or if frontmatterObj is empty\n        if (!sections.frontmatter || Object.keys(sections.frontmatterObj).length === 0) {\n          return null;\n        }\n        return sections.frontmatterObj as FrontmatterMetadata;\n      } catch (error: any) {\n        if (error.message === 'File not found') {\n          return null;\n        }\n        throw error;\n      }\n    },\n\n    isValidFrontmatterMetadata: (meta: any): meta is FrontmatterMetadata => {\n      return (\n        typeof meta === 'object' &&\n        meta !== null &&\n        typeof meta.id === 'string' &&\n        typeof meta.type === 'string' &&\n        typeof meta.active === 'boolean'\n      );\n    },\n\n    validateMetadata: (metadata: FrontmatterMetadata): ValidationResult => {\n      // First validate format\n      const formatValidation = this.metadataValidator.validateFormat(metadata);\n      if (!formatValidation.valid) {\n        return formatValidation;\n      }\n\n      // Then apply plugin validation chain if plugins exist\n      if (this.pluginService) {\n        const pluginValidation = this.xmlMethods.applyPluginValidation(metadata);\n        if (!pluginValidation.valid) {\n          return pluginValidation;\n        }\n\n        // If plugin validation passed but had warnings, merge them with config validation\n        const configValidation = this.intentService.validateMetadataAgainstConfig(metadata);\n        return {\n          valid: configValidation.valid,\n          errors: configValidation.errors,\n          warnings: [...pluginValidation.warnings, ...configValidation.warnings]\n        };\n      }\n\n      // Finally validate against config/business rules\n      return this.intentService.validateMetadataAgainstConfig(metadata);\n    },\n\n    validateStateTransition: (current: FrontmatterMetadata, next: FrontmatterMetadata): ValidationResult => {\n      return this.intentService.validateStateTransition(\n        { pathname: '', metadata: current },\n        { pathname: '', metadata: next }\n      );\n    },\n\n    markAsDone: async (id: string, reason: string): Promise<string> => {\n      const filePath = await this.fileMethods.findFileById(id);\n      if (!filePath) {\n        throw new Error(`File not found for id: ${id}`);\n      }\n\n      // Update metadata with done state\n      const updates: Partial<FrontmatterMetadata> = {\n        active: false,\n        state: reason || 'done',\n        inactive_timestamp: new Date().toISOString()\n      };\n\n      // Apply the state transition\n      await this.frontmatterMethods.transitionActiveState(filePath, updates);\n\n      return filePath;\n    },\n\n    setFrontmatterMetadata: async (filePath: string, updates: Partial<FrontmatterMetadata>): Promise<string> => {\n      // Get current metadata\n      const currentMeta = await this.frontmatterMethods.getFrontmatterMetadata(filePath);\n      if (!currentMeta) {\n        throw new Error('No frontmatter found');\n      }\n\n      // Merge updates with current metadata\n      const updatedMeta = {\n        ...currentMeta,\n        ...updates\n      };\n\n      // Let IntentService interpret the metadata\n      const interpretedMeta = this.intentService.interpretMetadata(updatedMeta);\n\n      // Get new path based on interpreted metadata\n      const location = this.pathnameService.deriveFileLocation(interpretedMeta);\n      const newPath = path.join(location.dirname, location.basename);\n\n      // Read current content and update frontmatter\n      const content = await this.fileService.readFile(filePath);\n      const newContent = this.frontmatterMethods.updateFrontmatter(content, interpretedMeta);\n\n      // Normalize paths before comparison\n      const normalizedNewPath = path.normalize(newPath);\n      const normalizedFilePath = path.normalize(filePath);\n\n      // If path is changing, use atomic move which will handle cleanup\n      if (normalizedNewPath !== normalizedFilePath) {\n        await this.fileService.atomicMove(filePath, newPath, newContent);\n      } else {\n        // Otherwise just update content in place\n        await this.fileService.writeFile(filePath, newContent);\n      }\n\n      return newPath;\n    },\n\n    transitionActiveState: async (filePath: string, next: Partial<FrontmatterMetadata>): Promise<void> => {\n      const currentMeta = await this.frontmatterMethods.getFrontmatterMetadata(filePath);\n      if (!currentMeta) {\n        throw new Error('Could not get current metadata');\n      }\n\n      // Let IntentService interpret the metadata\n      const interpretedMeta = this.intentService.interpretMetadata(next);\n\n      // Clean and validate the transition\n      const updatedMeta = this.intentService.cleanStateTransition(currentMeta, interpretedMeta);\n      const validation = this.frontmatterMethods.validateStateTransition(currentMeta, updatedMeta);\n      if (!validation.valid) {\n        throw new Error(`Invalid state transition: ${validation.errors.join(', ')}`);\n      }\n\n      // Get new path and move file\n      const location = this.pathnameService.deriveFileLocation(updatedMeta);\n      const newPath = path.join(location.dirname, location.basename);\n\n      // Read current content and update frontmatter\n      const content = await this.fileService.readFile(filePath);\n      const newContent = this.frontmatterMethods.updateFrontmatter(content, updatedMeta);\n\n      // Write to new location atomically\n      await this.fileService.atomicMove(filePath, newPath, newContent);\n    }\n  };\n\n  xmlMethods = {\n    formatXMLAttributes: (metadata: Record<string, string> = {}, timestamp: string | false = false): string => {\n      const attrs: string[] = [];\n      \n      // Add timestamp first if provided\n      if (timestamp !== false) {\n        attrs.push(`time=\"${timestamp}\"`);\n      }\n      \n      // Add all other metadata attributes\n      for (const [key, value] of Object.entries(metadata)) {\n        if (value !== undefined) {\n          // Escape quotes in attribute values\n          const escapedValue = value.replace(/\"/g, '&quot;');\n          attrs.push(`${key}=\"${escapedValue}\"`);\n        }\n      }\n      \n      return attrs.length > 0 ? ' ' + attrs.join(' ') : '';\n    },\n\n    createXMLBlock: (tagName: string, content: string, metadata?: Record<string, string>, includeTime: boolean = false): string => {\n      const timestamp = includeTime ? new Date().toISOString() : false;\n      const attributes = this.xmlMethods.formatXMLAttributes(metadata, timestamp);\n      \n      // Ensure content has proper line endings and no extra whitespace\n      const normalizedContent = content.trim();\n      \n      // Return XML block with proper spacing - single newline within block\n      return `<${tagName}${attributes}>\\n${normalizedContent}\\n</${tagName}>`;\n    },\n\n    prependXML: async (options: XMLOptions): Promise<void> => {\n      const { id, tagName, content, metadata, time = false } = options;\n\n      // Find the file using findFileById\n      const filePath = await this.fileMethods.findFileById(id);\n      if (!filePath) {\n        throw new Error(`File not found for id: ${id}`);\n      }\n\n      // Read current content\n      const currentContent = await this.fileService.readFile(filePath);\n\n      // Parse using doc-sections\n      const sections = parseDocSections(currentContent);\n\n      // Create new XML block\n      const xmlBlock = this.xmlMethods.createXMLBlock(tagName, content, metadata, time);\n\n      // Prepend the new block to existing XML content with proper spacing\n      sections.xml = sections.xml\n        ? `${xmlBlock}\\n\\n${sections.xml.trim()}`\n        : xmlBlock;\n\n      // Rebuild the document\n      const newContent = rebuildDocSections(sections);\n\n      // Write updated content atomically\n      await this.fileService.writeFile(filePath, newContent);\n    },\n\n    appendXML: async (options: XMLOptions): Promise<void> => {\n      const { id, tagName, content, metadata, time = false } = options;\n\n      // Find the file using findFileById\n      const filePath = await this.fileMethods.findFileById(id);\n      if (!filePath) {\n        throw new Error(`File not found for id: ${id}`);\n      }\n\n      // Read current content\n      const currentContent = await this.fileService.readFile(filePath);\n\n      // Parse using doc-sections\n      const sections = parseDocSections(currentContent);\n\n      // Create new XML block\n      const xmlBlock = this.xmlMethods.createXMLBlock(tagName, content, metadata, time);\n\n      // Append the new block to existing XML content with proper spacing\n      sections.xml = sections.xml\n        ? `${sections.xml.trim()}\\n\\n${xmlBlock}`\n        : xmlBlock;\n\n      // Rebuild the document\n      const newContent = rebuildDocSections(sections);\n\n      // Write updated content atomically\n      await this.fileService.writeFile(filePath, newContent);\n    },\n\n    prependUpdate: async (options: UpdateOptions): Promise<void> => {\n      const { metadata, ...rest } = options;\n      // Convert UpdateMetadata to Record<string, string> by filtering out undefined values\n      const cleanedMetadata = metadata ? \n        Object.fromEntries(\n          Object.entries(metadata)\n            .filter(([_, value]) => value !== undefined)\n            .map(([key, value]) => [key, value as string])  // Assert non-undefined values are strings\n        ) as Record<string, string> : undefined;\n\n      await this.xmlMethods.prependXML({\n        ...rest,\n        tagName: 'Update',\n        time: options.time ?? true, // Default to true for Update blocks\n        metadata: cleanedMetadata\n      });\n    },\n\n    appendUpdate: async (options: UpdateOptions): Promise<void> => {\n      const { metadata, ...rest } = options;\n      // Convert UpdateMetadata to Record<string, string> by filtering out undefined values\n      const cleanedMetadata = metadata ? \n        Object.fromEntries(\n          Object.entries(metadata)\n            .filter(([_, value]) => value !== undefined)\n            .map(([key, value]) => [key, value as string])  // Assert non-undefined values are strings\n        ) as Record<string, string> : undefined;\n\n      await this.xmlMethods.appendXML({\n        ...rest,\n        tagName: 'Update',\n        time: options.time ?? true, // Default to true for Update blocks\n        metadata: cleanedMetadata\n      });\n    },\n\n    applyPluginValidation: (metadata: FrontmatterMetadata): ValidationResult => {\n      const result: ValidationResult = { \n        valid: true, \n        errors: [], \n        warnings: []\n      };\n\n      // Get plugins in priority order (already sorted by PluginService)\n      const plugins = this.pluginService!.getPlugins();\n\n      for (const plugin of plugins) {\n        try {\n          if (plugin.validateMetadata) {\n            const pluginResult = plugin.validateMetadata(metadata);\n            \n            // Merge warnings\n            if (pluginResult.warnings) {\n              result.warnings.push(...pluginResult.warnings);\n            }\n\n            // If plugin validation fails, merge errors and mark as invalid\n            if (!pluginResult.valid) {\n              result.valid = false;\n              if (pluginResult.errors) {\n                result.errors.push(...pluginResult.errors);\n              }\n            }\n          }\n        } catch (error: any) {\n          // Log error but continue with other plugins\n          logger.error(`Plugin ${plugin.name} validation failed:`, error);\n          result.warnings.push(`Plugin ${plugin.name} validation error: ${error.message}`);\n        }\n      }\n\n      return result;\n    }\n  };\n\n  // Public methods for validation\n  validateMetadata = this.frontmatterMethods.validateMetadata;\n  validateStateTransition = this.frontmatterMethods.validateStateTransition;\n\n  getIssueDirectories(): string[] {\n    const dirs = [];\n    const paths = this.pathnameService.getActivityDirectories();\n    const issueTypes = this.pathnameService.getConfig().types_list;\n    for (const type of issueTypes) {\n      for (const path of paths) {\n        dirs.push(join(path, type));\n      }\n    }\n    return dirs;\n  }\n} "]}