Class: Legion::CLI::Skill

Inherits:
Thor
  • Object
show all
Defined in:
lib/legion/cli/skill_command.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.exit_on_failure?Boolean

Returns:

  • (Boolean)


11
12
13
# File 'lib/legion/cli/skill_command.rb', line 11

def self.exit_on_failure?
  true
end

Instance Method Details

#create(name) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/legion/cli/skill_command.rb', line 52

def create(name)
  require 'fileutils'
  dir = '.legion/skills'
  FileUtils.mkdir_p(dir)
  path = ::File.join(dir, "#{name}.md")

  if ::File.exist?(path)
    say "Skill already exists: #{path}", :red
    return
  end

  content = <<~SKILL
    ---
    name: #{name}
    namespace: local
    description: Describe what this skill does
    trigger: on_demand
    ---

    You are a helpful assistant. Describe the skill's behavior here.
  SKILL

  ::File.write(path, content)
  say "Created: #{path}", :green
end

#listObject



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/legion/cli/skill_command.rb', line 16

def list
  response = daemon_get('/api/skills')
  unless response.is_a?(::Net::HTTPSuccess)
    say "Error fetching skills: #{response.code}", :red
    exit 1
  end

  skills = ::JSON.parse(response.body, symbolize_names: true)[:data] || []
  if skills.empty?
    say 'No skills registered. Start the daemon with legion-llm loaded.'
    return
  end

  skills.each do |s|
    say "  #{s[:namespace]}:#{s[:name]}  [#{s[:trigger]}]  #{s[:description]}", :green
  end
end

#run_skill(name) ⇒ Object



80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/legion/cli/skill_command.rb', line 80

def run_skill(name)
  url     = "#{daemon_base_url}/api/skills/invoke"
  payload = { skill_name: name }.to_json

  response = ::Net::HTTP.post(
    ::URI.parse(url),
    payload,
    'Content-Type' => 'application/json'
  )

  if response.is_a?(::Net::HTTPSuccess)
    result = ::JSON.parse(response.body, symbolize_names: true)
    say result.dig(:data, :content).to_s
  else
    say "Error: #{response.code} #{response.body}", :red
    exit 1
  end
end

#show(name) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/legion/cli/skill_command.rb', line 35

def show(name)
  ns, nm = name.include?(':') ? name.split(':', 2) : ['default', name]
  response = daemon_get("/api/skills/#{ns}/#{nm}")
  unless response.is_a?(::Net::HTTPSuccess)
    say "Skill '#{name}' not found", :red
    exit 1
  end

  result = ::JSON.parse(response.body, symbolize_names: true)
  data   = result[:data] || {}
  say "Name:        #{data[:namespace]}:#{data[:name]}", :green
  say "Description: #{data[:description]}"
  say "Trigger:     #{data[:trigger]}"
  say "Steps:       #{Array(data[:steps]).join(', ')}"
end