Module: RosettAi::ExitCodes

Defined in:
lib/rosett_ai/exit_codes.rb

Overview

Maps error categories to numeric exit codes for CLI process exit.

Exit codes follow Unix conventions:

  • 0: success
  • 1: general/runtime error
  • 2: validation/input error
  • 3: configuration error
  • 4: permission/access error
  • 5: dependency/environment error

Author:

  • hugo

  • claude

Constant Summary collapse

SUCCESS =
0
GENERAL =
1
VALIDATION =
2
CONFIG =
3
PERMISSION =
4
DEPENDENCY =
5
MAPPING =

Maps each RosettAi error class to its exit code.

Returns:

  • (Hash{Class => Integer})
{
  RosettAi::Error => GENERAL,
  RosettAi::ValidationError => VALIDATION,
  RosettAi::BehaviourError => VALIDATION,
  RosettAi::DesignError => VALIDATION,
  RosettAi::CompositionError => VALIDATION,
  RosettAi::CompileError => VALIDATION,
  RosettAi::ConfigurationError => CONFIG,
  RosettAi::AiConfigError => CONFIG,
  RosettAi::PolicyError => CONFIG,
  RosettAi::InitError => CONFIG,
  RosettAi::AdoptError => GENERAL,
  RosettAi::BackupError => GENERAL,
  RosettAi::BuildError => GENERAL,
  RosettAi::DocumentationError => GENERAL,
  RosettAi::ReleaseError => GENERAL,
  RosettAi::ToolingError => VALIDATION,
  RosettAi::LicenseError => CONFIG,
  RosettAi::ContentError => GENERAL,
  RosettAi::ProvenanceError => GENERAL,
  RosettAi::AuthorshipError => GENERAL,
  RosettAi::DoctorError => GENERAL,
  RosettAi::FeatureFlagError => GENERAL,
  RosettAi::ComplianceError => VALIDATION,
  RosettAi::WorkflowError => GENERAL,
  RosettAi::ProjectError => GENERAL,
  RosettAi::RetrofitError => CONFIG,
  RosettAi::GitHooksError => GENERAL,
  RosettAi::McpError => GENERAL
}.freeze

Class Method Summary collapse

Class Method Details

.for(error) ⇒ Integer

Resolves the exit code for a given error.

Walks the class hierarchy to find the most specific mapping. Falls back to GENERAL (1) for unmapped error classes.

Parameters:

  • error (Exception)

    the error to map

Returns:

  • (Integer)

    the exit code (0-5)



68
69
70
71
72
73
74
# File 'lib/rosett_ai/exit_codes.rb', line 68

def self.for(error)
  klass = error.is_a?(Class) ? error : error.class
  MAPPING.fetch(klass) do
    ancestor = klass.ancestors.find { |ancestor_class| MAPPING.key?(ancestor_class) }
    ancestor ? MAPPING[ancestor] : GENERAL
  end
end