Class: SignalWire::Skills::Builtin::ClaudeSkillsSkill

Inherits:
SkillBase
  • Object
show all
Defined in:
lib/signalwire/skills/builtin/claude_skills.rb

Overview

Loads Claude SKILL.md files as agent tools.

Instance Attribute Summary

Attributes inherited from SkillBase

#agent, #logger, #params, #swaig_fields

Instance Method Summary collapse

Methods inherited from SkillBase

#cleanup, #get_global_data, #get_param, #initialize, #required_env_vars, #version

Constructor Details

This class inherits a constructor from SignalWire::Skills::SkillBase

Instance Method Details

#descriptionObject



12
# File 'lib/signalwire/skills/builtin/claude_skills.rb', line 12

def description; 'Load Claude SKILL.md files as agent tools'; end

#get_hintsObject



46
47
48
# File 'lib/signalwire/skills/builtin/claude_skills.rb', line 46

def get_hints
  @discovered.flat_map { |s| s[:name].split(/[-_]/) }.uniq
end

#get_parameter_schemaObject



56
57
58
59
60
61
62
63
64
# File 'lib/signalwire/skills/builtin/claude_skills.rb', line 56

def get_parameter_schema
  {
    'skills_path'        => { 'type' => 'string', 'required' => true },
    'include'            => { 'type' => 'array' },
    'exclude'            => { 'type' => 'array' },
    'skill_descriptions' => { 'type' => 'object' },
    'tool_prefix'        => { 'type' => 'string', 'default' => 'claude_' }
  }
end

#get_prompt_sectionsObject



50
51
52
53
54
# File 'lib/signalwire/skills/builtin/claude_skills.rb', line 50

def get_prompt_sections
  @discovered.map do |skill|
    { 'title' => "Claude Skill: #{skill[:name]}", 'body' => skill[:content][0, 200] }
  end
end

#instance_keyObject



29
# File 'lib/signalwire/skills/builtin/claude_skills.rb', line 29

def instance_key; "claude_skills_#{@skills_path}"; end

#nameObject



11
# File 'lib/signalwire/skills/builtin/claude_skills.rb', line 11

def name;        'claude_skills'; end

#register_toolsObject



31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/signalwire/skills/builtin/claude_skills.rb', line 31

def register_tools
  @discovered.map do |skill|
    {
      name: "#{@tool_prefix}#{skill[:safe_name]}",
      description: @descriptions[skill[:name]] || "Execute Claude skill: #{skill[:name]}",
      parameters: {
        'arguments' => { 'type' => 'string', 'description' => 'Arguments for the skill' }
      },
      handler: lambda { |args, _raw_data|
        Swaig::FunctionResult.new("Skill #{skill[:name]} instructions:\n\n#{skill[:content]}")
      }
    }
  end
end

#setupObject



15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/signalwire/skills/builtin/claude_skills.rb', line 15

def setup
  @skills_path  = get_param('skills_path')
  @tool_prefix  = get_param('tool_prefix', default: 'claude_')
  @include      = get_param('include')  # glob patterns
  @exclude      = get_param('exclude')  # glob patterns
  @descriptions = get_param('skill_descriptions') || {}

  return false unless @skills_path && !@skills_path.empty?
  return false unless File.directory?(@skills_path)

  @discovered = discover_skills
  true
end

#supports_multiple_instances?Boolean

Returns:

  • (Boolean)


13
# File 'lib/signalwire/skills/builtin/claude_skills.rb', line 13

def supports_multiple_instances?; true; end