Skip to content
Kward Search API index

Module: Kward::ConfigFiles::Extensions

Extended by:
Extensions
Included in:
Kward::ConfigFiles, Extensions
Defined in:
lib/kward/config/extensions.rb

Instance Method Summary collapse

Instance Method Details

#emit_warning(message, warning_sink: nil) ⇒ Object



84
85
86
87
# File 'lib/kward/config/extensions.rb', line 84

def emit_warning(message, warning_sink: nil)
  sink = warning_sink || @warning_sink
  sink ? sink.call(message) : warn(message)
end

#inside_directory?(path, base) ⇒ Boolean

Returns:

  • (Boolean)


89
90
91
# File 'lib/kward/config/extensions.rb', line 89

def inside_directory?(path, base)
  PathGuard.inside?(path, base)
end

#plugin_dir ⇒ String

Returns trusted user plugin directory.

Returns:

  • (String) —

    trusted user plugin directory



21
22
23
# File 'lib/kward/config/extensions.rb', line 21

def plugin_dir
  File.expand_path("~/.kward/plugins")
end

#plugin_paths(warning_sink: nil) ⇒ Array<String>

Finds trusted plugin files and package entrypoints.

Plugins are intentionally loaded only from ~/.kward/plugins, not from a workspace or custom KWARD_CONFIG_PATH directory.

Returns:

  • (Array<String>) —

    sorted plugin file paths



31
32
33
34
35
36
37
38
39
40
41
# File 'lib/kward/config/extensions.rb', line 31

def plugin_paths(warning_sink: nil)
  plugins_root = plugin_dir
  return [] unless Dir.exist?(plugins_root)

  paths = Dir.glob(File.join(plugins_root, "*.rb"))
  paths.concat(Dir.glob(File.join(plugins_root, "*", "plugin.rb")))
  paths.sort
rescue StandardError => e
  emit_warning("Warning: skipping Kward plugins in #{plugins_root}: #{e.message}", warning_sink: warning_sink)
  []
end

#presence(value) ⇒ Object



93
94
95
96
# File 'lib/kward/config/extensions.rb', line 93

def presence(value)
  text = value.to_s
  text.empty? ? nil : text
end

#project_skill_candidates(workspace_root: Dir.pwd, warning_sink: nil) ⇒ Object



14
15
16
17
18
# File 'lib/kward/config/extensions.rb', line 14

def project_skill_candidates(workspace_root: Dir.pwd, warning_sink: nil)
  return [] if ignore_local_instructions?

  skills_registry(workspace_root: workspace_root, warning_sink: warning_sink).project_skill_candidates
end

#prompt_template_registry ⇒ Object



75
76
77
78
79
80
81
82
# File 'lib/kward/config/extensions.rb', line 75

def prompt_template_registry
  ::Kward::Prompts::Templates.new(
    config_dir: config_dir,
    template_class: PromptTemplate,
    markdown_parser: ->(path) { Frontmatter.markdown_parts(path) },
    warning_sink: @warning_sink
  )
end

#prompt_templates(reserved_commands: []) ⇒ Array<PromptTemplate>

Lists prompt templates exposed as slash commands.

Parameters:

  • reserved_commands (Array<String>) (defaults to: []) —

    command names unavailable to templates

Returns:



47
48
49
# File 'lib/kward/config/extensions.rb', line 47

def prompt_templates(reserved_commands: [])
  prompt_template_registry.prompt_templates(reserved_commands: reserved_commands)
end

#read_skill_file(name, relative_path = nil, workspace_root: Dir.pwd) ⇒ String

Reads a skill file by skill name and optional relative path.

Parameters:

  • name (String) —

    configured skill name

  • relative_path (String, nil) (defaults to: nil) —

    path inside the skill directory

Returns:

  • (String) —

    file contents or an error string



56
57
58
# File 'lib/kward/config/extensions.rb', line 56

def read_skill_file(name, relative_path = nil, workspace_root: Dir.pwd)
  skills_registry(workspace_root: workspace_root).read_skill_file(name, relative_path)
end

#skills(workspace_root: Dir.pwd, warning_sink: nil, project_skill_paths: nil) ⇒ Array<Skill>

Lists configured skills discovered under the config directory.

Returns:

  • (Array<Skill>) —

    skill metadata available to the model



10
11
12
# File 'lib/kward/config/extensions.rb', line 10

def skills(workspace_root: Dir.pwd, warning_sink: nil, project_skill_paths: nil)
  skills_registry(workspace_root: workspace_root, warning_sink: warning_sink, project_skill_paths: project_skill_paths).skills
end

#skills_registry(workspace_root: Dir.pwd, warning_sink: nil, project_skill_paths: nil) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/kward/config/extensions.rb', line 60

def skills_registry(workspace_root: Dir.pwd, warning_sink: nil, project_skill_paths: nil)
  project_skill_paths = [] if ignore_local_instructions?
  Skills::Registry.new(
    config_dir: config_dir,
    workspace_root: workspace_root,
    project_skills_trusted: project_skills_trusted?,
    skill_class: Skill,
    max_file_bytes: MAX_SKILL_FILE_BYTES,
    markdown_parser: ->(path) { Frontmatter.markdown_parts(path, lenient: true) },
    inside_directory: method(:inside_directory?),
    warning_sink: warning_sink || @warning_sink,
    project_skill_paths: project_skill_paths
  )
end