This file provides project guidance for Claude Code and similar coding agents.
App::karr — Kanban Assignment & Responsibility Registry
A Perl reimplementation of kanban-md, a file-based kanban board designed for multi-agent workflows. The reference implementation is in Go and lives at ../kanban-md/ relative to this workspace.
This is a Dist::Zilla distribution using [@Author::GETTY].
Engineering discipline, the delegation lane, board coordination, and the release policy live in
.claude/rules/karr-rules.md — auto-loaded by Claude Code at launch. Don't restate them here.
Delegate behavior-relevant code instead of editing it yourself (the rule and rationale are in
the rules file). Agents in this repo (skills force-loaded via briefing.skills):
| Task | Agent |
|---|---|
| Implement / refactor / debug behavior-relevant code | karr-worker (default) |
Write/extend tests under t/ |
karr-test-writer |
| Pre-release audit (Changes, cpanfile, dist.ini, version) | karr-release-checker |
POD (=attr/=method, # ABSTRACT) |
karr-pod-writer |
Dogfood: karr tracks its own work on its own board (refs/karr/*). Use karr list --compact
/ karr board for open work and file bugs found here as tickets. Full surface: skill
kanban-issues-karr-cli.
The Go implementation at ../kanban-md/ is the feature reference. Key docs:
../kanban-md/README.md— Full command reference and design principles../kanban-md/cmd/— CLI command implementations../kanban-md/internal/task/— Task file parsing, validation, consistency../kanban-md/internal/board/— Board operations, filtering, sorting, picking../kanban-md/internal/config/— Config schema, migration, defaults
Goal: Feature parity with kanban-md, but idiomatic Perl with Moo, MooX::Cmd, MooX::Options.
bin/karr— CLI entry pointlib/App/karr.pm— Main app, MooX::Cmd rootlib/App/karr/Cmd/*.pm— Subcommands (MooX::Cmd default namespace)lib/App/karr/Role/Output.pm— Role for --json and --compact output optionslib/App/karr/Encoding.pm— The character/octet boundary: argv, std handles, ref blobs, YAML, JSONlib/App/karr/Role/BoardDiscovery.pm— Role providing git/store/config discoverylib/App/karr/Role/SyncLifecycle.pm— Role providing sync_before/sync_after with retrylib/App/karr/Role/BoardAccess.pm— Composes BoardDiscovery + SyncLifecycle + task accesslib/App/karr/Task.pm— Task object: parse/write Markdown+YAML frontmatterlib/App/karr/Config.pm— Board config management (defaults + helpers)lib/App/karr/SyncGuard.pm— Push insurance on die/croaklib/App/karr/Git.pm— Low-level Git operations; local ops native via Git::Native (libgit2), with a git-CLI fallback for remote transport (ssh-config/ProxyCommand)lib/App/karr/BoardStore.pm— Ref-backed board storage (load_tasks, save_task, effective_config)lib/App/karr/Lock.pm— Advisory task locking via refs
Canonical state lives in refs/karr/*. The tasks/ directory (with its
config.yml) is a materialized view, not the source of truth, and is always in
F<.gitignore> — never committed. karr materialize writes that file view from
the refs (BoardStore->materialize_to) and karr import --yes reads it back in
(serialize_from) — a bridge for kanban-md interop and grepping files, not a
storage backend.
| Command | Status | kanban-md equivalent |
|---|---|---|
init |
implemented | init |
create |
implemented | create / add |
list |
implemented | list / ls |
show |
implemented | show |
move |
implemented | move |
edit |
implemented | edit |
delete |
implemented | delete / rm |
board |
implemented | board / summary |
pick |
implemented | pick |
archive |
implemented | archive |
handoff |
implemented | handoff |
metrics |
TODO | metrics |
log |
implemented | log |
config |
implemented | config |
context |
implemented | context |
agent-name |
implemented | agent-name |
skill |
implemented | skill |
materialize |
implemented | — (refs→files bridge) |
import |
implemented | — (files→refs bridge) |
repair |
implemented | — (migrates a pre-0.403 board off double-encoded UTF-8) |
sync |
implemented | — (explicit refs pull/push) |
backup |
implemented | — (board snapshot to YAML) |
restore |
implemented | — (snapshot→refs, destructive) |
destroy |
implemented | — (remove refs/karr/* incl. remote) |
set-refs / get-refs |
implemented | — (helper refs outside the board) |
disable / enable |
implemented | — (board-level opt-out from karr-foundation runs) |
- MooX::Cmd for subcommand dispatch (not App::Cmd — lighter, Moo-native)
- MooX::Options for CLI option parsing
- YAML::XS for frontmatter (fast, correct YAML parsing)
- Path::Tiny for all file operations
- No namespace::clean in command classes (incompatible with MooX::Options)
- Task file format 100% compatible with kanban-md (interop goal)
- Characters inside, octets only at the edges. Everything between the CLI
entry point and the Git ref blob is a Perl character string.
App::karr::Encodingowns every crossing —@ARGV, STDOUT/STDERR, ref read/write, YAML, JSON — and nothing else mayEncode::encode/decode, callYAML::XS::Dump/Load, orencode_json/decode_jsondirectly.Path::Tiny'sslurp_utf8/spew_utf8are already character-level: putting an encode in front of one is a double encode. Boards written before this rule are detected viarefs/karr/meta/encodingand repaired on read;karr repairmigrates them.
prove -l t/ # Run all tests
prove -l t/01-task.t # Run specific test
dzil test # Full Dist::Zilla test
dzil build # Build distributionLive status is on the karr board (refs/karr/*); this is the at-a-glance summary.
- metrics command — throughput, lead/cycle time, flow efficiency
- dependency checking — block tasks with unsatisfied deps from being picked
- Self-healing IDs — detect and repair duplicate IDs, filename/ID mismatches
- WIP limit enforcement — reject moves that would exceed WIP limits
- TUI — interactive terminal board (stretch goal, possibly with Tickit)
- Keep runtime dependencies in
cpanfile, notdist.ini - For user-visible changes, add an unreleased entry under
{{$NEXT}}inChanges - POD follows
[@Author::GETTY]conventions (inline=attr,=method, no manual NAME/VERSION/AUTHOR sections) # ABSTRACT:comment required on every .pm file- Release policy (
dzil releaseonly with explicit go-ahead) is in.claude/rules/karr-rules.md
Agent/skill/rule material lives under .claude/:
rules/karr-rules.md— house rules, auto-loaded (discipline, delegation, coordination, release)agents/karr-*.md— the project agent fleet (briefing-aware; skills force-loaded at spawn)skills/—kanban-issues-karr-cli+ shared Getty Perl skills (hardlinked via manage-skills; don't rename, and edit viacat > .claude/skills/<skill>/SKILL.md— not theEdit/Writetools, which mint a new inode and break the shared hardlink; see skillmanage-skills)
Keep this file focused on the repository; behavioral rules belong in rules/, not here.