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", missing by 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, prefixed skilletor:. 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.

https://raudssus.de/