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



81
82
83
84
# File 'lib/kward/config/extensions.rb', line 81

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)


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

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

#plugin_dirString

Returns trusted user plugin directory.

Returns:

  • (String)

    trusted user plugin directory



19
20
21
# File 'lib/kward/config/extensions.rb', line 19

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



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

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



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

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
# File 'lib/kward/config/extensions.rb', line 14

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

#prompt_template_registryObject



72
73
74
75
76
77
78
79
# File 'lib/kward/config/extensions.rb', line 72

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:



45
46
47
# File 'lib/kward/config/extensions.rb', line 45

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



54
55
56
# File 'lib/kward/config/extensions.rb', line 54

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



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

def skills_registry(workspace_root: Dir.pwd, warning_sink: nil, project_skill_paths: nil)
  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