App-karr
view release on metacpan or search on metacpan
lib/App/karr.pm view on Meta::CPAN
[ skill => 'Install/update agent skills' ],
[ 'set-refs' => 'Store helper payloads in a Git ref' ],
[ 'get-refs' => 'Fetch and print helper payloads from a Git ref' ],
);
sub _print_help {
my ($self_or_class, $code) = @_;
$code //= 0;
my $out = '';
$out .= colored("karr", 'bold') . " - Kanban Assignment & Responsibility Registry\n\n";
$out .= colored("USAGE:", 'bold') . " karr [--dir PATH] <command> [options]\n\n";
$out .= colored("COMMANDS:", 'bold') . "\n";
my $max = 0;
for (@COMMANDS) { $max = length($_->[0]) if length($_->[0]) > $max }
for my $cmd (@COMMANDS) {
$out .= sprintf " %-*s %s\n", $max, colored($cmd->[0], 'cyan'), $cmd->[1];
}
$out .= "\n" . colored("OPTIONS:", 'bold') . "\n";
$out .= " --dir PATH Starting path for Git repository discovery\n";
$out .= " --json JSON output (most commands)\n";
$out .= " --compact Compact output (list, board)\n";
$out .= "\n" . colored("EXAMPLES:", 'bold') . "\n";
$out .= " karr init --name \"My Project\"\n";
$out .= " karr create --title \"Fix login bug\" --priority high\n";
$out .= " karr list --status todo,in-progress\n";
$out .= " karr move 1 in-progress --claim agent-fox\n";
$out .= " karr pick --claim agent-fox --move in-progress\n";
$out .= " karr backup > karr-backup.yml\n";
$out .= " karr restore --yes < karr-backup.yml\n";
$out .= " karr set-refs superpowers/spec/1234.md draft ready\n";
$out .= " karr board\n";
$out .= "\nRun " . colored("karr <command> --help", 'bold') . " for command-specific options.\n";
if ($code > 0) { warn $out } else { print $out }
exit $code if $code >= 0;
}
around options_usage => sub { $_[1]->_print_help($_[2]) };
around options_help => sub { $_[1]->_print_help($_[2]) };
around options_short_usage => sub { $_[1]->_print_help($_[2]) };
sub execute {
lib/App/karr/Cmd/Board.pm view on Meta::CPAN
my %STATUS_COLOR = (
backlog => 'bright_black',
todo => 'cyan',
'in-progress' => 'yellow',
review => 'magenta',
done => 'green',
archived => 'bright_black',
);
my %PRIORITY_COLOR = (
critical => 'bold red',
high => 'red',
medium => 'yellow',
low => 'bright_black',
);
sub execute {
my ($self, $args_ref, $chain_ref) = @_;
my $ec = $self->store->effective_config;
my @statuses = $self->store->all_status_names;
lib/App/karr/Cmd/Board.pm view on Meta::CPAN
# Colour only when writing to a real terminal â piped or redirected output
# stays clean plaintext so the board diffs, greps, and pastes cleanly.
my $color = -t STDOUT && !$ENV{NO_COLOR};
my $c = sub {
my ($text, $spec) = @_;
return $color ? colored($text, $spec) : $text;
};
my $sep = $c->('|', 'bright_black');
print $c->("# $board_name", 'bold cyan'), "\n";
# Skip empty archived unless it has tasks
my @display_statuses = grep {
$_ ne 'archived' || @{$by_status{$_} // []}
} @statuses;
for my $status (@display_statuses) {
my $tasks = $by_status{$status} // [];
my $label = join ' ', map { ucfirst } split /-/, $status;
my $accent = $STATUS_COLOR{$status} // 'white';
print "\n", $c->("## $label", "bold $accent"), "\n";
for my $t (@$tasks) {
my @meta;
if ($t->priority && $t->priority ne 'medium') {
push @meta, $c->('priority:' . $t->priority, $PRIORITY_COLOR{$t->priority} // 'white');
}
if ($t->has_claimed_by && $t->status ne 'done' && $t->status ne 'archived') {
push @meta, $c->('@' . $t->claimed_by, 'cyan');
}
if ($t->has_blocked) {
my $reason = $t->blocked;
$reason = substr($reason, 0, 40) . '...' if defined $reason && length $reason > 43;
push @meta, $c->(
defined $reason && length $reason ? "blocked:$reason" : 'blocked', 'bold red');
}
if ($t->has_due) {
push @meta, $c->('due:' . $t->due, 'yellow');
}
my $line = join ' ', $c->('-', 'bright_black'), $t->id, $sep, $t->title;
$line .= " $sep " . join(" $sep ", @meta) if @meta;
print $line, "\n";
if ($self->tags && @{$t->tags}) {
lib/App/karr/Cmd/Board.pm view on Meta::CPAN
}
}
}
# Summary footer
my $blocked = grep { $_->has_blocked } @tasks;
my $claimed = grep { $_->has_claimed_by && $_->status ne 'done' && $_->status ne 'archived' } @tasks;
my @summary = ( scalar(@tasks) . ' tasks' );
push @summary, "$claimed claimed" if $claimed;
push @summary, "$blocked blocked" if $blocked;
print "\n", $c->(join(' ', @summary), 'bold'), "\n";
}
1;
__END__
=pod
=encoding UTF-8
( run in 2.145 seconds using v1.01-cache-2.11-cpan-2398b32b56e )