Claude-Agent-Code-Refactor

 view release on metacpan or  search on metacpan

lib/Claude/Agent/Code/Refactor/Options.pm  view on Meta::CPAN

package Claude::Agent::Code::Refactor::Options;

use 5.020;
use strict;
use warnings;

use Object::Proto ();

my @VALID_SEVERITIES = qw(critical high medium low info);
my @VALID_CATEGORIES = qw(bugs security style performance maintainability);

BEGIN {
    Object::Proto::define('Claude::Agent::Code::Refactor::Options',
        'max_iterations:Int:default(5)',
        'max_turns_per_fix:Int:default(20)',
        'stop_on_critical:Bool:default(1)',
        'min_severity:Str:default(low)',
        'categories:builder(_build_categories)',
        'fix_one_at_a_time:Bool:default(0)',
        'dry_run:Bool:default(0)',
        'create_backup:Bool:default(0)',
        'perlcritic:default(0)',
        'perlcritic_severity:Int:default(4)',
        'filter_false_positives:Bool:default(1)',
        'model',
        'effort:Str:predicate',
        'permission_mode:Str:default(acceptEdits)',
    );
}

sub _build_categories {
    return [@VALID_CATEGORIES];
}

sub BUILD {
    my ($self) = @_;

    if (defined $self->min_severity) {
        my $sev = $self->min_severity;
        unless (grep { $_ eq $sev } @VALID_SEVERITIES) {
            my $safe_sev = $sev =~ s/[^a-zA-Z0-9_-]//gr;
            die "Invalid min_severity '$safe_sev'. Must be one of: " . join(', ', @VALID_SEVERITIES);
        }
    }

    if (defined $self->categories) {
        unless (ref $self->categories eq 'ARRAY') {
            die "Categories must be an array reference";
        }
        unless (@{$self->categories}) {
            die "Categories cannot be empty";
        }
        for my $cat (@{$self->categories}) {
            unless (grep { $_ eq $cat } @VALID_CATEGORIES) {
                my $safe_cat = $cat =~ s/[^a-zA-Z0-9_-]//gr;
            die "Invalid category '$safe_cat'. Must be one of: " . join(', ', @VALID_CATEGORIES);
            }
        }
    }

    if (defined $self->max_iterations) {
        if ($self->max_iterations < 1) {
            die "max_iterations must be >= 1";
        }
        if ($self->max_iterations > 100) {
            die "max_iterations must be <= 100 to prevent resource exhaustion";
        }
    }

    if (defined $self->max_turns_per_fix) {
        if ($self->max_turns_per_fix < 1) {
            die "max_turns_per_fix must be >= 1";
        }
        if ($self->max_turns_per_fix > 100) {
            die "max_turns_per_fix must be <= 100 to prevent resource exhaustion";
        }
    }

    if (defined $self->perlcritic_severity) {
        my $sev = $self->perlcritic_severity;
        unless ($sev =~ /^[1-5]$/) {

lib/Claude/Agent/Code/Refactor/Options.pm  view on Meta::CPAN

    my ($self) = @_;

    require Claude::Agent::Code::Review::Options;

    my $review_perm_mode = 'default';

    return Claude::Agent::Code::Review::Options->new(
        severity               => $self->min_severity,
        categories             => $self->categories,
        perlcritic             => $self->perlcritic,
        perlcritic_severity    => $self->perlcritic_severity,
        filter_false_positives => $self->filter_false_positives,
        permission_mode        => $review_perm_mode,
        ($self->model ? (model => $self->model) : ()),
        ($self->has_effort ? (effort => $self->effort) : ()),
    );
}


1;

__END__

=head1 NAME

Claude::Agent::Code::Refactor::Options - Configuration options for code refactoring

=head1 SYNOPSIS

    use Claude::Agent::Code::Refactor::Options;

    my $options = Claude::Agent::Code::Refactor::Options->new(
        max_iterations  => 5,
        min_severity    => 'medium',
        categories      => ['bugs', 'security'],
        permission_mode => 'acceptEdits',
    );

=head1 DESCRIPTION

Configuration object for Claude::Agent::Code::Refactor.

=head2 ATTRIBUTES

=over 4

=item * max_iterations - Maximum review-fix-review cycles (default: 5)

=item * max_turns_per_fix - Maximum Claude turns per fix attempt (default: 20)

=item * stop_on_critical - Halt if critical issue can't be fixed (default: 1)

=item * min_severity - Minimum severity to fix (default: 'low')

=item * categories - ArrayRef of categories to fix (default: all)

=item * fix_one_at_a_time - Fix issues one at a time vs all at once (default: 0)

=item * dry_run - Preview fixes without applying (default: 0)

=item * create_backup - Backup files before editing (default: 0)

=item * perlcritic - Include perlcritic in review (default: 0)

=item * perlcritic_severity - Perlcritic severity 1-5 (default: 4)

=item * filter_false_positives - Filter AI false positives (default: 1)

=item * model - Claude model to use (default: inherited)

=item * effort - Effort level passed to both the review and the fix: low, medium, high, xhigh or max (optional; C<has_effort> reports whether it was given)

=item * permission_mode - Permission mode (default: 'acceptEdits')

=back

=head1 METHODS

=head2 to_review_options

Returns a Claude::Agent::Code::Review::Options object configured with
the review-related settings from this object.

=cut

=head1 AUTHOR

LNATION, C<< <email at lnation.org> >>

=head1 LICENSE

This software is Copyright (c) 2026 by LNATION.

This is free software, licensed under The Artistic License 2.0 (GPL Compatible).

=cut



( run in 1.060 second using v1.01-cache-2.11-cpan-3f962061493 )