NAME
Langertha::Raider::SkillResolver::Skilletor - Internal skill resolver over the sources of skilletor.json, read without installing
VERSION
version 0.504
SYNOPSIS
# Internal to Langertha-Raider -- no API promise.
my $r = Langertha::Raider::SkillResolver::Skilletor->new(
home => $context->home,
project_dir => $context->layout->project_dir->stringify,
);
my $skill = $r->resolve('perl-moo');
# { name => 'perl-moo', dir => '.../cache/<hash>/skills/perl-moo',
# file => '.../SKILL.md', via => 'skilletor:shared' } or undef
my $why = $r->why_unresolved('perl-moo'); # 'skilletor: ...' or undef
DESCRIPTION
Internal module. Its interface may change without notice.
The second resolver of Langertha::Raider::SkillResolver (ADR 0020 §6), asked only for the names the skill catalogue does not know: a skill one of the skilletor.json files declares -- ~/.claude/skilletor.json, the project's .claude/skilletor.json and .claude/skilletor.local.json -- read straight from its source through "resolve_item" in Skilletor, without installing it. The directory is the local source's own or the shared cache (~/.claude/skilletor/cache/<hash>/...) the skilletor CLI fills too.
Lazy. Without any of the three files nothing happens -- no Skilletor object, no lock, nothing written under the home. The object is built at the first name the catalogue misses and answers every later name from the same resolution.
Fetching is "fetch",
missingby default: a source is fetched (git, an https tarball) the first time a skill of it is needed and served from the shared cache afterwards, so a spawn does not touch the network each time.Never fatal. A templated skill (
.njk, which the Perl port does not render), a config error, a source that cannot be fetched or is not trusted yet: the name does not resolve, and "why_unresolved" says why, prefixedskilletor:. The briefing's refusal carries that reason.
Skilletor finds its files under home/.claude -- as the skilletor CLI does, $CLAUDE_CONFIG_DIR is not consulted.
home
The user's home directory. Required.
project_dir
The project directory (where .claude/ lies), or undef for the user scope alone.
fetch
Skilletor's fetch policy: missing (default), always or never.
skilletor
The Skilletor object, built on first use ("skilletor_class").
skilletor_class
Skilletor.
config_files
The skilletor.json files that exist, as strings.
has_config
True when "config_files" names one: only then is Skilletor asked.
resolve
my $skill = $r->resolve('perl-moo');
{ name, dir, file, via } -- via is skilletor:<source> -- of the skill a skilletor.json declares under that name, or undef.
why_unresolved
my $reason = $r->why_unresolved('tpl');
# 'skilletor: tpl@shared is a template; templates are not supported in Perl'
Why a name a skilletor.json declares (or that broke the lookup) does not resolve, or undef when there is nothing to say -- no config, or a name nobody declares.
SEE ALSO
SUPPORT
Issues
Please report bugs and feature requests at https://github.com/Getty/langertha-raider/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 <torsten@raudssus.de> https://raudssus.de/
COPYRIGHT AND LICENSE
This software is copyright (c) 2026 by Torsten Raudssus.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.