NAME
App::karr::Cmd::Skill - Install, check, and update bundled agent skills
VERSION
version 0.602
SYNOPSIS
karr skill install
karr skill install --agent codex,cursor
karr skill check --global
karr skill update --force
karr skill show
karr skill show kanban-issues-karr-ticket
DESCRIPTION
Installs and maintains the bundled karr skills for supported agent clients. Two skills ship:
kanban-issues-karr-coordinationReading a board, picking, claiming and creating cards, handing them to subagents, filing on another repository's board, configuring and syncing karr.
kanban-issues-karr-ticketWorking the one card an agent was handed: reading it, noting progress, blocking it, handing it to review.
Each skill is a directory -- SKILL.md, which an agent loads on every trigger, plus references/*.md where it has them, which it reads on demand -- and every action below handles the two skills as one set. The command can target project-local directories or global skill locations in the current user's home directory, which makes it useful both for direct Perl installs and Docker-wrapped vendor usage.
Earlier releases shipped a single skill, kanban-issues-karr-cli, that the two above replace. A directory of that name next to them is a leftover: install and update remove it and report it removed, check reports it stale (see "ACTIONS").
Writes go into each target file in place, keeping its inode, so a SKILL.md that is one link of a hardlink chain shared across projects stays part of that chain instead of being silently broken out of it.
--global selects the home-directory location instead of the project-local one; the two coincide for claude-code and cursor but differ for codex (see "SUPPORTED AGENTS").
TARGET DIRECTORY
The project-local target is the current working directory: the skill directories are written straight underneath it, at .claude/skills/kanban-issues-karr-coordination/ and .claude/skills/kanban-issues-karr-ticket/ for claude-code and at the equivalent paths for the other agents. Nothing is discovered on the way there and no repository is involved -- this command has no board, and installing into a directory that is not a Git repository at all is a supported use. --global is the same idea one level up: the target is the current user's home directory instead. When --agent is omitted, even the auto-detection reads the current directory, so both which agents are touched and where their files land follow from where the command was run.
The root option --dir is therefore refused, in both placements, and both exit 2: karr skill install --dir PATH is an unknown option (this command declares none), and karr --dir PATH skill install is a usage error that names the current directory as the target. --dir is the starting point of a search upward for one repository's root -- which is why it may name any directory inside that repository -- and that is not what this command's target is; handed the same path, the two would answer about different directories. To install into another tree, cd there. Before ticket #226 the root placement was accepted and then discarded without a word, so the file was written into the tree the caller happened to be standing in while the message read as if the named one had been used.
karr init --claude-skill writes the very same directories and does honour --dir: it installs into the root of the repository it is initializing, and it needs a repository in the first place.
SUPPORTED AGENTS
The built-in agent targets are claude-code, codex, and cursor. When --agent is omitted, the command auto-detects available client directories and falls back to all known agents if nothing is detected.
ACTIONS
Every action reports one line per agent and skill, and with --json one object per agent and skill, each carrying agent, skill and status (plus path where a directory or file was written or removed), in one JSON array. A retired skill directory is reported under its own name in the skill key.
installWrites the current bundled skills -- each one's SKILL.md and every references/*.md -- to the selected target locations. A skill whose target already has a SKILL.md is left alone and reported
existsunless--forceis given, which overwrites every file unconditionally. Every written skill is reportedinstalledwith the absolute path of its SKILL.md, in the plain output as well as under thepathkey of--json, so the message says which tree the skill went into. A retiredkanban-issues-karr-clidirectory beside them is removed and reportedremoved, with the path of the directory.checkCompares every installed file with the bundled version. Per skill: a target with no SKILL.md is
not installed, whatever else is under it; a shipped file that is missing from the target, or differs from it, makes the skilloutdated; otherwise it iscurrent. Once an agent has either skill (or the retired one) installed, the other one missing counts asoutdatedtoo: the two are one set. A retiredkanban-issues-karr-clidirectory is reportedstale. The command exits1when anything isoutdatedorstale-- the check ran and found work forupdate-- and0otherwise;not installedalone is not a failure.updateBrings the installed set current, in place: every shipped file that is missing or differs is rewritten, the ones that match are left untouched, and so is anything in the target that is not shipped (a reference file a later release dropped, say). An agent counts as installed when it has either skill or the retired one; for such an agent, a skill that is missing is written whole.
currentmeans every file already matched,updatedthat something was written. A retiredkanban-issues-karr-clidirectory is removed and reportedremoved-- soupdatealone migrates a target from the single skill of earlier releases to the pair. An agent with none of them isnot installedand left alone.show [NAME]Prints a bundled SKILL.md to standard output: the one of skill NAME when given (
kanban-issues-karr-coordinationorkanban-issues-karr-ticket), otherwise every bundled skill's in the order above, separated by one blank line. Each file is printed as it ships, frontmatter included, so thename:line at the top of each says which skill follows. With--jsonthe output is a JSON array of objects withskillandcontent-- one per skill printed, so a single NAME gives an array of one. An unknown NAME is a usage error (exit2).
SEE ALSO
karr, App::karr, App::karr::Cmd::Init, App::karr::Role::SkillFile, App::karr::Cmd::Context, App::karr::Cmd::Config
SUPPORT
Issues
Please report bugs and feature requests on GitHub at https://github.com/Getty/karr/issues.
IRC
Join #langertha on irc.perl.org or message Getty directly.
CONTRIBUTING
Contributions are welcome! Please fork the repository and submit a pull request.
AUTHOR
Torsten Raudssus <getty@cpan.org>
COPYRIGHT AND LICENSE
This software is Copyright (c) 2026 by Torsten Raudssus <torsten@raudssus.de> https://raudssus.de/.
This is free software, licensed under:
The Artistic License 2.0 (GPL Compatible)