App-karr
view release on metacpan or search on metacpan
lib/App/karr.pm view on Meta::CPAN
# ABSTRACT: Kanban Assignment & Responsibility Registry
package App::karr;
our $VERSION = '0.301';
use Moo;
use MooX::Cmd;
use MooX::Options;
use Term::ANSIColor qw( colored );
use App::karr::Role::BoardAccess;
with 'App::karr::Role::BoardAccess';
option dir => (
is => 'ro',
format => 's',
doc => 'Path used as the starting point for Git repository discovery',
predicate => 1,
);
my @COMMANDS = (
[ init => 'Initialize a new karr board' ],
[ create => 'Create a new task' ],
[ list => 'List and filter tasks' ],
[ show => 'Show full task details' ],
[ board => 'Show board summary' ],
[ move => 'Change task status' ],
[ edit => 'Modify task fields' ],
[ delete => 'Delete a task' ],
[ pick => 'Claim the next available task' ],
[ archive => 'Archive a task (soft-delete)' ],
[ handoff => 'Hand off a task for review' ],
[ destroy => 'Delete the entire refs/karr/* board' ],
[ config => 'View or modify board config' ],
[ context => 'Generate board context summary' ],
[ backup => 'Export refs/karr/* as YAML' ],
[ restore => 'Replace refs/karr/* from YAML' ],
[ sync => 'Sync board with remote' ],
[ agentname => 'Generate a random agent name' ],
[ 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 {
my ($self, $args_ref, $chain_ref) = @_;
# Default action: show board summary
eval {
require App::karr::Cmd::Board;
App::karr::Cmd::Board->new(
board_dir => $self->board_dir,
)->execute($args_ref, $chain_ref);
};
if ($@) {
if ($@ =~ /No karr board found/) {
die "No karr board found. Run 'karr init' to create one.\n";
}
die $@;
}
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
App::karr - Kanban Assignment & Responsibility Registry
=head1 VERSION
version 0.301
=head1 SYNOPSIS
karr init --name "My Project"
karr create "Fix login bug" --priority high
karr list --status todo,in-progress
karr board
karr set-refs superpowers/spec/1234.md draft ready
karr get-refs superpowers/spec/1234.md
=head1 DESCRIPTION
L<App::karr> is the central module behind the L<karr> command line client. The
distribution manages a Git-native kanban board stored in C<refs/karr/*>, where
task cards are Markdown payloads and board configuration is sparse YAML kept in
refs rather than in checked-in work tree files.
The distribution is intended for repositories that want Git to remain the
transport and source of truth. Commands materialize a temporary board view only
( run in 0.427 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )